2011-07-30 6 views
5

は私が仮想テーブルの数を結合するこのようなクエリ、持っていると言う:各JOINを、私の本当のクエリで仮想テーブルJOINはどのくらい効率的ではありませんか?

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を独自のを持っており、WHERE制約。

このようなクエリはどの程度うまくいかないでしょうか?さらに、これと個々の仮想テーブルのすべてを独自のクエリとして実行し、結果をSQLの外部でリンクすることとの間にどのような影響がありますか?

+0

実際のテーブルJOINとは対照的に、あなたはどういう意味ですか?それをプロファイル!それは多くの要素に依存し、それらの多くはデータ/スキーマに依存します。また、SQLの外部で結果をリンクすると、非常に遅くなる可能性が非常に高いです。巨大なパフォーマンス上の問題がある場合は、すべてのテーブルでxまたはfooを超えるインデックスが必要な場合があります –

+0

実際のクエリでは、JOINにはWHERE節の制約、追加の結合、および集計関数が多数あります。仮想テーブルとして。おそらくもっと良い方法がありますか? –

+0

各サブクエリが複雑な場合は、実際にそれをプロファイルする必要があります。実行計画を見て、それらを読む方法を学んでください。 –

答えて

5

インラインビュー(「仮想テーブル」と呼ばれるものの正確な用語AFAIK)を使用することに本質的に悪いことはありません。特定のパフォーマンスの問題を調査できるように、実行計画を表示して理解することを習得することをおすすめします。

一般的に、複数の単一テーブルクエリを実行し、結果をフロントエンドコードで本質的に結合することは非常に悪い考えです。結合を行うことは、RDBMSが設計したものです。なぜそれを書き直すのですか?

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'; 

EDIT:

どれだけそれが実行するのでしょうか?知るか? @Vinkoが述べているように、答えは実行計画を見て、適切な場合にヒントを提供することにあります。この複雑なものは、人為的な例を見ると答えられません。

+0

上記の私の編集を参照してください - 各仮想テーブルJOINには、独自のJOIN、集計関数、およびWHERE制約があります。 –

関連する問題