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

时间:2019-01-16 12:41:48

标签: .net sql-server database performance indexing

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

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需要读取整页的结果。而且显然我不能使用非群集索引功能。

到目前为止,我已经发现,如果在搜索词中使用变量,则会出现此问题,并且如果未直接使用线索的数量,则不会出现问题并且它可以正常工作(索引查找)。

请为您提供有关如何使用非集群索引权益的建议 Here exception plane as example, as you see written index scan instead of index Seek

1 个答案:

答案 0 :(得分:0)

您以哪种方式编制索引?每个索引下是哪一列?我认为您没有正确索引或以最不适合您的查询的方式编制索引,因为sql在运行时会自动使用最佳和最有效的搜索。