虚拟表JOIN的效率如何?

时间:2011-07-30 01:09:39

标签: sql oracle

假设我有这样的查询,我加入了许多虚拟表:

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之外的影响区别是什么?

2 个答案:

答案 0 :(得分:5)

使用内联视图(AFAIK是您称之为“虚拟表”的正确术语)本质上并不是什么坏事。我建议学习查看和理解执行计划,以便调查特定的性能问题。

一般来说,我认为执行多个单表查询然后基本上将结果连接到前端代码中是一个非常糟糕的主意。做连接是RDBMS的设计目的,为什么要重写呢?

答案 1 :(得分:3)

为什么不呢:

SELECT table1.a, tbl2.a, tbl3.b, tbl4.c, tbl5.a, tbl6.a
FROM table1 JOIN table2 on table1.x = table2.x AND table2.foo = 'bar'
            JOIN table3 on table1.x = table3.x AND table3.foo = 'bar'
            JOIN table4 on table1.x = table4.x AND table4.foo = 'bar'
            JOIN table5 on table1.x = table5.x AND table5.foo = 'bar'
            JOIN table6 on table1.x = table6.x AND table6.foo = 'bar'
WHERE anotherconstraint='value';

编辑:

它的运行情况如何?谁知道?正如@Vinko所述,答案在于查看执行计划,或许在适当的时候提供提示。通过查看一个人为的例子,这个复杂的东西无法回答。