关于T-SQL性能调优
1. 影响T-SQL性能的因素:
索引
缺少索引
没有使用到最佳索引
聚集索引使用率过低,字段过长或没有聚集索引
索引个数太多
执行计划
SQL SERVER不是每次都能够选择到最优的执行计划,一旦选择到了一个相对较差的执行计划,而且该T-SQL调用又非常的频繁,那很可能瞬间使服务器的负载达到90%以上,甚至100%
数据量
数据量过大影响统计信息,从而影响执行计划
过期的历史数据可能造成无谓的索引检索开销
大数据量查找间接对Memory、IO造成压力,并最终影响到服务器整体的性能
锁
锁定的粒度较大从而降低并发
事务持有时间过长和持有资源过多影响并发
无谓的资源锁定影响并发
不设置LOCK_TIMEOUT从而影响并发
并行查询
max degree of parallelism
编译和重编译
大量的编译(重编译)会严重影响服务器的性能
系统资源(Cpu、Memory、IO、NetWork)
------------------------------------------
2.如何跟踪T-SQL的性能开销
STATISTICS
①分析数据分布
②创建索引调试
③检验优化结果 (前后结果对比)
----------------------------------------------------------------------
验证方法:
SET STATISTICS IO ON
--SQL语句
SET STATISTICS IO OFF
SET STATISTICS Time ON
--SQL语句
SET STATISTICS Time OFF
・打开Execution Plan
(* [degree of parallelism]>1 并行查询计划 (慎用))
----------------------------------------------------------------------
例:语句 select cost1 from salesorders (nolock) where orderid=100001 优化
DMV
SYS.DM_EXEC_REQUESTS
SYS.SYSPROCESSES
SQL Profiler
跟踪
Performance
Performance Dashboard
可视化性能监视
PSSDiag
http://support.microsoft.com/kb/830232
3.常见T-SQL问题点
Where子句中对筛选字段使用函数或计算
Where子句中不恰当的使用Like ‘%??%’
Where子句中不恰当的使用OR (用Union替代)
无谓的SELECT * 操作
事务放在循环的外面
允许脏读的地方没有使用nolock来提高并发
无谓的JOIN关联
大访问量的T-SQL编译成本过高
传入类型(长度)与SQL 字段类型(长度)不一致
不恰当的使用游标 (使用静态游标 或循环)
不恰当的使用公用表表达式CTE (CTE不要写在逻辑判断内部,会引起无法编译,最好按分支单另放在多个SP)
不恰当的使用Row_number()来分页 (where条件最好在CTE上)
ISNULL引起的性能瓶颈 (根据需求,取消ISNULL的判断逻辑)
索引争用问题 (重建非聚集索引)