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%。
我的问题是:
有人可以向我解释执行计划以及任何指针以了解有关强制扫描的更多信息,单击运算符后按 F4 时强制索引。
1. 如何理解预估运营商成本?没有索引的 Tb1 被扫描,成本为 2%,而索引正在 tb2 上使用,成本为 98%。
堆表只被完全扫描一次,但索引查找执行了 1,000,000 次。优化器估计,在这种情况下,一百万次搜索将代表执行查询总成本的 98.4%,而堆表的单次并行扫描将代表成本的 0.9%。
这些只是用于内部计划选择原因的估计;它们通常不会反映现代硬件上的真实世界性能,而且永远只是估计——即使在执行后(“实际”)执行计划中也是如此。
在管理工作室:
2.从上面的表扫描片段(其成本为2%),执行次数为24,这是否意味着sql批量读取行并存储在内存中,并且对于每一行它从tbl2执行查找操作。
不,这意味着 24 个并行线程协作执行对堆表的单次扫描。每个线程仍然一次从扫描中读取一行,在索引表中执行查找,然后从扫描中获取下一行,依此类推,直到任务完成。
在此计划中,行不批量读取并存储在内存中。SQL Server 报告 24 次扫描,因为 24 个线程每个执行表的部分扫描,导致整体扫描一次。
3.还有任何指针可以了解更多关于力扫描,当我点击操作符后按F4时的力指数
的ForceScan
,ForceSeek
和ForcedIndex
属性都设置为true,如果该查询指定FORCESCAN
,FORCESEEK
或INDEX
提示-或者,如果查询优化器决定一个特定的访问策略所需的正确性(例如,检查外键约束时)。
归档时间: |
|
查看次数: |
715 次 |
最近记录: |