March 23, 2010

В ожидании 9.0 (8.5) - Информация об использовании буферов в EXPLAIN

Перевод Waiting for 8.5 – buffers info for explain с select * from depesz;

(В январе 2010 г. команда разработчиков решила, что следующая версия PostgreSQL будет нумероваться 9.0, а не 8.5)


Сегодня речь пойдёт о маленьком, но (по крайней мере для меня) действительно полезном патче. Принял его 15 декабря Robert Haas, а сделал Itagaki Takahiro:

Добавляет опцию EXPLAIN (BUFFERS) для отображения статистики
использования буферов.

Патч также убирает эту статистику из вывода track_counts, т.к. EXPLAIN
(или глобальная статистика) теперь считается лучшим местом для такой
информации.

Itagaki Takahiro, проверено Euler Taveira de Oliveira.


Давайте посмотрим о чём это:

# explain ( analyze on, buffers on ) select count(*) from pg_attribute ;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
Aggregate (cost=64.70..64.71 rows=1 width=0) (actual time=0.466..0.466 rows=1 loops=1)
Buffers: shared hit=18 read=21
-> Seq Scan on pg_attribute (cost=0.00..59.56 rows=2056 width=0) (actual time=0.002..0.301 rows=2002 loops=1)
Buffers: shared hit=18 read=21
Total runtime: 0.492 ms
(5 rows)


Как легко заметить Postgres-у надо было прочитать 39 страниц 18 из которых уже были в разделяемой памяти. Обычно, когда запускаешь такие запросы 2-й раз, они выполняются быстрее потому что страницы кешируются. Давайте посмотрим:

# explain ( analyze on, buffers on ) select count(*) from pg_attribute ;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
Aggregate (cost=64.70..64.71 rows=1 width=0) (actual time=0.325..0.325 rows=1 loops=1)
Buffers: shared hit=39
-> Seq Scan on pg_attribute (cost=0.00..59.56 rows=2056 width=0) (actual time=0.004..0.171 rows=2002 loops=1)
Buffers: shared hit=39
Total runtime: 0.353 ms
(5 rows)


Отлично. Теперь видно что все страницы взяты из кеша.

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

Эта возможность также распространяется на расширение auto explain - теперь можно установить GUC переменную auto_explain.log_buffers, но будьте осторожны, т.к. она используется совместно с ANALYZE.

No comments:

Post a Comment