分散 SQL クエリ プランナー (クエリ エンジン) を作成しています。データは、ネットワーク I/O を伴う RDBMS(PostgreSQL) ノードからフェッチされます。
JOIN クエリを最適化したい。
論理的な実行順序は次のとおりです。
- JOINする(ON句を利用する)
- 結合結果に WHERE 句を適用します。
Filter(テーブルに固有の WHERE 句) を最初に適用してから結合することを考えていました。どのような場合に、それが間違った結果になるのでしょうか?
例:
SELECT *
FROM tableA
LEFT JOIN tableB ON(tableA.col1 = tableB.col1)
LEFT JOIN tableC ON(tableB.col2 = tableC.col1)
WHERE tableA.colY < 100 AND tableB.colX > 50
論理実行:
- joinResult = (tableA left join tableB ON() ) left join tableC ON()
- 指定された WHERE 句を使用して joinResult をフィルタリングします。
実行案:
filteredA = tableA WHERE tableA.colY < 100
filteredB = tableB WHERE tableB.colX > 50
- 結果 = (filteredA left joinfilteredB ON(..))left join tableC ON(..)
このようなクエリを最適化できますか? つまり、最初にテーブルをフィルタリングしてから、その上に結合を適用します。
編集:一部の人々は、この特定の例について混乱して話している. この特定のクエリ例について話しているのではなく、クエリプランナーを書いていて、すべてのタイプのクエリを処理したい
各テーブルはシャード化され、異なるマシンに保存されていることに注意してください。現在の実行モデルは、各テーブルをフェッチしてからローカルで結合することです。したがって、フェッチする前に WHERE フィルターを適用すると、より良い結果が得られます。