使用pg_database_size减慢pg_stat_database查询

时间:2018-03-12 20:54:07

标签: postgresql

我定期使用以下查询来收集有关数据库使用情况的统计信息,通过查看日志,结果证明这是我们最慢的查询之一。这是CentOS上的PostgreSQL 9.3。

通过试验查询,看起来最慢的部分是pg_database_size()调用。任何可能导致此问题的想法以及如何提高查询的性能?

explain analyze SELECT datname, numbackends AS numdbclients, xact_commit, xact_rollback, blks_read, blks_hit, tup_returned, tup_fetched, tup_inserted, tup_updated, tup_deleted, pg_database_size ( datname ) AS size FROM pg_stat_database WHERE datname NOT IN ( 'postgres', 'template0', 'template1' ) ORDER BY xact_commit DESC;
                                                    QUERY PLAN
-------------------------------------------------------------------------------------------------------------------
 Sort  (cost=9.99..10.17 rows=71 width=68) (actual time=641.412..641.433 rows=84 loops=1)
   Sort Key: (pg_stat_get_db_xact_commit(d.oid))
   Sort Method: quicksort  Memory: 47kB
   ->  Seq Scan on pg_database d  (cost=0.00..7.80 rows=71 width=68) (actual time=20.284..641.285 rows=84 loops=1)
         Filter: (datname <> ALL ('{postgres,template0,template1}'::name[]))
         Rows Removed by Filter: 3
 Total runtime: 641.473 ms
(7 rows)

1 个答案:

答案 0 :(得分:3)

pg_database_size查看操作系统中的文件夹中的数据库的OID(想想运行ls -lR)如果该信息不在缓存中,它可能是相当昂贵的任务..虽然它不应该是结束世界。该信息不能在DB中缓冲缓存,或者在DB内以任何方式进行优化,它纯粹是一个操作系统任务。