ANALYZEとpg_statistic
ANALYZEでプランナー統計を最新に保ち、pg_statisticを調べ、相関する列には拡張統計を使います。
「ANALYZEとpg_statistic」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
なぜ ANALYZE を使うのか
クエリプランナーは、適切なプランを選ぶために行数と選択性を推定する必要があります。これらの推定値は、ANALYZE が収集する列ごとの統計情報から得られます。
ANALYZE を実行するタイミング
Autovacuum は、行の変更量がしきい値に達すると自動的に ANALYZE を実行します。一括ロードや大規模な DELETE の後には、プランが悪化しないよう手動で実行してください。
ANALYZE orders;
ANALYZE (VERBOSE) orders;サンプリング
ANALYZE は、列ごとに数百行をサンプリングします。デフォルト値で推定が悪くなる場合は、統計ターゲットを調整します。
ALTER TABLE orders ALTER COLUMN customer_id SET STATISTICS 1000;
-- Up from default 100. ANALYZE will sample more rows.pg_statistic
統計情報が格納されるシステムカタログです(読みやすさを優先する場合は pg_stats ビューを使用します)。
SELECT attname, n_distinct, most_common_vals, most_common_freqs, histogram_bounds
FROM pg_stats
WHERE schemaname = 'public' AND tablename = 'orders';プランナーが確認する情報
- n_distinct — 異なる値の数
- most_common_vals — 最も多い値とその頻度
- histogram_bounds — 範囲クエリ用のバケット
- correlation — 物理的な順序と論理的な順序の相関(スキャンコストに影響します)
拡張統計
列ごとの統計では、列間の相関を捉えられません。CREATE STATISTICS を使うと、これらを取得できます。
CREATE STATISTICS orders_country_status (dependencies)
ON country, status FROM orders;
ANALYZE orders;
-- Now the planner knows that country='US' AND status='paid' is correlated
-- (e.g. most US orders happen to be 'paid').多変量統計の種類
dependencies— 関数従属性(ある列から別の列を予測できます)ndistinct— 異なる値の組み合わせmcv— 最も多い値の組み合わせ(PG 12 以降)
悪い推定値 → 悪いプラン
「クエリが遅いのはなぜか」という問題で最も多い原因は、行数の推定が不正確なことです。プランナーが 1 行だと予測したため Nested Loop を選んだのに、実際には 1,000,000 行ある、といったケースです。
EXPLAIN ANALYZE SELECT * FROM ... ;
-- Look at Plan rows vs actual rows. Big gap = run ANALYZE or add extended stats.マイグレーションで ANALYZE を強制する
大規模な一括ロードの後:
COPY users FROM ... ;
ANALYZE users;
-- Without ANALYZE, the planner has no idea the table just grew.データの偏りは統計情報に自動反映されない
今日のデータが昨日のデータと大きく異なる場合、autoanalyze が実行されるまで統計情報が古いままになることがあります。データの形状が変化した後は、手動で ANALYZE を実行します。
pg_class.reltuples
プランナーは、pg_class の推定行数も使用します。VACUUM または ANALYZE によって更新されます。簡単に確認できます。
SELECT relname, reltuples FROM pg_class WHERE relname = 'orders';まとめ
ANALYZE はプランナーに情報を提供します。
- 大きなデータ変更の後に実行します
- 偏りのある列では STATISTICS ターゲットを増やします
- 列間の相関には CREATE STATISTICS を使用します
- 推定値と実測値の大きな差を最初に解消します
クイックチェック
単一列の WHERE 句で、EXPLAIN ANALYZE に estimated rows=1、actual rows=500,000 と表示されました。最初に行うべき対策は何ですか?
よくある質問
「ANALYZEとpg_statistic」レッスンは無料ですか?
はい。「ANALYZEとpg_statistic」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「ANALYZEとpg_statistic」で何を学びますか?
ANALYZEでプランナー統計を最新に保ち、pg_statisticを調べ、相関する列には拡張統計を使います。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「ANALYZEとpg_statistic」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- MVCCと肥大化の原因
- VACUUM、autovacuum、vacuum_cost_delay
- ANALYZEとpg_statistic
- インデックスオンリースキャンとVisibility Map