Продолжаю экспериментировать с PostgreSQL. На этот раз я совершенно случайно наткнулся на странное поведение планировщика PostgreSQL. При определенных стечениях обстоятельств, он показывает даже отдаленно не правильную информацию.
Ситуация – создал пустую таблицу. И выполнил explain. Результат меня удивил. По шагам воспроизведу ситуацию ниже и поделюсь той информацией, которую нашел в интернете.
Определение количества строк в пустой таблице
Создадим пустую таблицу:
CREATE TABLE t1 (id integer);
И сразу посмотрим план запроса всех записей из данной таблицы:
EXPLAIN SELECT * FROM t1;
Rows – это, по мнение планировщика PostgreSQL, количество строк в данной таблице. Если попробуем сделать VACUUM FULL картина не изменится:
Можно выполнить:
VACUUM FULL VERBOSE ANALYZE;
Сборка мусора, анализ таблицы и вывод подробных данных:
Ладно, тыдыщхнем EXPLAIN ANALYZE, тут то ведь PostgreSQL должен показать правильное количество записей! (analyze непосредственно выполняет запрос)
Уф! Прям отлегло. Актуальные данные показывает правильно.
Бегло поискал в интернете – пишут, что это стандартное поведение, PostgreSQL считает, что пустая таблица – это нечто невообразимое, и она скоро заполнится данными. Поэтому планировщик и «добавляет» некоторое количество записей в таблицу.
Добавим одну запись в таблицу t1 и выполним EXPLAIN:
А теперь снова выполним VACUUM FULL VERBOSE ANALYZE:
Таблица t1 не пустая, планировщик показывает более-менее реальные данные – одну строку. Вот такая фича есть у PostgreSQL (десятая версия).
Надо будет поточнее поискать информацию, почему планировщик именно так работает.
Leave a Reply