我目前正在阅读查询优化器是如何工作的,我经常遇到短语“联接策略”,并且查询优化器将它包含在成本计算中。
加入策略到底是什么?有什么例子吗?
对于具有单个联接的查询,这是否意味着该查询有多个可能的“连接策略”?还是这只适用于具有多个联接的查询?
当我们讨论具有多个联接的查询的连接策略时,这到底是如何工作的呢?
我一直认为,在解决多个联接时,首先解决第一个联接,然后再将结果集连接到下一个联接,以此类推。加入策略真的会改变订单吗?这不会影响结果吗?
发布于 2017-08-01 04:22:05
我一直认为,在解决多个联接时,首先解决第一个联接,然后再将结果集连接到下一个联接,以此类推。加入策略真的会改变订单吗?这不会影响结果吗?
不以不同的顺序加入和过滤不会改变结果。但是它会影响结果的速度,这就是为什么顺序经常在内部改变的原因。
您使用的是Server吗?按CTRL键查看查询计划。在某种程度上这是一个特定于产品的答案但是..。
对我来说,“连接策略”是如何满足连接的。
例如,您可以使用散列连接或循环连接。
您可以在联接之前或之后筛选数据。
查询规划器通常会重新排列联接和筛选,以生成它认为最快的结果。这通常意味着提前过滤,并对生成尽可能少行的联接进行评估。
例如,如果您要加入大型表A和B,并在表A和B上使用where筛选器,并且查询计划器认为应用该筛选器将减少表A上的记录数,但不会减少表B上的记录数,则可能首先筛选表A以减少记录数量,然后可能使用循环连接(当将一个大表连接到一个小表时,这是最有效的)将过滤后的记录从A连接到B中更多的记录。
提交的SQL语句中的联接顺序与它们在计划中实际执行的顺序无关。(除非在甲骨文中使用ordered提示),而且仍然得到相同的答案
where子句中的任何筛选器都可以在联接之前或之后应用(通常是在可能的情况下),并且仍然会得到相同的答案。
因此,连接策略是将“声明性”SQL语句(这正是我想要的)转换为生成它的实际物理步骤的方法(筛选此表,然后与该表连接等等)。
https://stackoverflow.com/questions/45428828
复制相似问题