HEAP表无索引Seek却存在RID Lookup的原因问询
问题解答
为什么HEAP无Seek却产生RID Lookup
当查询用非聚集索引idx_appNumber做Seek时,如果查询需要的列不全在这个非聚集索引的键列或包含列里,SQL Server会通过非聚集索引返回的RID(堆表的行标识符)去堆表读取缺失的列,这个操作就是RID Lookup。
堆表的SeeksCount统计的是直接针对堆表的Seek操作——也就是不通过非聚集索引,直接定位堆中行的情况。而RID Lookup是从非聚集索引延伸过来的读取操作,不属于堆表的Seek范畴,所以堆表的SeeksCount为0,只会累计LookupsCount,且次数和非聚集索引的Seek次数完全匹配(每次Seek后都需要做一次Lookup补全列)。
为什么sys.dm_db_index_usage_stats查不到触发查询的详情
sys.dm_db_index_usage_stats这个动态管理视图(DMV)的设计目标很明确:只记录索引的各类操作计数和最后执行时间,它本身不存储任何与触发操作相关的查询文本或执行计划信息。
要找到触发这些操作的具体查询,你可以用以下几种方式:
- Extended Events(生产环境首选,轻量低开销):创建跟踪
sql_statement_completed或sp_statement_completed事件,过滤涉及目标堆表和非聚集索引idx_appNumber的语句。 - 查询
sys.dm_exec_query_stats+sys.dm_exec_sql_text:通过关联索引的object_id和index_id,找到引用该索引的查询计划,再提取对应的SQL文本。注意:如果查询计划被从缓存中清除(比如内存压力、SQL Server重启),就查不到对应的记录。 - 临时用SQL Server Profiler(不建议长期在生产环境启用,性能开销较大):跟踪
SQL:BatchCompleted或SP:StmtCompleted事件,过滤目标表和索引相关的语句。
内容的提问来源于stack exchange,提问作者nam
相关产品推荐
相关产品推荐

