理解下面的执行计划

The*_*war 5 sql-server execution-plan

我有两个表 tb1 和 tb2,tb1 上没有任何索引。我在 tb1 中填充了 1000000 行,tb2 中有 500 行,并且在 ID 列上有一个聚集索引。

为了理解嵌套循环连接,我使用了以下查询:

SELECT * 
FROM tb1
INNER JOIN tb2 ON tb1.id=tb2.id 
OPTION(loop join);
Run Code Online (Sandbox Code Playgroud)

我得到了以下执行计划:

在此处输入图片说明

没有索引的 Tb1 被扫描,成本为 2%,而索引正在 tb2 上使用,成本为 98%。

在此处输入图片说明

我的问题是:

  1. 如何理解以上剪辑显示的估计操作员成本 (138.236)

在此处输入图片说明

  1. 从上面的表扫描片段(其成本为 2%)来看,执行次数是 24,这是否意味着 sql 批量读取存储在内存中的行,并对每一行从 tbl2 执行查找操作?

有人可以向我解释执行计划以及任何指针以了解有关强制扫描的更多信息,单击运算符后按 F4 时强制索引。

Pau*_*ite 6

1. 如何理解预估运营商成本?没有索引的 Tb1 被扫描,成本为 2%,而索引正在 tb2 上使用,成本为 98%。

计划

堆表只被完全扫描一次,但索引查找执行了 1,000,000 次。优化器估计,在这种情况下,一百万次搜索将代表执行查询总成本的 98.4%,而堆表的单次并行扫描将代表成本的 0.9%。

这些只是用于内部计划选择原因的估计;它们通常不会反映现代硬件上的真实世界性能,而且永远只是估计——即使在执行后(“实际”)执行计划中也是如此。

在管理工作室:

寻求工具提示

SQL Sentry 计划资源管理器中

计划资源管理器工具提示

2.从上面的表扫描片段(其成本为2%),执行次数为24,这是否意味着sql批量读取行并存储在内存中,并且对于每一行它从tbl2执行查找操作。

不,这意味着 24 个并行线程协作执行对堆表的单次扫描。每个线程仍然一次从扫描中读取一行,在索引表中执行查找,然后从扫描中获取下一行,依此类推,直到任务完成。

在此计划中,行不批量读取并存储在内存中。SQL Server 报告 24 次扫描,因为 24 个线程每个执行的部分扫描,导致整体扫描一次。

3.还有任何指针可以了解更多关于力扫描,当我点击操作符后按F4时的力指数

ForceScanForceSeekForcedIndex属性都设置为true,如果该查询指定FORCESCANFORCESEEKINDEX提示-或者,如果查询优化器决定一个特定的访问策略所需的正确性(例如,检查外键约束时)。

提示属性