标量表达式+与列相同的名称会导致计划完全忽略索引

问题描述 投票:0回答:0

这是一个很大的难题。

我有一个包含 1100 万行的表 [dt],其中有一个 rowversion 列 [fs_rv]。该列有一个最近创建的索引。

我跑步:

select top 50 doccode, fs_rv=convert(bigint,fs_rv) from dt order by fs_rv asc

doccode 只是表中的另一列,未包含在索引中,因此我们可以确保对原始数据进行“广泛”访问。 我期望使用索引进行快速操作。没有。 PK 上的聚集索引扫描

呵呵。然后我用 (index(ix_...)) 强制`from dt。读完全文后,它按 PK 列(地图、pda)对索引进行了排序(?)。 这两个都运行得很慢。我可以看到 1100 万这个数字出现在计划的多个部分中。

但是,如果我只是将 fs_rv 的表达式更改为其本身而不是转换,则计划将如预期那样快如闪电

我可以理解将函数应用于列,使它们不可SARGable,但这不是

where
部分,只是
select
。而且变得更奇怪了。

如果我给我的表达式指定除原始列名之外的任何别名,则该计划也是同样好的计划!!

有什么想法吗?版本是2019。

alias sql-execution-plan performanceindexing
© www.soinside.com 2019 - 2024. All rights reserved.