加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

当使用窗口函数并且谓词包含变量时,SQL Server使用scan而不是see

发布时间:2020-12-12 07:27:52 所属栏目:MsSql教程 来源:网络整理
导读:看看这个小提琴: http://sqlfiddle.com/#!6/18324/2 针对视图B的查询,展开第一个执行计划. 请注意,第一个查询使用索引搜索执行,而第二个查询使用索引扫描执行.在我的实际设置中,有数千行,这会产生非常可观的性能损失. 跆拳道??? 查询是等价的,不是吗?为什么
看看这个小提琴: http://sqlfiddle.com/#!6/18324/2

针对视图B的查询,展开第一个执行计划.
请注意,第一个查询使用索引搜索执行,而第二个查询使用索引扫描执行.在我的实际设置中,有数千行,这会产生非常可观的性能损失.

跆拳道???

查询是等价的,不是吗?为什么文字产品寻求和变量扫描?
但更重要的是:我该如何解决这个问题呢?

This post最接近问题,从那里起作用的解决方案是使用选项(重新编译)(谢谢你,Martin Smith).但是,这对我不起作用,因为我的查询是由我的ORM库(实体框架)生成的,我不能手动修改它们.
而我正在寻找的是一种重新构造B视图的方法,以便不会出现问题.

在摆弄这个问题时,我注意到执行计划中的“Segment”块总是丢失谓词.为了验证这一点,我根据具有min函数的子查询重新构造了查询(参见视图D).瞧! – 针对D视图的两个查询都产生相同的计划.

然而,坏消息是我无法使用这种最小功率技巧,因为在我的实际设置中,Y列实际上是几列,所以我可以按它们排序,但我不能接受它们的min().
所以第二个问题是:任何人都可以想出一个类似于min-powered子查询的技巧,但适用于多个列?

注1:这与引爆点无关,因为表中只有2条记录.
注2:它也与视图的存在无关.查看带有视图C的示例:在这种情况下,服务器很乐意使用seek.

解决方法

可能这个会奏效
select a.X,a.Y from A a
    cross apply
        (select top 1 * from A t where t.X = a.X order by t.Y asc) as idx

SQLFiddle http://sqlfiddle.com/#!6/a3362/2

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读