一尘不染

SQL Server 2005-内部联接顺序

sql

我有一个查询,其中Where子句中包含三个内部join语句。该查询大约需要2分钟才能执行。如果仅更改两个内部联接的顺序,性能将下降到40秒。

除了更改内部联接的顺序外,什么都不做会对查询性能产生如此大的影响?我本以为优化器会解决所有这些问题。


阅读 125

收藏
2021-03-10

共1个答案

一尘不染

SQL是声明性的,也就是说,JOIN顺序无关紧要。

但是,实际上,如果优化器未探究所有选项(理论上可能要花费数月),这是否是一个复杂的查询就可以了。

另一个选择是,如果您重新排序并获得不同的结果,这将是一个非常不同的查询,但这通常与OUTER JOINs一起使用。

这也可能是指定ON子句的方式。如果对FROM子句重新排序,则必须更改它。除非您使用的是较旧(且较差)的JOIN-in-the-WHERE子句。

最后,如果您担心,可以使用括号更改评估顺序以使您的意图明确,例如,首先对大表进行过滤以生成派生表。

2021-03-10