关于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的判断逻辑)
    索引争用问题          (重建非聚集索引)

posted @ 2012-12-28 15:08  streetpasser  阅读(529)  评论(0编辑  收藏  举报