【かーでぃなりてぃすいてい】
カーディナリティ推定 とは?
公開:
💡 次に何行来るかを予想して、処理手順を選ぶ
検索や結合の各段階で何行になるかを、統計情報から見積もる処理。オプティマイザが結合順序や検索方法を選ぶ土台になる。
📌 このページのポイント
- 実行計画の各段階の行数を推定し、索引利用や結合方式などの費用計算に使う
- 総行数、値の分布、よく出る値、異なる値の数などの統計を利用する
- 統計は標本や近似に基づく。更新しても常に実測と一致するわけではない
- 列同士の相関を無視すると外れやすい。複数列の統計が役立つ場合もある
検索する前に、何行になるか分かるの?
正確に数える代わりに統計から予想するんだ。これがカーディナリティ推定だよ。「カーディナリティ」は文脈によって異なる値の数も指すけれど、ここでは主に実行計画の各段階の行数を見積もる話だね。
どうやって予想するの?
説明用の例なら、表が1万行で条件に合う割合を10%と推定すれば、結果は1000行と見積もる。実際には値の偏りやNULLの割合、よく現れる値など、データベースが集めた統計を使うよ。
予想が外れると何が起こるの?
統計を更新したら、必ず当たるのかな?
必ずではないよ。統計は近似だし、条件同士に関係がある場合も難しい。都道府県と市区町村のような列を独立だと仮定して確率を掛け合わせると、外れることがある。PostgreSQLには複数列の関係を扱う拡張統計もあるんだ。
まず何を確認すればいいの?
対象を安全に実行できる環境で推定行数と実測を比べ、最初に大きく外れる箇所を探そう。データ更新後の統計の状態、偏り、条件の相関を順に調べるとよいね。統計量を増やせばあらゆる条件が正確になる、というわけでもないよ。
まとめ:ざっくりこれだけ覚えればOK!
「カーディナリティ推定」は「次に何行来るかを予想して、処理手順を選ぶ」と押さえておこう!
📖 おまけ:英語の意味
「cardinality estimation」 = 行数の見積もり
💬 cardinality estimationは「行数の見積もり」という意味の表現だよ。