You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何列出所有启用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 07:27:40