【かーでぃなりてぃすいてい】

カーディナリティ推定 とは?

公開:
💡 次に何行来るかを予想して、処理手順を選ぶ

検索や結合の各段階で何行になるかを、統計情報から見積もる処理。オプティマイザが結合順序や検索方法を選ぶ土台になる。

📌 このページのポイント
カーディナリティ推定 統計による予想と、実測の違いを確認 入力:1万行 条件で絞る 推定10% → 1000行 計画の選択に利用 実測:3000行だった 推定との差を調査 説明用の件数。統計の鮮度・値の偏り・列の相関を確認
次に何行来るかを予想して、処理手順を選ぶ
ひよこ ひよこ
検索する前に、何行になるか分かるの?
ペンギン先生 ペンギン先生
正確に数える代わりに統計から予想するんだ。これがカーディナリティ推定だよ。「カーディナリティ」は文脈によって異なる値の数も指すけれど、ここでは主に実行計画の各段階の行数を見積もる話だね。
ひよこ ひよこ
どうやって予想するの?
ペンギン先生 ペンギン先生
説明用の例なら、表が1万行で条件に合う割合を10%と推定すれば、結果は1000行と見積もる。実際には値の偏りやNULLの割合、よく現れる値など、データベースが集めた統計を使うよ。
ひよこ ひよこ
予想が外れると何が起こるの?
ペンギン先生 ペンギン先生
1000行と思った結果が実際は3000行なら、後続の結合やメモリの見積もりも変わるよ。少数行向けの計画を選んで大量の検索を繰り返すこともある。推定と実際の差が、遅いSQLを調べる手掛かりになるんだ。
ひよこ ひよこ
統計を更新したら、必ず当たるのかな?
ペンギン先生 ペンギン先生
必ずではないよ。統計は近似だし、条件同士に関係がある場合も難しい。都道府県と市区町村のような列を独立だと仮定して確率を掛け合わせると、外れることがある。PostgreSQLには複数列の関係を扱う拡張統計もあるんだ。
ひよこ ひよこ
まず何を確認すればいいの?
ペンギン先生 ペンギン先生
対象を安全に実行できる環境で推定行数と実測を比べ、最初に大きく外れる箇所を探そう。データ更新後の統計の状態、偏り、条件の相関を順に調べるとよいね。統計量を増やせばあらゆる条件が正確になる、というわけでもないよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「カーディナリティ推定」は「次に何行来るかを予想して、処理手順を選ぶ」と押さえておこう!
📖 おまけ:英語の意味
「cardinality estimation」 = 行数の見積もり
💬 cardinality estimationは「行数の見積もり」という意味の表現だよ。

参考資料

← 用語集にもどる