Эрвин, так как это было нашей дискуссией в ветке комментариев, я решил еще немного ...
У меня очень простой запрос из таблицы разумного размера. Обычно у меня достаточно work_mem
, но в этом случае я использовал команды
SET work_mem = 64;
установить очень маленький work_mem
и
SET work_mem = default;
чтобы моя work_mem
спина была достаточно большой для моего запроса.
ОБЪЯСНИТЬ и перепроверить состояние
Итак, выполнение моего запроса только EXPLAIN
с
EXPLAIN
SELECT * FROM olap.reading_facts
WHERE meter < 20;
Я получил результаты для низких и высоких work_mem
:
Низкий work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
Высоко work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32)
Recheck Cond: (meter < 20)
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0)
Index Cond: (meter < 20)
Короче говоря, EXPLAIN
только для того, чтобы, как и ожидалось, план запроса указывает, что условие перепроверки возможно, но мы не можем знать, будет ли фактически вычислено.
ОБЪЯСНИТЕ АНАЛИЗ И ПРОВЕРЬТЕ СОСТОЯНИЕ
Когда мы включаем ANALYZE
в запрос, результаты говорят нам больше о том, что нам нужно знать.
Низкий work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=3.130..13.946 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Rows Removed by Index Recheck: 86727
Heap Blocks: exact=598 lossy=836
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=3.066..3.066 rows=51840 loops=1)
Index Cond: (meter < 20)
Высоко work_mem
Bitmap Heap Scan on reading_facts (cost=898.92..85632.60 rows=47804 width=32) (actual time=2.647..7.247 rows=51840 loops=1)
Recheck Cond: (meter < 20)
Heap Blocks: exact=1434
-> Bitmap Index Scan on idx_meter_reading_facts (cost=0.00..886.96 rows=47804 width=0) (actual time=2.496..2.496 rows=51840 loops=1)
Index Cond: (meter < 20)
Опять же, как и ожидалось, включение ANALYZE
открывает нам некоторую очень важную информацию. В нижнем work_mem
регистре мы видим, что при повторной проверке индекса есть строки, и у нас есть lossy
куча блоков.
Вывод? (или отсутствие таковых)
К сожалению, похоже , EXPLAIN
сама по себе не достаточно , чтобы знать , будет ли индекс перепроверка быть на самом деле необходима , так как некоторые из строки идентификаторов, исчезают в пользу сохранения страниц во время растровых кучного сканирования.
Использование EXPLAIN ANALYZE
подходит для диагностики проблем с запросами средней длины, но в случае, если выполнение запроса занимает очень много времени, затем EXPLAIN ANALYZE
обнаружение того, что ваш растровый индекс преобразуется в потерю из-за недостаточности work_mem
, все еще является трудным ограничением. Хотелось бы, чтобы был способ EXPLAIN
оценить вероятность этого явления из таблицы статистики.