3 回答
不,重新排列 JOIN 订单不应影响性能。MSSQL(与其他 DBMS 一样)有一个查询优化器,其工作是为任何给定查询找到最有效的查询计划。一般来说,这些做得很好 - 所以你不太可能轻易击败优化器。
也就是说,他们确实偶尔会出错。这就是阅读执行计划发挥作用的地方。您可以添加JOIN 提示来告诉 MSSQL 如何连接您的表(此时,排序确实很重要)。您通常会从最小到最大的表进行排序(尽管使用 aFULL JOIN
可能不太重要)并遵循连接类型的经验法则。
既然你在做FULL JOINS
,你基本上是从磁盘上读取全部 4 个表。这可能非常昂贵。您可能想重新检查问题,看看是否可以用不同的方式完成。
- 改变⋈的顺序会改变结果吗?
不,顺序FULL JOIN
无关紧要,结果都是一样的。但是请注意,您不能使用这样的东西(以下可能会根据连接的顺序给出不同的结果):
SELECT
COALESCE(a.id, b.id, c.id, d.id) AS id, --- Key columns used in FULL JOIN
a.*, b.*, c.*, d.* --- other columns
FROM a
FULL JOIN b
ON b.id = a.id
FULL JOIN c
ON c.id = a.id
FULL JOIN d
ON d.id = a.id ;
你必须使用这样的东西(无论连接顺序如何,结果都没有区别):
SELECT
COALESCE(a.id, b.id, c.id, d.id) AS id,
a.*, b.*, c.*, d.*
FROM a
FULL JOIN b
ON b.id = a.id
FULL JOIN c
ON c.id = COALESCE(a.id, b.id)
FULL JOIN d
ON d.id = COALESCE(a.id, b.id, c.id) ;
- 更改 ⋈ 连接的顺序会对性能产生影响吗?
考虑到第二个和第三个连接必须COALESCE()
在列而不是列本身上完成,我认为只有使用足够大的表进行测试才能显示索引是否可以有效使用。
更改完全外部联接的顺序不应影响性能或结果。唯一会根据完全外连接的顺序受到影响的是使用 SELECT * 时生成的列的默认顺序。您可能仅仅因为尝试对大型表进行多个联接而遇到性能问题。如果没有 where 子句来限制表,您可能会经历数十万个结果。