如何识别在 Postgres 中产生缓存未命中的查询?

D-R*_*ock 5 postgresql cache

我有一个总数据大小为 115GB 的 Postgres 数据库。服务器有~60GB 的内存。索引缓存命中率保持在 99% 以上,但表缓存命中率已降至约 97%。

我试图确定是否有我们正在制作的特定查询或访问模式导致下降。如果是这样,我们也许能够优化应用程序。

我使用以下查询来识别命中率低的表...

SELECT relname,
  CASE (sum(heap_blks_hit) + sum(heap_blks_read))
    WHEN 0 THEN 1
    ELSE sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read))
  END as hitrate, 
  pg_size_pretty(sum(heap_blks_hit) + sum(heap_blks_read)) AS total_read,
  pg_size_pretty(sum(heap_blks_read)) AS total_miss
  FROM pg_statio_user_tables
  GROUP BY relname
  ORDER BY hitrate
Run Code Online (Sandbox Code Playgroud)

我不知道从这里去哪里。有没有办法跟踪某些查询是否通常会为我知道的表产生未命中数?

jja*_*nes 3

pg_stat_statements扩展完全符合您的要求,为每个语句提供块命中和未命中。

然而,我通常认为这些信息没有多大用处。许多块未命中实际上是由文件系统缓存提供的,而不是实际从磁盘读取的。PostgreSQL 没有提供直接的方法来辨别这些类型的未命中。

我认为最好的办法是打开电源track_io_timing,然后查看服务这些未命中所花费的时间,而不是原始未命中数。