Sql-Server
如何根據時間在 SQL Server 中獲取歷史查詢
請問如何獲取在 SQL Server 2016 中特定時間執行的查詢?類似於 Oracle 中的 AWR 報告?我們需要知道過去 48 小時內特定時間發生了什麼。
我會很感激一些指導和文件。
謝謝你。
您可以查看動態管理視圖以獲取目前記憶體中查詢的查詢指標聚合。但是,它只是一個聚合,而不是特定的查詢執行。此外,如果查詢不再在記憶體中,那麼它就消失了。您可以查看上次執行時間,以查看查詢是否存在。但是,假設它在過去 48 小時內被呼叫了 3 次,您不會知道第二個呼叫是什麼,只知道最後一個 (last_execution_time) 和第一個 (creation_time)。
如果您已經設置了獲取查詢結果的機制,例如擴展事件,則只能獲取此資訊。
但是,另一種可能性是,如果它是一個導致阻塞超過 30 秒的查詢,它可能是在system_health擴展事件會話中。這確實取決於您的系統在出現錯誤時的活躍程度以及那些文件確實會翻轉,有時會頻繁翻轉。
查詢儲存以每小時粒度跟踪歷史查詢,例如:
如果問題發生在過去並且您想要進行根本原因分析,請使用查詢儲存。具有數據庫訪問權限的使用者可以使用 T-SQL 查詢 Query Store 數據。查詢儲存預設配置使用 1 小時的粒度。使用以下查詢查看高 CPU 消耗查詢的活動。
WITH AggregatedCPU AS (SELECT q.query_hash, SUM(count_executions * avg_cpu_time / 1000.0) AS total_cpu_millisec, SUM(count_executions * avg_cpu_time / 1000.0)/ SUM(count_executions) AS avg_cpu_millisec, MAX(rs.max_cpu_time / 1000.00) AS max_cpu_millisec, MAX(max_logical_io_reads) max_logical_reads, COUNT(DISTINCT p.plan_id) AS number_of_distinct_plans, COUNT(DISTINCT p.query_id) AS number_of_distinct_query_ids, SUM(CASE WHEN rs.execution_type_desc='Aborted' THEN count_executions ELSE 0 END) AS Aborted_Execution_Count, SUM(CASE WHEN rs.execution_type_desc='Regular' THEN count_executions ELSE 0 END) AS Regular_Execution_Count, SUM(CASE WHEN rs.execution_type_desc='Exception' THEN count_executions ELSE 0 END) AS Exception_Execution_Count, SUM(count_executions) AS total_executions, MIN(qt.query_sql_text) AS sampled_query_text FROM sys.query_store_query_text AS qt JOIN sys.query_store_query AS q ON qt.query_text_id=q.query_text_id JOIN sys.query_store_plan AS p ON q.query_id=p.query_id JOIN sys.query_store_runtime_stats AS rs ON rs.plan_id=p.plan_id JOIN sys.query_store_runtime_stats_interval AS rsi ON rsi.runtime_stats_interval_id=rs.runtime_stats_interval_id WHERE rs.execution_type_desc IN ('Regular', 'Aborted', 'Exception')AND rsi.start_time>=DATEADD(HOUR, -2, GETUTCDATE()) GROUP BY q.query_hash), OrderedCPU AS (SELECT query_hash, total_cpu_millisec, avg_cpu_millisec, max_cpu_millisec, max_logical_reads, number_of_distinct_plans, number_of_distinct_query_ids, total_executions, Aborted_Execution_Count, Regular_Execution_Count, Exception_Execution_Count, sampled_query_text, ROW_NUMBER() OVER (ORDER BY total_cpu_millisec DESC, query_hash ASC) AS RN FROM AggregatedCPU) SELECT OD.query_hash, OD.total_cpu_millisec, OD.avg_cpu_millisec, OD.max_cpu_millisec, OD.max_logical_reads, OD.number_of_distinct_plans, OD.number_of_distinct_query_ids, OD.total_executions, OD.Aborted_Execution_Count, OD.Regular_Execution_Count, OD.Exception_Execution_Count, OD.sampled_query_text, OD.RN FROM OrderedCPU AS OD WHERE OD.RN<=15 ORDER BY total_cpu_millisec DESC;