这是一个很大的难题。
我有一个包含 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。