1. 程式人生 > >sql server 性能優化和日常管理維護 筆記

sql server 性能優化和日常管理維護 筆記

sel .text reads where 導入 語句 data offset file

1.將sqlserver Profile收集到的trace 比如 duration >5000ms 的trace 文件 導入到sample 表分析或者用查詢優化器顧問分析

技術分享

2.可以用DMV 動態管理視圖來查詢分析 sqlserver性能,使用情況,比如 查詢最近50條最耗時的sql.

  技術分享


--總耗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;

找出執行時間最長的10條SQL(適用於SQL SERVER 2005及其以上版本)

SELECT TOP 10
( 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‘執行次數‘ ,
creation_time N‘語句編譯時間‘ ,
last_execution_time 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‘執行語句‘ ,
qp.query_plan
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
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 ‘%fetch%‘
ORDER BY total_elapsed_time / execution_count DESC;

sql server 性能優化和日常管理維護 筆記