我已使用EXPLAIN
验证了所有查询,并在计划中显示了索引扫描节点。
但是,当我在表pg_stat_user_tables
中看到统计信息时,我看到seq_scan
的非零值。
PostgreSQL可能正在进行位图堆扫描,而不仅仅是索引扫描,但我不完全确定。
我有以下问题:
上面的统计信息表中位图堆扫描是否计为seq_scan
?
如何识别执行顺序扫描的查询?数据库的流量不均匀,因此监控pg_stat_activity
无效。
答案 0 :(得分:0)
位图索引扫描在idx_scan
下计算。
查找执行顺序扫描的查询更难。
让我们假设表格相当大,以便顺序扫描需要一定的时间(对于这个答案,我假设至少500毫秒,但这可能是不同的)。如果顺序扫描很短,你就不会担心。
现在将auto_explain
放入shared_preload_libraries
并将以下参数添加到postgresql.conf
:
auto_explain.log_min_duration = 500
auto_explain.log_nested_statements = on
然后重启服务器。
现在,您将获得PostgreSQL日志中超过500毫秒持续时间的所有语句的执行计划,您应该能够找到该查询。
顺便说一句,顺序扫描并不总是你应该担心的事情。如果它们很少发生,那通常很好。您可能正在寻找使用pg_dump
的自己的数据库备份!只有经常发生的昂贵的顺序扫描才是问题。