Есть ли способ получить postgres показать фактический ввод-вывод для запроса - PullRequest
9 голосов
/ 02 июня 2011

Я знаю, что с EXPLAIN ANALYZE я могу получить прогнозируемую стоимость и фактическое время выполнения (в разных единицах, ах!), Но есть ли способ заставить Postgres сказать мне, сколько ввода / вывода (логическое или физическое ) что нужно сделать, чтобы удовлетворить запрос?

(я ищу эквивалент «установить статистику io on» для Sybase или MS SQL Server.)

Ответы [ 4 ]

10 голосов
/ 19 августа 2015

Этот ответ не связан напрямую с конкретным оператором запроса, но помогает тем, кто закончил здесь, при поиске способа показать «диск против кэша»:

-- perform a "select pg_stat_reset();" when you want to reset counter statistics
with 
all_tables as
(
SELECT  *
FROM    (
    SELECT  'all'::text as table_name, 
        sum( (coalesce(heap_blks_read,0) + coalesce(idx_blks_read,0) + coalesce(toast_blks_read,0) + coalesce(tidx_blks_read,0)) ) as from_disk, 
        sum( (coalesce(heap_blks_hit,0)  + coalesce(idx_blks_hit,0)  + coalesce(toast_blks_hit,0)  + coalesce(tidx_blks_hit,0))  ) as from_cache    
    FROM    pg_statio_all_tables  --> change to pg_statio_USER_tables if you want to check only user tables (excluding postgres's own tables)
    ) a
WHERE   (from_disk + from_cache) > 0 -- discard tables without hits
),
tables as 
(
SELECT  *
FROM    (
    SELECT  relname as table_name, 
        ( (coalesce(heap_blks_read,0) + coalesce(idx_blks_read,0) + coalesce(toast_blks_read,0) + coalesce(tidx_blks_read,0)) ) as from_disk, 
        ( (coalesce(heap_blks_hit,0)  + coalesce(idx_blks_hit,0)  + coalesce(toast_blks_hit,0)  + coalesce(tidx_blks_hit,0))  ) as from_cache    
    FROM    pg_statio_all_tables --> change to pg_statio_USER_tables if you want to check only user tables (excluding postgres's own tables)
    ) a
WHERE   (from_disk + from_cache) > 0 -- discard tables without hits
)
SELECT  table_name as "table name",
    from_disk as "disk hits",
    round((from_disk::numeric / (from_disk + from_cache)::numeric)*100.0,2) as "% disk hits",
    round((from_cache::numeric / (from_disk + from_cache)::numeric)*100.0,2) as "% cache hits",
    (from_disk + from_cache) as "total hits"
FROM    (SELECT * FROM all_tables UNION ALL SELECT * FROM tables) a
ORDER   BY (case when table_name = 'all' then 0 else 1 end), from_disk desc

enter image description here

9 голосов
/ 04 июня 2011

Начиная с PostgreSQL 9.0, вы можете выполнить:

EXPLAIN (ANALYZE ON, BUFFERS ON) SELECT ...

И это покажет вам, как оператор взаимодействует с кешем PostgreSQL. В случаях, когда это сообщает об отсутствии кэша, это будет вызов ОС для чтения чего-либо. Вы не можете быть уверены, что это физический ввод-вывод, потому что он может быть в кеше ОС. Но это, вероятно, больше похоже на то, что вы ищете здесь, чем на попытку взглянуть на информацию pg_stat_ *.

1 голос
/ 02 июня 2011

Не совсем так, поскольку PostgreSQL также сильно зависит от кеша ОС и не может знать, что там происходит. Семейство представлений pg_statio * в pg_catalog продолжает вести подсчет обращений и фактических чтений, но эти чтения могли попасть в кэш ОС.

1 голос
/ 02 июня 2011

К сожалению, нет ничего проще, чем SET STATISTICS IO ON для PostgreSQL. Однако статистика ввода-вывода доступна через системные каталоги pg_statio_*. Он не идеален, поскольку данные не попадают в сессию, но если вы хотите увидеть, насколько эффективны запросы в чистой комнате, они работают достаточно хорошо для большинства проблем.

http://www.postgresql.org/docs/current/static/monitoring-stats.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...