当前位置:首页 » 编程语言 » sqlserver查询速度

sqlserver查询速度

发布时间: 2024-07-14 05:45:00

sqlserver数据库很大,建立分表能否提升查询速度

如果有时间字段,建议做分区表,按时间分区,这样表从物理上是分开的,但是对外还是一张表.
好处有1.原本的代码结构不用变2.查询历史数据的时候,速度仍然有保障3.如果建立触发器进行自动分区,理论上不管再用多少年,都不会再需要重新建表a2了

② 如何提高SQL Server大数据条件下的查询速度

1.关于索引优化
建索引的选择必须结合SQL查询、修改、删除语句的需要,一般的说法是在WHERE里经常出现的字段建索引。如果在WHERE经常是几个字段一起出现而且是用AND连接的,那就应该建这几个字段一起的联合索引,而且次序也需要考虑,一般是最常出现的放前面,重复率低的放前面。
SQL
Server提供了一种简化并自动维护数据库的工具。这个称之为数据库维护计划向导(Database
Maintenance
Plan
Wizard
,DMPW)的工具也包括了对索引的优化。如果你运行这个向导,你会看到关于数据库中关于索引的统计量,这些统计量作为日志工作并定时更新,这样就减轻了手工重建索引或者DBCC
INDEXDEFRAG所带来的工作量。如果你不想自动定期刷新索引统计量,你还可以在DMPW中选择重新组织数据和数据页,这将停止旧有索引并按特定的填充因子重建索引。
2.
改善硬件(双CPU,Raid
5,增加内存)
tempdb这个临时数据库,它对性能的影响较大。tempdb和其他数据库一样可以增大,可以缩小。当数据文件需要增长的时候,通常不能保持剩余部分的连续性。这时文件就会产生碎片,这种碎片会造成性能下降。这种碎片属于外来性碎片。要阻止在tempdb中产生外来性碎片,必须保证有足够的硬盘空间。一般将tempdb的容量放到平均使用容量。而你也应该允许tempdb自动增长,比如你有个一个超大的join操作,它建立了一个超过tempdb容量的时候,该查询将失败。你还要设置一个合理的单位增长量。因为如果你设得太小,将会产生许多外来性碎片,反而会占用更多资源。sqlserver调优最有效的做法之一,就是把争夺资源的操作独立出去。tempdb就是一个需要独立出去的部分而tempdb和其他系统库一样是公用的,是存取最可能频繁的库,所有处理临时表、子查询、GROUP
BY、排序、DISTINCT、连接等等。它最适合放到一个具有快速读写能力的设备上。比如RAID0卷或RAID0+1卷上。
查询语句一定要使用存储过程;
3、查询尽量使用TOP子句
4.将表按一定的约束分成子表,(如按分类)创建约束,在用Like
时,先用分类
and
like
,
应该可能解决问题.
而且效果立秆见影!(你要确定SQL会认识你建的分区视图).我一个表有上百万的记录(700兆),用分区视图后,查询速度基本跟10万行一样.
如果还是太慢,还可以考滤分布式分区视图!这总可以解决问题了吧!
关键在于你能否把大表按某种约束分解成子表.

③ SQL数据库容量大,查询速度慢,有何解决方案

首先应该确定是谁慢的,往往是程序处理方面的问题而不是数据库的问题。
程序方面应该尽可能的减少数据查询返回的内容,比如可以查询返回ID,然后再根据ID一条一条的查询具体内容,看似慢了,在数据量达的时候快很多

对于数据可以参照下面几点
1、优化SQL语句,SQL语句对查询速度影响最大
2、对于经常查询的字段作索引。但是这样会增加修改时的压力
4、优化SQLServer,比如给其分配固定的内存,预先分配查询内存,调整CPU使用率等。
5、优化硬件资源,比如使用更高的服务器或者硬盘,独立安排数据库的数据文件和索引文件,将数据文件分布于不同的物理硬盘上等等
6、考虑使用分布数据库或者对大表进行拆分

另外,2G的数据库应该不算很大了,我处理过18G的数据库,8000万条记录,查询速度可以被接受

④ 如何优化sqlserver 数据库性能优化

SQL Server数据库查询速度慢的原因有很多,常见的有以下几种:
1、没有索引或者没有用到索引(这是查询慢最常见的问题,是数据库设计的缺陷)
2、I/O吞吐量小,形成了瓶颈效应。
3、没有创建计算列导致查询不优化。
4、内存不足
5、网络速度慢
6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)
7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷)
8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。
9、返回了不必要的行和列
10、查询语句不好,没有优化

⑤ sqlserver,表已添加索引,是否仍会随着数据量不断不断增大而查询越来越慢

无论哪一种数据库,只要数据量不断增大都会逐渐变慢,有时候数据到一个量级

速度会断壁式下跌。

一般是直接从表查询快。已经是索引列了。但是第一个查询如果数据不存在还是要遍历其他的表。这样速度就大打折扣了。

如果能保证数据一定在指定表中就是第一个快了。

大体分为如下几种情况会逆袭:

1、这个就是数据不存在,如果挨个遍历表,速度可能不如使用视图。

2、使用索引视图技术,这个跟使用表查询速度相差不大。

3、sqlserver是高级版本,可以发挥多CPU优势,这个时候速度也相差不大。

4、索引碎片过多集中在的某三四个表以上,这时候性能都比较沮丧。


看如上,因为我这个是32核CPU,多并行几个时间只是略多一点,如果单表查询,那么执行计划就是一个分支。

