我EXPLAIN (ANALYZE, BUFFERS) SELECT ...
在我的 Postgres 9.3 服务器上运行。我最终Buffers: shared hit=166416 dirtied=2
在输出中看到了类似的东西。
从文档中,“脏”表示:
脏的块数表示此查询更改的先前未修改的块数;而写入的块数表示该后端在查询处理期间从缓存中逐出的先前脏块的数量。
这听起来像是将块标记为脏的过程应该只在更新数据时发生。SELECT
但是,我的查询是,并且只读取数据。我想它只会报告点击或阅读。我显然错了。但是,在这种情况下到底发生了什么?
我有一个总数据大小为 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)
我不知道从这里去哪里。有没有办法跟踪某些查询是否通常会为我知道的表产生未命中数?