【じゅつごぷっしゅだうん】

述語プッシュダウン とは?

公開:
💡 同じ答えのまま、先に絞り込む

検索条件による絞り込みを、結果の意味を変えない範囲でデータの読み取り側へ近づける最適化。後続の結合などに渡す行を減らす。

📌 このページのポイント
述語プッシュダウン 今月分が100行あるという説明用の例 注文表 1000行 今月分に絞る 100行 顧客表と結合 入力を削減 結果の意味が同じ場合に、フィルターを読み取り側へ移す 外部結合などでは移動に制約。速度10倍の保証ではない
同じ答えのまま、先に絞り込む
ひよこ ひよこ
SQLの絞り込みは、最後にするんじゃないの?
ペンギン先生 ペンギン先生
SQLは欲しい結果を指定する言語なので、実際の処理順は最適化で変えられるよ。同じ答えになるなら、条件をデータの読み取り側へ移して先に絞る。それが述語プッシュダウンなんだ。
ひよこ ひよこ
先に絞ると何がうれしいの?
ペンギン先生 ペンギン先生
たとえば注文1000行のうち今月分が100行なら、先に今月分へ絞ってから顧客表と結ぶと、結合へ渡す注文を減らせる。この件数は説明用の例で、100行になったから必ず10倍速いという意味ではないよ。
ひよこ ひよこ
ファイルも100行分しか読まなくていいの?
ペンギン先生 ペンギン先生
必ずそうなるわけではないよ。読み取ったあとで絞る場合もある。保存形式の統計や索引を使ってブロックを読み飛ばせるなら入出力も減らせるけれど、条件を早く評価することとは別の効果なんだ。
ひよこ ひよこ
どんな条件でも先に移せるの?
ペンギン先生 ペンギン先生
結果が変わる移動はできないよ。たとえばLEFT JOINのあとに右表の列で絞る場合と、右表だけを先に絞ってLEFT JOINする場合では、相手のいない左の行が残るかどうかが違うことがある。NULLや集約も注意が必要だね。
ひよこ ひよこ
自分でSQLを書き換えたほうがいいのかな?
ペンギン先生 ペンギン先生
まず実行計画でフィルターの位置と行数を確認しよう。オプティマイザがすでに移していることもあるよ。手で変えるなら速さだけでなく、空の入力やNULL、一致しない行でも同じ結果になることを確かめようね。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「述語プッシュダウン」は「同じ答えのまま、先に絞り込む」と押さえておこう!
📖 おまけ:英語の意味
「predicate pushdown」 = 条件を読み取り側へ押し下げること
💬 predicate pushdownは「条件を読み取り側へ押し下げること」という意味の表現だよ。

参考資料

← 用語集にもどる