Фичи оптимизатора PostgreSQL. Часть 1

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

Ситуация – создал пустую таблицу. И выполнил explain. Результат меня удивил. По шагам воспроизведу ситуацию ниже и поделюсь той информацией, которую нашел в интернете.

Определение количества строк в пустой таблице

Создадим пустую таблицу:

CREATE TABLE t1 (id integer);

И сразу посмотрим план запроса всех записей из данной таблицы:

EXPLAIN SELECT * FROM t1;

PG1

Rows – это, по мнение планировщика PostgreSQL, количество строк в данной таблице. Если попробуем сделать VACUUM FULL картина не изменится:

PG2

Можно выполнить:

VACUUM FULL VERBOSE ANALYZE;

Сборка мусора, анализ таблицы и вывод подробных данных:

PG3

Ладно, тыдыщхнем EXPLAIN ANALYZE, тут то ведь PostgreSQL должен показать правильное количество записей! (analyze непосредственно выполняет запрос)

PG4

Уф! Прям отлегло. Актуальные данные показывает правильно.

Бегло поискал в интернете – пишут, что это стандартное поведение, PostgreSQL считает, что пустая таблица – это нечто невообразимое, и она скоро заполнится данными. Поэтому планировщик и «добавляет» некоторое количество записей в таблицу.

Добавим одну запись в таблицу t1 и выполним EXPLAIN:

PG5

А теперь снова выполним VACUUM FULL VERBOSE ANALYZE:

PG6

Таблица t1 не пустая, планировщик показывает более-менее реальные данные – одну строку. Вот такая фича есть у PostgreSQL (десятая версия).

Надо будет поточнее поискать информацию, почему планировщик именно так работает.


Be the first to comment

Leave a Reply

Ваш Mail не будет опубликован.


*