私は、一緒に参加したいテーブルを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の両方を使用しています。
読み込み可能なコードを書くと、オプティマイザはフィルタリングの順序を処理することになっています。 – jarlh
フィルタを直接ジョイン条件に入れることもできます: 'FROM t1 JOIN t2 ON t1.field = t2.field AND t2.column3> 42'。しかし、3つの選択肢すべてが、おそらく同じ実行計画を生成するでしょう。しかし、これを確認する**唯一の**方法は、両方の製品で実行計画を見ることです。 –
PosgresSQLまたはMySQLの場合、EXPLAINを使用してクエリの実行方法に関する詳細情報を取得します。 SQL Serverには、実行計画を表示するためのグラフィカルツールがあります。実行計画出力からSQL開始を最適化するには –