2016-03-31 5 views
0

私は、一緒に参加したいテーブルを4つほど持っています。複数のテーブルに参加する:効率的にフィルタリングする場所

SELECT f1, f2, ..., fn 
FROM t1 INNER JOIN t2 ON t1.field = t2.field 
     INNER JOIN t3 ON t2.field = t3.field 
     INNER JOIN t4 ON t3.field = t4.field 
WHERE // filters here 

しかし、私は、各スコープにサブクエリとフィルタリングで各テーブルを配置するとパフォーマンスになるだろうと思われる。(私には)私のコードクリーナーと読めるを作るために、私は最後にフィルタリングすべてを一度して、参加を希望しますより良い。

SELECT f1, f2, ..., fn 
FROM (SELECT t1_f1, t1_f2, ..., t1_fi FROM t1 WHERE // filter here) AS a 
    INNER JOIN 
    (SELECT t2_f1, t2_f2, ..., t2_fj FROM t2 WHERE // filter here) AS b 
    ON // and so on 

パフォーマンスの向上につながるか、私の勘違いが正しいかどうかを教えてください。パフォーマンスを犠牲にして読みやすさに喜んでいます。

実際に各サブクエリのフィルタリングが効率的になる場合は、データベースプラットフォームのアーキテクチャによって差が生じるか、これはすべてのRDBMS SQLフレーバに当てはまりますか?

私はSQL ServerとPostgresの両方を使用しています。

+6

読み込み可能なコードを書くと、オプティマイザはフィルタリングの順序を処理することになっています。 – jarlh

+2

フィルタを直接ジョイン条件に入れることもできます: 'FROM t1 JOIN t2 ON t1.field = t2.field AND t2.column3> 42'。しかし、3つの選択肢すべてが、おそらく同じ実行計画を生成するでしょう。しかし、これを確認する**唯一の**方法は、両方の製品で実行計画を見ることです。 –

+0

PosgresSQLまたはMySQLの場合、EXPLAINを使用してクエリの実行方法に関する詳細情報を取得します。 SQL Serverには、実行計画を表示するためのグラフィカルツールがあります。実行計画出力からSQL開始を最適化するには –

答えて

2

クエリオプティマイザは、常にSQLから最適なプランを見つけようとします。

読み取り可能でメンテナンス可能なコードを作成し、実行プランを分析することで、データベースとインデックス設計の非効率な部分をクエリの非効率的な部分(より可能性が高い)

意味のある解析を行わずにwhere句からjoin句にフィルタリングを移動することは無駄になりがちです。

0

インデックスが正しく設定されていると、結合は常に良好に機能します。

+0

これは本当に質問に答えません。 – MikeTheLiar

1

SQLエンジンが条件を最初に評価してからジョインを実行するため、最初の方法は常に優れています。したがって、where句を評価している間は、条件が利用可能であればレコードをフィルタリングします。

SELECT f1, f2, ..., fn 
FROM t1 INNER JOIN t2 ON t1.field = t2.field 
    INNER JOIN t3 ON t2.field = t3.field 
    INNER JOIN t4 ON t3.field = t4.field 
WHERE // filters here 
+1

これは単に真実ではありません(あなたが主張しているように、少なくとも「一般的」ではない)。両方の選択肢が同じ実行計画につながるなら、私は全く驚くことはありません。 –

関連する問題