.net - 在 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
解决方案
你有什么索引?每个索引下的列是什么?我会假设您没有正确或以最适合您的查询的方式建立索引,因为 sql 在运行时会自动使用最佳和最有效的搜索。
推荐阅读
- amazon-web-services - 无法在仅使用默认端点的无服务中激活 CORS
- flutter - GetX:如何访问不在小部件上的先前更新的值?
- html - 如何在网页页脚添加不同样式的字体
- r - 如何启动并运行 RSelenium
- javascript - 使用自定义间隔获取两个日期之间的日期数组
- postgresql - 在 Centos 7.6 上为 PostgreSQL 安装 PHP 7.4 PDO 驱动程序
- node.js - AWS S3 Bucket Presigned url 问题
- flutter - 如何在颤动中调用 OnvalueChanged?
- sql - Oracle 数据库 - 使用文字表中的随机值更新表,但每行更改数据
- sql - 使用查询中的列作为另一个查询中的变量,将 2 个查询合并为一个