sqlserver 性能调优脚本

Posted 扶我起来我还要敲

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 性能调优脚本相关的知识,希望对你有一定的参考价值。

-- 查看日志空间占用率
DBCC SQLPERF ( LOGSPACE)

 

SELECT TOP 10

        st.text AS SQL_Full                                        --父级完整语句

        ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,

            ((CASE statement_end_offset 

            WHEN -1 THEN DATALENGTH(st.text)

            ELSE qs.statement_end_offset END 

            - qs.statement_start_offset)/2) + 1) as SQL_Part    --统计对应的部分语句

        , CAST( ((qs.total_elapsed_time / 1000000.0)/qs.execution_count) AS DECIMAL(28,2) ) AS [平均消耗秒数]

        , CAST(qs.last_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最后完成消耗秒数]

        , qs.last_execution_time AS [最后执行时间]

        , CAST(qs.min_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最小消耗秒数]

        , CAST(qs.max_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [最大消耗秒数]

        , CAST(qs.total_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) AS [总消耗秒数]

        , (qs.execution_count) AS [总执行次数]

        , creation_time AS [编译计划的时间]

        , CAST(qs.last_worker_time / 1000000.0 AS DECIMAL(28, 2)) AS [最后完成占用CPU秒数]

        , qp.query_plan

    from sys.dm_exec_query_stats qs

        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st

        CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp

WHERE qs.last_execution_time>DATEADD(n,-30,GETDATE())

ORDER BY qs.last_worker_time DESC

 

--执行最慢的20条SQL语句
SELECT TOP 20 (total_elapsed_time / execution_count) / 1000 N平均时间ms,
       total_elapsed_time / 1000 N总花费时间ms,
       total_worker_time / 1000 N所用的CPU总时间ms,
       total_physical_reads N物理读取总次数,
       total_logical_reads / execution_count N每次逻辑读次数,
       total_logical_reads N逻辑读取总次数,
       total_logical_writes N逻辑写入总次数,
       execution_count N执行次数,
       SUBSTRING(
           st.text,
           (qs.statement_start_offset / 2) + 1,
           (
               (
                   CASE statement_end_offset
                        WHEN -1 THEN DATALENGTH(st.text)
                        ELSE qs.statement_end_offset
                   END
                   - qs.statement_start_offset
               ) / 2
           ) + 1
       ) N执行语句,
       creation_time N语句编译时间,
       last_execution_time         N上次执行时间
FROM   sys.dm_exec_query_stats  AS qs
       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE  SUBSTRING(
           st.text,
           (qs.statement_start_offset / 2) + 1,
           (
               (
                   CASE statement_end_offset
                        WHEN -1 THEN DATALENGTH(st.text)
                        ELSE qs.statement_end_offset
                   END
                   - qs.statement_start_offset
               ) / 2
           ) + 1
       ) NOT LIKE ?tch%
ORDER BY
       total_elapsed_time / execution_count DESC;

 

--总耗CPU最多的前个SQL:
SELECT TOP 20
       total_worker_time / 1000           AS [总消耗CPU 时间(ms)],
       execution_count [运行次数],
       qs.total_worker_time / qs.execution_count / 1000 AS 
       [平均消耗CPU 时间(ms)],
       last_execution_time                AS [最后一次执行时间],
       max_worker_time / 1000             AS [最大执行时间(ms)],
       SUBSTRING(
           qt.text,
           qs.statement_start_offset / 2 + 1,
           (
               CASE 
                    WHEN qs.statement_end_offset = -1 THEN DATALENGTH(qt.text)
                    ELSE qs.statement_end_offset
               END -qs.statement_start_offset
           ) / 2 + 1
       )                                  AS [使用CPU的语法],
       qt.text [完整语法],
       qt.dbid,
       dbname = DB_NAME(qt.dbid),
       qt.objectid,
       OBJECT_NAME(qt.objectid, qt.dbid)     ObjectName
FROM   sys.dm_exec_query_stats qs WITH (NOLOCK)
                                       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS 
       qt
WHERE  execution_count > 1
ORDER BY
       total_worker_time DESC

 

--平均耗CPU最多的前个SQL:
SELECT TOP 20
       total_worker_time / 1000           AS [总消耗CPU 时间(ms)],
       execution_count [运行次数],
       qs.total_worker_time / qs.execution_count / 1000 AS 
       [平均消耗CPU 时间(ms)],
       last_execution_time                AS [最后一次执行时间],
       min_worker_time / 1000             AS [最小执行时间(ms)],
       max_worker_time / 1000             AS [最大执行时间(ms)],
       SUBSTRING(
           qt.text,
           qs.statement_start_offset / 2 + 1,
           (
               CASE 
                    WHEN qs.statement_end_offset = -1 THEN DATALENGTH(qt.text)
                    ELSE qs.statement_end_offset
               END -qs.statement_start_offset
           ) / 2 + 1
       )                                  AS [使用CPU的语法],
       qt.text [完整语法],
       qt.dbid,
       dbname = DB_NAME(qt.dbid),
       qt.objectid,
       OBJECT_NAME(qt.objectid, qt.dbid)     ObjectName
FROM   sys.dm_exec_query_stats qs WITH (NOLOCK)
                                       CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS 
       qt
WHERE  execution_count > 1
ORDER BY
       (qs.total_worker_time / qs.execution_count / 1000) DESC

 

以上是关于sqlserver 性能调优脚本的主要内容,如果未能解决你的问题,请参考以下文章

SQLServer性能调优如何定位和解决

怎样查出SQLServer的性能瓶颈

sql server 性能调优之 CPU消耗最大资源分析1 (自sqlserver服务启动以后)

怎样查出SQLServer的性能瓶颈

sql server 性能调优之 逻辑内存消耗最大资源分析1 (自sqlserver服务启动以后)

sqlserver性能调优常用方法