-1

分散 SQL クエリ プランナー (クエリ エンジン) を作成しています。データは、ネットワーク I/O を伴う RDBMS(PostgreSQL) ノードからフェッチされます。

JOIN クエリを最適化したい。

論理的な実行順序は次のとおりです。

  1. JOINする(ON句を利用する)
  2. 結合結果に 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 

論理実行:

  1. joinResult = (tableA left join tableB ON() ) left join tableC ON()
  2. 指定された WHERE 句を使用して joinResult をフィルタリングします。

実行案:

  1. filteredA = tableA WHERE tableA.colY < 100

    filteredB = tableB WHERE tableB.colX > 50

  2. 結果 = (filteredA left joinfilteredB ON(..))left join tableC ON(..)

このようなクエリを最適化できますか? つまり、最初にテーブルをフィルタリングしてから、その上に結合を適用します。

編集:一部の人々は、この特定の例について混乱して話している. この特定のクエリ例について話しているのではなく、クエリプランナーを書いていて、すべてのタイプのクエリを処理したい

各テーブルはシャード化され、異なるマシンに保存されていることに注意してください。現在の実行モデルは、各テーブルをフェッチしてからローカルで結合することです。したがって、フェッチする前に WHERE フィルターを適用すると、より良い結果が得られます。

4

1 に答える 1

0

これは実際には複雑なトピックです。

場合によっては、テーブルをフィルタリングできます。また、外部結合を並べ替えて、フィルターの修飾子を内部にプッシュすることもできます。

これに関する研究論文を読んでいましたが、まだ完成していません(完成していない可能性もあります)。

したがって、今のところ、答えを探している人は、おそらくこの研究論文、特にセクション 2.2 を読んでください。http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.43.2531&rep=rep1&type=pdf


今のところ、私は PostgreSQL のプランナーに依存しており、その出力を取得して、要件に合わせてクエリを再構築しています。

于 2020-06-09T11:18:40.347 に答える