⑥ 请问sqlserver mysql oracle各有什么优缺点它们一张表最多能容纳多少条记录速度谁最快价格如何呢

sqlserver 使用简单,界面友好, 而且单从数据处理速度上看,Sqlserver最快,要高于Mysql 和 oracle 的,
个人做过测试, 千万级的表,在不做索引的情况下, sqlserver2005 检查起来不会很费力,
一般的查检,包括嵌套,搜索时间基本能控制在1分钟内, 而Mysql基本就跑不动, 在建索引的情况下,也不如sqlserver速度快。 而Oracle 似乎也不是很理想,速度也不如Sqlserver, 也许
亿级以上的数据量会比较稳定,但千万级时没有sqlserver 快。
缺点:不开源,不跨平台

Mysql 好处是开源免费,有能力的话可以自己开发与拓民, 这也是现在为什么那么多大企业都用Mysql 的原因之一。
缺点:慢慢慢。

Oracle 的好处大家都知道了, 大型专业数据库平台,很多第三方的支持。

⑦ 如何解决SQL查询速度太慢

1. 执行计划中明明有使用到索引,为什么执行还是这么慢?

2. 执行计划中显示扫描行数为 644,为什么 slow log 中显示 100 多万行?
a. 我们先看执行计划,选择的索引 “INDX_BIOM_ELOCK_TASK3(TASK_ID)”。结合 sql 来看,因为有 "ORDER BY TASK_ID DESC" 子句,排序通常很慢,如果使用了文件排序性能会更差,优化器选择这个索引避免了排序。
那为什么不选 possible_keys:INDX_BIOM_ELOCK_TASK 呢?原因也很简单,TASK_DATE 字段区分度太低了,走这个索引需要扫描的行数很大,而且还要进行额外的排序,优化器综合判断代价更大,所以就不选这个索引了。不过如果我们强制选择这个索引(用 force index 语法),会看到 SQL 执行速度更快少于 10s,那是因为优化器基于代价的原则并不等价于执行速度的快慢;
b. 再看执行计划中的 type:index,"index" 代表 “全索引扫描”,其实和全表扫描差不多,只是扫描的时候是按照索引次序进行而不是行,主要优点就是避免了排序,但是开销仍然非常大。
Extra:Using where 也意味着扫描完索引后还需要回表进行筛选。一般来说,得保证 type 至少达到 range 级别,最好能达到 ref。
在第 2 点中提到的“慢日志记录Rows_examined: 1161559,看起来是全表扫描”,这里更正为“全索引扫描”,扫描行数确实等于表的行数;
c. 关于执行计划中:“rows:644”,其实这个只是估算值,并不准确,我们分析慢 SQL 时判断准确的扫描行数应该以 slow log 中的 Rows_examined 为准。
4. 优化建议:添加组合索引 IDX_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID)

优化过程:
TASK_DATE 字段存在索引,但是选择度很低,优化器不会走这个索引,建议后续可以删除这个索引:
select count(*),count(distinct TASK_DATE) from T_BIOMA_ELOCK_TASK;+------------+---------------------------+| count(*) | count(distinct TASK_DATE) |+------------+---------------------------+| 1161559 | 223 |+------------+---------------------------+

在这个 sql 中 REL_DEVID 字段从命名上看选择度较高,通过下面 sql 来检验确实如此:
select count(*),count(distinct REL_DEVID) from T_BIOMA_ELOCK_TASK;+----------+---------------------------+| count(*) | count(distinct REL_DEVID) |+----------+---------------------------+| 1161559 | 62235 |+----------+---------------------------+

由于有排序,所以得把 task_id 也加入到新建的索引中,REL_DEVID,task_id 组合选择度 100%:
select count(*),count(distinct REL_DEVID,task_id) from T_BIOMA_ELOCK_TASK;+----------+-----------------------------------+| count(*) | count(distinct REL_DEVID,task_id) |+----------+-----------------------------------+| 1161559 | 1161559 |+----------+-----------------------------------+

在测试环境添加 REL_DEVID,TASK_ID 组合索引,测试 sql 性能:alter table T_BIOMA_ELOCK_TASK add index idx_REL_DEVID_TASK_ID(REL_DEVID,TASK_ID);
添加索引后执行计划:
这里还要注意一点“隐式转换”:REL_DEVID 字段数据类型为 varchar,需要在 sql 中加引号:AND T.REL_DEVID = 000000025xxx >> AND T.REL_DEVID = '000000025xxx'

执行时间从 10s+ 降到 毫秒级别:
1 row in set (0.00 sec)
结论
一个典型的 order by 查询的优化,添加更合适的索引可以避免性能问题:执行计划使用索引并不意味着就能执行快。

热点内容
猫咪国外访问 发布:2024-11-26 09:32:05 浏览:617
威立信监控原始密码是多少 发布:2024-11-26 09:24:06 浏览:488
超凡先锋选择不了服务器该怎么办 发布:2024-11-26 09:15:56 浏览:337
搭建ff服务器喝茶 发布:2024-11-26 09:10:09 浏览:846
乐山云服务器公司 发布:2024-11-26 08:59:44 浏览:954
ftp工具可以上传吗 发布:2024-11-26 08:55:04 浏览:570
压缩量密封 发布:2024-11-26 08:52:10 浏览:582
java把一个list 发布:2024-11-26 08:38:38 浏览:586
混沌珠算法 发布:2024-11-26 08:29:17 浏览:164
阿里云解析不到服务器 发布:2024-11-26 07:57:59 浏览:493