我正在研究一个小的性能问题,优化器工具基本上是在说,“嘿,继续,并将该表上的所有列包含在该索引中”,在我看来,这是一个可怕的解决方案。
我的思考过程让我想到“为什么我不继续给它现有索引中的所有内容来执行排序和 TOP(N) 操作并删除这个巨大的 100k 键查找操作,SQL Server 当然可以做到这一点,并且从 100k 个键查找更改为 N 个。”
这不是我看到的,我看到的是根本没有任何变化,它仍然执行所有关键查找并在此之后进行排序。如下
当然,非常简单地删除不在索引中的其他列的选择,就可以将其更改为根本不需要键查找。
我已经看到许多使用 CTE 来解决此问题的解决方法,但我使用实体框架来执行此查询,并且简单地使用查询并不那么容易。
我想这个问题的主要目的是为什么会发生这种情况?如果可以的话,在键查找循环之前执行排序和顶部子句似乎是一个微不足道的操作。不这样做似乎是该平台的一个明显弱点。
我问的是为什么存在这种行为,而不是如何提高此查询的性能。