Почему использование Analyze совместно с Explain не показывает точное количество строк в таблице (Postgresql)

Рейтинг: 0Ответов: 2Опубликовано: 04.05.2023

База данных развернута в docker. Версия Postgresql -

PostgreSQL 13.3 (Debian 13.3-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit.
CREATE TABLE test_table
(
    id integer,
    name text
);


INSERT INTO test_table
SELECT i, md5(random()::text)
FROM generate_series(1, 10000000) AS i;

SELECT count(id) FROM test_table;

Я запускаю команды

ANALYZE test_table;
EXPLAIN SELECT * FROM test_table;

Я нашел информацию, что после выполнения ANALYZE и когда выполняем команду EXPLAIN, то статистика в планировщике должна быть обновлена. Количество строк rows должно быть точным, сумма средних длин записей столбцов выборки - width, становится немного большим. Страничная стоимость (cost) будет несколько ниже (cost зависит от количества rows, но не зависит от среднего значения суммы width, каждого row ).

Количество строк rows должно быть точным, однако это не так. Якобы стоимость страничная будет ниже, но у меня показывает такую же, как и была до обновления статистики по таблице.

Но получаю неверный подсчет количества строк введите сюда описание изображения

Почему так происходит ?

Ответы

▲ 2Принят

Количество строк rows должно быть точным

нет, не должно быть. Статистика всегда есть некоторое приближение. В вашем примере, как можно заметить, погрешность весьма маленькая.

Нет смысла собирать "точное" число строк, которое может измениться просто за время чтения части таблицы для построения данных статистики.

▲ 0
EXPLAIN (ANALYZE) SELECT * FROM test_table;

Вот таким образом, выполнение реального запроса выдаст точные данные.