統計情報とオプティマイザ
統計情報とは、テーブルやカラムの行数・値の分布・NULL率などをオプティマイザが参照する要約データであり、これが古いと実行計画が最適でなくなる。
インデックスを使うかどうかは統計情報が決める
DBの中では「クエリオプティマイザ」がSQLを見て、複数の実行計画候補の中からコスト最小のものを選びます。 このコスト見積りは統計情報(各カラムの値の分布、行数、NULL率など)に基づきます。
大量INSERT/DELETE 直後や、データ分布が変化した直後は、DBが把握している分布と実際がずれる。 統計情報を更新するコマンドで最新化する必要がある。
「対象が多い」と見積もったので全表を順に読む方が速いと判断。
20%)以下ならインデックス、それより多ければフルスキャン」と判断する。 統計情報が古いと 誤った 割合で判断し、最適でないプランを選ぶ。インデックスを使わない判断もある
テーブルの多くの行が該当するクエリでは、インデックス経由でランダムアクセスを繰り返すよりもフルスキャンの方が速い。 オプティマイザはこれを見積りコストで判断します。「インデックスを貼ったのに使われない」の原因のほとんどは、この見積りで「使わない方が速い」と判断されているか、統計情報が古くて誤った判断が下されているかのどちらかです。
統計情報が古いとどうなるか
- 大量INSERT直後: 実際にはインデックスが効かない量なのにインデックスを選んでしまう
- 大量DELETE直後: インデックスが有効なのに、統計上「多くの行が該当する」と誤認して使わない
- データ分布の変化: 元は偏っていたstatusが均等になったのに古い分布で判断してしまう
こうした場合は、統計情報を更新するコマンドを実行して最新の分布に合わせます(コマンド名はRDBMSごとに異なる)。
よくある疑問
関連トピック
もっと学びたい方へ(おすすめ書籍)
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。