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

Fyo*_*kin 7 sql sql-server performance

看看这个小提琴:http://sqlfiddle.com/#!6/18324/2

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

跆拳道???

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

这篇文章最接近问题,从那里起作用的解决方案是使用option(recompile)(谢谢你,马丁史密斯).但是,这对我不起作用,因为我的查询是由我的ORM库(实体框架)生成的,我不能手动修改它们.
而我正在寻找的是一种重新构建B视图的方法,以便不会出现问题.

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

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

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

Fyo*_*kin 0

这是我自己的答案。

最终,我使用了-powered 技巧,通过将这些列转换为恒定长度的字符串表示形式(仔细调整排序)并将这些字符串连接在一起形成一个字符串,min我绕过了实际上是多个列的事实。Y完成后,我可以使用该连接字符串作为 的参数min()

我仍然想知道执行此操作的正确方法。如果有人知道的话,我将不胜感激。