【じゅつごぷっしゅだうん】
述語プッシュダウン とは?
公開:
💡 同じ答えのまま、先に絞り込む
検索条件による絞り込みを、結果の意味を変えない範囲でデータの読み取り側へ近づける最適化。後続の結合などに渡す行を減らす。
📌 このページのポイント
- 述語は行を採用するか判断する条件。WHERE句の条件などが該当する
- 読み取りに近い段階で絞ると、中間結果や後続処理の量を減らせる
- 論理的に先に絞ることと、ファイルの読み取り自体を省くことは同じではない
- 外部結合・NULL・集約などでは、条件を移しても意味が同じか確認が必要
SQLの絞り込みは、最後にするんじゃないの?
SQLは欲しい結果を指定する言語なので、実際の処理順は最適化で変えられるよ。同じ答えになるなら、条件をデータの読み取り側へ移して先に絞る。それが述語プッシュダウンなんだ。
先に絞ると何がうれしいの?
たとえば注文1000行のうち今月分が100行なら、先に今月分へ絞ってから顧客表と結ぶと、結合へ渡す注文を減らせる。この件数は説明用の例で、100行になったから必ず10倍速いという意味ではないよ。
ファイルも100行分しか読まなくていいの?
必ずそうなるわけではないよ。読み取ったあとで絞る場合もある。保存形式の統計や索引を使ってブロックを読み飛ばせるなら入出力も減らせるけれど、条件を早く評価することとは別の効果なんだ。
どんな条件でも先に移せるの?
自分でSQLを書き換えたほうがいいのかな?
まず実行計画でフィルターの位置と行数を確認しよう。オプティマイザがすでに移していることもあるよ。手で変えるなら速さだけでなく、空の入力やNULL、一致しない行でも同じ結果になることを確かめようね。
まとめ:ざっくりこれだけ覚えればOK!
「述語プッシュダウン」は「同じ答えのまま、先に絞り込む」と押さえておこう!
📖 おまけ:英語の意味
「predicate pushdown」 = 条件を読み取り側へ押し下げること
💬 predicate pushdownは「条件を読み取り側へ押し下げること」という意味の表現だよ。