CREATE STATISTICS

Определяет расширенную статистику.

Синтаксис

CREATE STATISTICS [ IF NOT EXISTS ] <statistics_name>
    [ ( <statistics_kind> [, ... ] ) ]
    ON <column_name>, <column_name> [, ...]
    FROM <table_name>

Описание

CREATE STATISTICS создает новый объект расширенной статистики, отслеживающий данные указанной таблицы, внешней таблицы или материализованного представления. Объект статистики создается в текущей базе данных и будет принадлежать пользователю, выполнившему команду.

Если указано имя схемы (например, CREATE STATISTICS myschema.mystat ...), то объект статистики создается в указанной схеме. В противном случае он создается в текущей схеме. Имя объекта статистики должно отличаться от имени любого другого объекта статистики в той же схеме.

Параметры

  • IF NOT EXISTS
    • Не выдавать ошибку, если объект статистики с таким именем уже существует. В этом случае база данных выдает уведомление. Обратите внимание, что здесь учитывается только имя объекта статистики, а не детали его определения.
  • statistics_name
    • Имя (опционально с указанием схемы) создаваемого объекта статистики.
  • statistics_kind
    • Вид статистики, который будет вычисляться в данном объекте статистики. Поддерживаемые виды на данный момент: ndistinct — включает статистику по количеству различных значений, dependencies — включает статистику функциональных зависимостей, mcv — включает списки наиболее часто встречающихся значений. Если этот параметр опущен, в объект статистики включаются все поддерживаемые виды статистики.
  • column_name
    • Имя столбца таблицы, охватываемого вычисляемой статистикой. Необходимо указать как минимум два имени столбцов; порядок имён столбцов не имеет значения.
  • table_name
    • Имя (опционально с указанием схемы) таблицы, содержащей столбцы, по которым вычисляется статистика; см. ANALYZE для объяснения обработки наследования и секционирования.

Замечания

Вы должны быть владельцем таблицы, чтобы создать объект статистики, ссылающийся на неё. Однако после создания владение объектом статистики становится независимым от базовых таблиц.

Примеры

Создайте таблицу t1 с двумя функционально зависимыми столбцами, то есть знание значения в первом столбце позволяет однозначно определить значение во втором столбце. Затем создайте статистику функциональных зависимостей по этим столбцам:

CREATE TABLE t1 (
    a   int,
    b   int
);

INSERT INTO t1 SELECT i/100, i/500
                 FROM generate_series(1,1000000) s(i);

ANALYZE t1;

-- the number of matching rows will be drastically underestimated:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

CREATE STATISTICS s1 (dependencies) ON a, b FROM t1;

ANALYZE t1;

-- now the row count estimate is more accurate:
EXPLAIN ANALYZE SELECT * FROM t1 WHERE (a = 1) AND (b = 0);

Без статистики функциональных зависимостей планировщик предполагает, что два условия WHERE независимы, и перемножает их селективности, получая слишком маленькую оценку количества строк. При наличии такой статистики планировщик распознаёт избыточность условий WHERE и не занижает оценку числа строк.

Create table t2 with two perfectly correlated columns (containing identical data), and a MCV list on those columns:

CREATE TABLE t2 (
    a   int,
    b   int
);

INSERT INTO t2 SELECT mod(i,100), mod(i,100)
                 FROM generate_series(1,1000000) s(i);

CREATE STATISTICS s2 (mcv) ON a, b FROM t2;

ANALYZE t2;

-- valid combination (found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 1);

-- invalid combination (not found in MCV)
EXPLAIN ANALYZE SELECT * FROM t2 WHERE (a = 1) AND (b = 2);

Список MCV предоставляет планировщику более подробную информацию о конкретных значениях, часто встречающихся в таблице, а также верхнюю границу селективности комбинаций значений, отсутствующих в таблице, позволяя ему формировать более точные оценки в обоих случаях.

Совместимость

Оператор CREATE STATISTICS отсутствует в стандарте SQL.

Смотрите также

ALTER STATISTICS, DROP STATISTICS