DBAtlas · Атлас эксплуатации баз данных

Создать расширенную статистику для коррелированных столбцов (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. Когда число комбинаций столбцов намного превышает statistics target (по умолчанию 100), список mcv не может охватить большинство из них, и mcv может не исправить оценку, которую исправили бы dependencies. Проверьте через EXPLAIN; при необходимости уберите mcv из определения или увеличьте target через ALTER STATISTICS customer_city_district_stx SET STATISTICS 1000;. dependencies используется только для условий равенства/IN, ndistinct — для оценок GROUP BY. Каждое определение удлиняет ANALYZE; добавляйте его только для групп столбцов с доказанной ошибкой оценки.

Открыть в DBAtlas →

Связанные материалы