【发布时间】:2011-07-30 01:09:39
【问题描述】:
假设我有一个这样的查询,我在其中加入了许多虚拟表:
SELECT table1.a, tbl2.a, tbl3.b, tbl4.c, tbl5.a, tbl6.a
FROM table1
JOIN (SELECT x, a, b, c FROM table2 WHERE foo='bar') tbl2 ON table1.x = tbl2.x
JOIN (SELECT x, a, b, c FROM table3 WHERE foo='bar') tbl3 ON table1.x = tbl3.x
JOIN (SELECT x, a, b, c FROM table4 WHERE foo='bar') tbl4 ON table1.x = tbl2.x
JOIN (SELECT x, a, b, c FROM table5 WHERE foo='bar') tbl5 ON table1.x = tbl5.x
JOIN (SELECT x, a, b, c FROM table6 WHERE foo='bar') tbl6 ON table1.x = tbl6.x
WHERE anotherconstraint='value'
在我的真实查询中,每个 JOIN 都有自己的 JOIN、聚合函数和 WHERE 约束。
这样的查询运行得有多好/差?另外,这与将所有单独的虚拟表作为自己的查询运行并将结果在 SQL 之外链接在一起之间有什么影响差异?
【问题讨论】:
-
你的意思是,反对真正的表连接?简介吧!这将取决于许多因素,其中很多将取决于您的数据/模式。此外,在 SQL 之外链接结果很可能会慢很多。如果您发现巨大的性能问题,您可能需要在所有表中的 x 或 foo 上建立索引
-
在我的实际查询中,每个 JOIN 都有许多其他 WHERE 子句约束、附加连接和聚合函数,这就是我将它们拆分为虚拟表的原因。也许有更好的方法来解决它?
-
如果每个子查询都很复杂,那么您真的应该对其进行分析。查看执行计划并了解如何阅读它们。