一、查詢最近執行的SQL語句
查詢最近執行的SQL語句可以通過系統視圖sys.dm_exec_query_stats來實現,該視圖存儲了SQL Server最近執行的查詢信息,包括SQL語句、執行次數、消耗的CPU時間和I/O等。以下是一個查詢最近執行的SQL語句的代碼示例:
SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS query, qs.execution_count, qs.total_worker_time/1000000 AS total_cpu_time_sec, qs.total_elapsed_time/1000000 AS total_elapsed_time_sec, qs.total_logical_reads, qs.total_physical_reads, qs.creation_time, ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname, qt.objectid, qt.dbid FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt ORDER BY qs.total_worker_time DESC;
執行以上代碼可以獲取到最近執行的10條SQL語句,包含SQL語句文本、執行次數、CPU時間、耗時、邏輯讀取次數、物理讀取次數、創建時間、數據庫名稱、對象ID和數據庫ID等信息。
二、查詢最耗費CPU時間的SQL語句
查詢最耗費CPU時間的SQL語句可以通過sys.dm_exec_query_stats視圖中的total_worker_time來實現。以下是一個查詢最耗費CPU時間的SQL語句的代碼示例:
SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS query, qs.execution_count, qs.total_worker_time/1000000 AS total_cpu_time_sec, ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt ORDER BY qs.total_worker_time DESC;
執行以上代碼可以獲取最耗費CPU時間的10條SQL語句。以上代碼中的total_worker_time/1000000是因為sys.dm_exec_query_stats視圖中的total_worker_time是以微秒為單位的。查詢結果包含SQL語句、執行次數、CPU時間和數據庫名稱。
三、查詢最慢的SQL語句
查詢最慢的SQL語句可以通過sys.dm_exec_query_stats視圖中的total_elapsed_time來實現。以下是一個查詢最慢的SQL語句的代碼示例:
SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS query, qs.execution_count, qs.total_elapsed_time/1000000 AS total_elapsed_time_sec, ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt ORDER BY qs.total_elapsed_time DESC;
執行以上代碼可以獲取最慢的10條SQL語句。以上代碼中的total_elapsed_time/1000000是因為sys.dm_exec_query_stats視圖中的total_elapsed_time是以微秒為單位的。查詢結果包含SQL語句、執行次數、耗時和數據庫名稱。
四、查詢最頻繁被執行的SQL語句
查詢最頻繁被執行的SQL語句可以通過sys.dm_exec_query_stats視圖中的execution_count來實現。以下是一個查詢最頻繁被執行的SQL語句的代碼示例:
SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS query, qs.execution_count, qs.total_worker_time/qs.execution_count/1000000 AS avg_cpu_time_sec_per_exec, qs.total_elapsed_time/qs.execution_count/1000000 AS avg_elapsed_time_sec_per_exec, qs.total_logical_reads/qs.execution_count AS avg_logical_reads_per_exec, qs.total_physical_reads/qs.execution_count AS avg_physical_reads_per_exec, ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt ORDER BY qs.execution_count DESC;
執行以上代碼可以獲取最頻繁被執行的10條SQL語句。以上代碼中的total_worker_time/qs.execution_count/1000000和total_elapsed_time/qs.execution_count/1000000是因為需要計算每次執行的平均CPU時間和平均耗時。查詢結果包含SQL語句、執行次數、平均CPU時間、平均耗時、平均邏輯讀取次數、平均物理讀取次數和數據庫名稱等信息。
五、查詢最佔用內存的SQL語句
查詢最佔用內存的SQL語句可以通過sys.dm_exec_query_stats視圖中的total_logical_reads和total_physical_reads來實現。以下是一個查詢最佔用內存的SQL語句的代碼示例:
SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(qt.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2)+1) AS query, qs.execution_count, qs.total_logical_reads, qs.total_physical_reads, ISNULL(DB_NAME(qt.dbid), 'Resource') AS dbname FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt ORDER BY (qs.total_logical_reads + qs.total_physical_reads) DESC;
執行以上代碼可以獲取最佔用內存的10條SQL語句。查詢結果包含SQL語句、執行次數、邏輯讀取次數、物理讀取次數和數據庫名稱。
六、結語
通過以上方法可以查詢出SQL Server最近執行的SQL語句,並通過不同的維度進行排列和分析,有助於發現性能瓶頸和優化SQL Server的性能。
原創文章,作者:XTTOG,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/315769.html