SQL Server查询优化方案概括


下面暂从硬件、SQL优化、SQL Server软件设置、数据压缩四个方面进行概括:
一、硬件调优
硬件类型划分:内存、CPU、硬盘、网络
通过SQL Server的“活动监视器”-“最近耗费大量资源的查询”功能,通过对CPU耗时和执行次数排序,
这里假设所有语句的并发数与执行时长均合理,以此判定CPU是否满足生产需求;

抛开内存表,只看传统表在任务执行时内存和硬盘的互相读写情况,
我们可以通过windows自带的“性能监视器”——“数据收集器集”功能,甄别内存和硬盘是否需要升级;

再看网络:目前企业内部均使用千兆口,若数据库需提供互联业务,此时便需要将公网上下线带宽考虑进来。


二、SQL代码的调优
1.避免where子句使用!=和<>操作符,导致放弃使用索引而进行全表扫描;
2.避免where子句使用or连接条件,导致放弃使用索引,可改用union all
3.使用like模糊查询也将导致全表扫描;
4.in和not in也需要慎用,同样会导致全表扫描,如:select id From a where num in('a','b','c')
----能用between就不要用in
5.避免where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而全表扫描;
6.select id from t where num/2=10, 应该改为select id from t where num=20
7.避免在where子句中对字段进行函数操作,这将导致全表扫描;
8.根据“From面积”善用多表连接查询、嵌套子查询、相关子查询;
9.distinct关键字,将直接导致查询降速;
10.判断表中是否存在数据,善于从多种选择中挑选性能消耗低的语句
select count(*) from product
select top(1) id from product order by id desc

三、软件调优
1.条件允许的情况下,可选择搭建SQL Server AlwaysOn可用性组实现读写分离;
可参考:https://www.cnblogs.com/jenrrychen/p/5471332.html

2.存储拆分(分表+分磁盘)
例如:
一个表对应一个文件组,一个文件组对应多个文件;
一个表拆分成多个分区表(根据分区方案与分区函数,例按每100万条记录、或按记录创建时间设置分区规则),
最终实现一个表对应多个分区表,一个分区表对应一个文件组,一个文件组可以对应多个文件,我们可以将频繁读写的文件组存储在高性能磁盘上,对存档的文件组还可以设置为只读。


四、数据压缩
1.条件允许的情况下,定期合理清理数据库日志;
2.使用dbcc showcontig(tablename) 可直观的查阅表的 “平均页密度”,经常执行删除操作的表平均页密度越低。
行压缩
--所有数字类型(INT、NUMERICA等)和基于数字类型(DATETIME)将会转换成可变长度值;
--CHAR和NCHAR会转换成可变长度存储;
页压缩
--前缀压缩:前缀为aabbcc,对应值aabbccdd则替换为6dd;
--字典压缩:搜索页面上任意位置的重复值,不局限于一列;

行压缩:ALTER TABLE TestCompression REBUILD WITH (DATA_COMPRESSION=ROW)
页压缩:ALTER TABLE TestCompression REBUILD WITH (DATA_COMPRESSION=PAGE)


如果有大量重复值或重复前缀,建议使用字典前缀表;
经常执行删除操作的表容易造成页密度调整,增加from面积,建议定期执行数据压缩,然后执行索引重建。

原文地址:https://www.cnblogs.com/an-baobao/p/12362717.html