相関のある列に拡張統計を作成(CREATE STATISTICS)
PostgreSQLメンテナンスコマンド
-- city and district are correlated: the planner assumes independence and underestimates rows
CREATE STATISTICS customer_city_district_stx (dependencies, ndistinct, mcv) ON city, district FROM customer;
ANALYZE customer;
-- Collected statistics
SELECT statistics_name, attnames, kinds, n_distinct, dependencies
FROM pg_stats_ext
WHERE tablename = 'customer';
-- Verify: estimated rows should now be close to actual rows
EXPLAIN (ANALYZE, TIMING OFF)
SELECT * FROM customer WHERE city = 'Ankara' AND district = 'Cankaya';概要
列間の相関(関数従属性、組み合わせの異なり数、組み合わせの最頻値)をプランナに教え、複数列のWHEREおよびGROUP BY条件の行数推定を修正する。
使用する場面
EXPLAIN ANALYZEで複数列フィルタの推定行数が実際よりはるかに少なく(例: 12対570)、その結果として誤った結合方法/インデックスが選択されるときに。
注意
ANALYZEの後にのみ有効になる。列の組み合わせ数が統計ターゲット(デフォルト100)をはるかに上回る場合、mcvリストはその大部分をカバーできず、dependenciesなら修正できる推定をmcvが修正できないことがある。EXPLAINで確認し、必要に応じて定義からmcvを外すか、ALTER STATISTICS customer_city_district_stx SET STATISTICS 1000;でターゲットを引き上げる。dependenciesは等価/IN条件にのみ、ndistinctはGROUP BYの推定に使用される。定義ごとにANALYZEが長くなるため、見積り誤りが実証された列グループにのみ追加する。