zoukankan      html  css  js  c++  java
  • 关于TSQL性能调优

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

  • 相关阅读:
    基于MySQL提供的Yum repository安装MySQL5.6
    CentOS中无法使用setup命令 -bash:setup: command not found
    jdk8新特性-亮瞎眼的lambda表达式
    Git branch 分支与合并分支
    (转)Hashtable与ConcurrentHashMap区别
    java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition的解决方案
    一些面试问题以及一些解法
    ipython的使用
    复习点算法知识,水仙花数加冒泡排序,以及一道算法题
    一些部署django用到的linux命令
  • 原文地址:https://www.cnblogs.com/streetpasser/p/2837358.html
Copyright © 2011-2022 走看看