节86.1:在数据库上启用查询存储
使用以下命令可在数据库上启用查询存储:
sql
ALTER DATABASE tpch SET QUERY_STORE = ON;
启用后,SQL Server / Azure SQL 数据库会收集已执行查询的信息,并通过以下系统视图提供数据:
- sys.query_store_query
- sys.query_store_query_text
- sys.query_store_plan
- sys.query_store_runtime_stats
- sys.query_store_runtime_stats_interval
- sys.database_query_store_options
- sys.query_context_settings
节86.2:获取 SQL 查询/计划的执行统计
以下查询返回查询、计划及其平均持续时间、CPU 时间、物理与逻辑 I/O 的统计信息:
sql
SELECT
Txt.query_text_id,
Txt.query_sql_text,
Pl.plan_id,
rs.avg_duration,
rs.avg_cpu_time,
rs.avg_physical_io_reads,
rs.avg_logical_io_reads
FROM sys.query_store_plan AS Pl
JOIN sys.query_store_query AS Qry
ON Pl.query_id = Qry.query_id
JOIN sys.query_store_query_text AS Txt
ON Qry.query_text_id = Txt.query_text_id
JOIN sys.query_store_runtime_stats AS rs
ON Pl.plan_id = rs.plan_id;
节86.3:从查询存储中删除数据
如需删除特定查询或计划,可使用以下命令:
sql
EXEC sp_query_store_remove_query 4; -- 删除查询 ID 为 4 的查询
EXEC sp_query_store_remove_plan 3; -- 删除计划 ID 为 3 的计划
若只想清除某计划的执行统计而保留计划本身:
sql
EXEC sp_query_store_reset_exec_stats 3; -- 重置计划 3 的运行时统计
节86.4:为查询强制计划
当发现某计划表现最优时,可强制优化器始终使用该计划:
sql
EXEC sp_query_store_force_plan @query_id, @plan_id;
此后,优化器将为该查询固定使用指定计划。
如需取消强制,执行:
sql
EXEC sp_query_store_unforce_plan @query_id, @plan_id;