我们有一个繁忙的 PostgreSQL 9.5 服务器,具有类似 OLTP 的流量,pg_stat_all_tables.idx_scan
当我们遇到性能问题时,值会以相当大的速度上升。
那(idx_scan
增加)实际上是否意味着
- 系统实际上正在通过索引运行大量完整扫描(这意味着,如果尚未在缓存中,则从磁盘读取整个索引),或者
- 系统实际上只是从这些索引中获取一些元组(“行”)(即,按预期使用索引)?
如果选项 1 为真,如何弄清楚如何让系统进入状态 2?我需要一些额外的索引还是我的一些查询不好?当系统处于低负载状态时,所有查询都会获得很好的性能,但在非常高负载期间,几乎任何查询都可能会意外地缩短执行时间。
(https://www.postgresql.org/docs/current/monitoring-stats.html上的文档仅说“在此表上启动的索引扫描数”。)
每当使用索引时,都算作一次索引扫描。全索引扫描没有单独的计数器。您可以将 idx_scan 与 idx_tup_fetch 进行比较,并查看每次扫描平均如何从索引返回任何行。但重点是什么?在大多数情况下,它会获取完成您分配给它的工作所需的行数。也许您缺少一个可以更好地完成工作的索引,但是查看此统计数据不会告诉您情况是否如此,也不会告诉您可能是什么假设索引。
我做了很多性能调查,几乎从不查看这些值,除非我试图调整/调试 autovac。
EXPLAIN (ANALYZE, BUFFERS)
,pg_stat_statements
,auto_explain
是适合这项工作的工具。