如何列出所有启用FAST选项的索引与查询?以及如何查询指定索引对应的启用FAST选项的查询?
关于启用FAST选项的索引和查询的解决方案
嘿,我来帮你搞定这个问题!下面分两部分给你具体的操作方法:
一、列出所有启用FAST选项的索引和查询
1. 找出所有带FAST查询提示的语句
如果你的“FAST选项”指的是查询中使用了OPTION (FAST n)这类提示,那可以通过扫描SQL Server的计划缓存来找到它们。用下面的查询就行:
SELECT dest.text AS QueryText, deqs.execution_count AS ExecutionCount, deqs.total_elapsed_time AS TotalElapsedTime FROM sys.dm_exec_query_stats deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) dest WHERE dest.text LIKE '%OPTION (FAST%' OR dest.text LIKE '%OPTION(FAST%' ORDER BY deqs.execution_count DESC;
这里会返回所有包含FAST提示的查询,还能看到执行次数和总耗时,方便你优先关注高频执行的语句。
2. 关联FAST_FORWARD游标对应的索引
如果是和FAST_FORWARD游标相关的索引(这类游标常用来快速读取数据),可以通过系统视图关联游标和索引信息:
SELECT OBJECT_NAME(s.object_id) AS TableName, i.name AS IndexName, i.type_desc AS IndexType FROM sys.indexes i JOIN sys.objects s ON i.object_id = s.object_id WHERE i.is_hypothetical = 0 AND EXISTS ( SELECT 1 FROM sys.dm_exec_cursors(0) c WHERE c.cursor_properties LIKE '%FAST_FORWARD%' AND c.object_id = s.object_id );
这个查询会找出当前正在使用的FAST_FORWARD游标关联的索引。
二、查找特定索引对应的启用FAST选项的查询
方法1:模糊匹配索引名称
先把下面查询里的*YourIndexName*替换成你要找的索引名,执行后就能得到使用该索引且带FAST提示的查询:
DECLARE @TargetIndexName NVARCHAR(128) = 'YourIndexName'; -- 替换为目标索引名 SELECT dest.text AS QueryText, deqs.execution_count AS ExecutionCount, deqp.query_plan AS QueryPlan FROM sys.dm_exec_query_stats deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) dest CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) deqp WHERE dest.text LIKE '%OPTION (FAST%' OR dest.text LIKE '%OPTION(FAST%' AND deqp.query_plan LIKE '%' + @TargetIndexName + '%' ORDER BY deqs.execution_count DESC;
如果你的数据库里有重名的索引,这个方法可能会有干扰,那可以用下面更精确的方式。
方法2:通过索引ID精确匹配
这个方法先获取目标索引的ID,再通过查询计划的XML来精确匹配,避免名称重复的问题:
DECLARE @TargetIndexName NVARCHAR(128) = 'YourIndexName'; -- 替换为目标索引名 DECLARE @TargetIndexID INT, @TargetObjectID INT; -- 获取目标索引的ID和所属表的ID SELECT @TargetObjectID = object_id, @TargetIndexID = index_id FROM sys.indexes WHERE name = @TargetIndexName; -- 查找使用该索引且带FAST提示的查询 SELECT dest.text AS QueryText, deqs.execution_count AS ExecutionCount FROM sys.dm_exec_query_stats deqs CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) dest CROSS APPLY sys.dm_exec_query_plan(deqs.plan_handle) deqp WHERE dest.text LIKE '%OPTION (FAST%' OR dest.text LIKE '%OPTION(FAST%' AND EXISTS ( SELECT 1 FROM deqp.query_plan.nodes('//IndexScan') AS IndexScan(scan) WHERE scan.value('@Index', 'INT') = @TargetIndexID AND scan.value('@Object', 'INT') = @TargetObjectID );
内容的提问来源于stack exchange,提问作者Amzad Hossain
相关产品推荐
相关产品推荐

