2012-02-03 6 views
1

Iは参加複数の大きなテーブル

欲しい

私の出力があることが3つのテーブル{、C、B}、{D、E}は数値文字列とされている

Table T1: Columns {a,b,c}, combination {a,b} is unique in Table T1 
Table T2: Columns {a,c,d}, combination {a,c} is unique in Table T2 
Table T3: Columns {a,c,e}, combination {a,c} is unique in Table T3 

を有する

Table T4: Columns {a,b} where e/d < x. 

テーブルT1、T2、T3はすべて非常に大きいので(数百万行)、これを実装する方法はテーブルT1 T2で左結合を行い、結果を一時テーブルに保存してから左結合を行いますテーブルT1 T3を作成し、結果を保存してから、左結合を実行します最終的にこれらの一時テーブルを1つの最終テーブルに結合します。

私の質問は、データベースを爆発させることなくこれを行うためのより良い/より効率的な方法がありますか?

+0

あなたはこれらのテーブルの上にどのようなインデックスを持っていますか? –

答えて

1

これをまっすぐにやってみましたか?

一時テーブル内のレコード数百万を保存
select t1.a, t1.b 
into t4 
from t1 
join t2 on t1.a = t2.a and t1.c = t2.c 
join t3 on t1.a = t3.a and t1.c = t3.c 
where t3.e/t2.d < x 

は、パフォーマンスやストレージのためによくないです...

+0

私はこれに同意します.OPのデータベースがストレージ要件のために非常に小さい場合を除き、これはうまくいくはずです。 –

+0

だから、おそらく私は十分なSQLを理解していませんが、結合はデカルト積を行います(したがって、10個の行と10MMの行の2つのテーブルがある場合、100MM行のテーブルを作成して排除します)。いいえ? – user1167650

+0

鍵に参加していない場合。デカルト積は、キーに加わっていないときにのみ発生します。あなたの例では、10行テーブルのPKとして10mil行テーブルにFKがある場合、結果セットに含まれる10行テーブルのデータとともに10mil行だけが返されます。 –

関連する問題