我目前正在阅读查询优化工具的工作方式,并且我一直在遇到短语'加入策略'以及查询优化工具将其包含在成本计算中。
什么是加盟策略?有什么例子吗?
对于使用单个联接的查询,这是否意味着有多个可能的加入策略'对于那个查询?或者这仅适用于具有多个连接的查询?
当我们讨论具有多个连接的查询的连接策略时,它将如何正常工作?
我一直认为在解决多个连接时,首先解决第一个连接,然后将结果集连接到下一个连接,依此类推。加入策略实际上改变了订单吗?不会影响返回的结果吗?
答案 0 :(得分:2)
我一直认为在解决多个连接时,首先解决第一个连接,然后将结果集连接到下一个连接,依此类推。加入策略实际上改变了订单吗?这不会影响返回的结果吗?
否 - 以不同的顺序加入和过滤不会改变结果。但它会影响结果的速度,这就是为什么订单经常在内部改变
您使用的是SQL Server吗?按CTRL-L查看查询计划。在某种程度上,这是产品特定的答案,但......
对我来说,'加入策略'是如何满足联接的。
例如,您可以使用散列连接或循环连接
您可以在加入之前或之后过滤数据
查询规划器通常会重新排列连接和过滤器,以产生它认为最快的结果。这通常意味着尽早过滤并尽可能早地评估产生较少行的连接。
例如,如果您要加入大型表A
和B
,并在表A
和B
上使用where过滤器,则查询计划程序会认为应用了过滤器会减少表A
上的记录数,但不会减少表B
上的记录数,那么很可能首先过滤表A以获得减少数量的记录,然后它可能会使用循环连接(在将大表连接到小表时最有效)将过滤后的记录从A加入B
中的大量记录。
提交的SQL语句中的连接顺序与它们在计划中实际执行的顺序无关...(除非您在Oracle中使用ordered
提示),并且仍然得到相同的答案< / p>
您的where
子句中的任何过滤器都可能在加入之前或之后应用(通常在可能之前),并且您仍会得到相同的答案
因此,连接策略是将'声明性'SQL语句(这是我想要的)转换为实际生成它的一系列物理步骤的方法(过滤此表然后加入表等。)