Abe*_*ler 6 sql sql-server sql-server-2005 sql-execution-plan
我已执行查询并包含实际执行计划.有一个Hash Match是我感兴趣的,因为它的子树使用索引扫描而不是索引搜索.当我将鼠标悬停在此Hash Match上时,会出现一个名为"Probe Residual"的部分.我曾认为这是我加入的任何价值观.我在这里是正确的还是有更好的解释?
我遇到的第二个问题是它使用的索引.在我的例子中,我很确定这个特殊的连接正在加入两列.它正在扫描的索引中包含这两列,以及另一个未在连接中使用的列.我的印象是,这将导致索引搜索而不是扫描.我错了吗?
哈希连接通常(总是?)使用扫描或至少是范围扫描。哈希联接的工作原理是扫描左联接表和右联接表(或表中的范围)并构建一个内存中哈希表,其中包含扫描“看到”的所有值。
在您的情况中发生的情况是这样的:QO 注意到它可以从恰好包含该列(作为键或包含列)的非聚集索引中获取列 C 的所有值。作为非聚集索引可能相当狭窄,因此扫描整个非聚集索引的 IO 总量并不夸张。QO 还认为系统有足够的 RAM 来在内存中存储哈希表。将此查询的成本(端到端扫描非聚集索引,例如 10000 页)与使用搜索的嵌套循环的成本(例如,每个 2-3 页进行 5000 个探测)的成本进行比较,扫描因需要较少的 IO 而获胜。当然,这很大程度上是我的猜测,但我试图从 QO 的角度来展示这个案例,并且该计划可能是最优的。
促成这一特定计划选择的因素包括:
对于候选数量的大量估计,比散列连接更好的选择就是合并连接,并且该选择需要对输入进行预排序。如果左侧都可以提供保证连接列上的顺序的访问路径,并且右侧也有类似的可能性,那么您最终可能会得到合并连接,这是最快的连接。
| 归档时间: |
|
| 查看次数: |
3411 次 |
| 最近记录: |