使用动态管理视图(DMVs)来检测SQL执行计划的突变,你需要关注那些能够提供查询执行统计和计划信息的视图。以下是一些可以用于此目的的DMVs以及相应的查询示例:
SELECT sql_handle, statement_start_offset, statement_end_offset, creation_time, last_execution_time, execution_count, total_worker_time, total_elapsed_time FROM sys.dm_exec_query_stats ORDER BY total_worker_time DESC;
sys.dm_exec_query_stats
使用,可以获取与sql_handle
对应的SQL文本。SELECT qs.sql_handle, st.text FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st;
SELECT cacheobjtype, usecounts, cacheobjtype, objtype, size_in_bytes, creation_time, last_use_time FROM sys.dm_exec_cached_plans ORDER BY usecounts DESC;
sys.dm_exec_sql_text
结合使用,可以获取特定查询的执行计划。SELECT qp.query_plan, st.text FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) AS qp CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) AS st;
要检测执行计划的突变,可以定期运行上述查询,并将结果存储在表中,或者与之前的结果进行比较。
例如,可以比较两个不同时间点的total_worker_time
或total_elapsed_time
,以查看是否有显著变化,这可能表明执行计划已经改变。
由于sys.dm_exec_query_stats
中的信息可能会被SQL Server周期性地重置,因此最好的做法是将这些信息记录到一个持久化表中,这样可以基于历史数据来检测突变。
此外,执行计划的突变可能需要结合多个DMVs的信息来综合判断。