首页 > 解决方案 > 在 where 子句中使用非集群索引而不是索引查找时,MS SQL 执行计划中的索引扫描

问题描述

在我的项目中,用于搜索的存储过程如下

create proc CommentGet
(
@Type int,
@ParentID int
)

as
begin
select * from CommentTable where (@Type is null or CommentTable.Type=@Type) and (@ParentID is null or CommentTable.ParentID=@ParentID) 
end

在这种情况下,我引入了 Type 和 ParentID 作为 CommentTable 的非集群索引。当我运行代码时,我看到执行计划使用索引扫描而不是索引搜索来获取导致 SQL 需要读取整个页面的结果。显然我不能使用非集群索引的好处。

到目前为止我已经弄清楚了,如果在搜索词中使用了变量,就会出现这个问题,如果没有使用where线索的直接量,则不会出现问题并且可以正常工作(索引Seek)。

请告知您如何使用非集群索引的好处来处理它 这里以异常平面为例,因为您看到的是书面索引扫描而不是索引 Seek

标签: .netsql-serverdatabaseperformanceindexing

解决方案


你有什么索引?每个索引下的列是什么?我会假设您没有正确或以最适合您的查询的方式建立索引,因为 sql 在运行时会自动使用最佳和最有效的搜索。


推荐阅读