Ivan Voras Asked: 2016-08-11 02:59:51 +0800 CST2016-08-11 02:59:51 +0800 CST 2016-08-11 02:59:51 +0800 CST 在 PostgreSQL 中记录顺序扫描? 772 有没有办法记录在 PostgreSQL 中使用顺序扫描的查询?或者只是记录所有内容,然后再用 grep 进行 seqscans? postgresql performance 2 个回答 Voted dezso 2016-08-11T04:02:29+08:002016-08-11T04:02:29+08:00 我不知道只记录顺序扫描的方法。只是一个小评论:seqscans 不是邪恶的,你会一直得到它们(尤其是对于较小的表)。 另一方面,如果需要,您绝对可以记录所有内容,并且有多种方法。 最简单的可能是 [ALTER DATABASE yourdb ] SET log_statement TO 'all'; 这将记录通过解析器的每个查询: 注意:即使设置不记录包含简单语法错误的语句log_statement = all,因为只有在完成基本解析以确定语句类型后才会发出日志消息。在扩展查询协议的情况下,此设置同样不会记录在执行阶段之前失败的语句(即,在解析分析或计划期间)。设置log_min_error_statement为ERROR(或更低)以记录此类语句。 实现它的另一种有趣的方法是设置log_min_duration_statement为(非常)低的值: [ALTER DATABASE yourdb ] SET log_min_duration_statement TO 0; -- or somewhat higher 两者的区别在于后者还会注册传递给函数的实际参数。 笔记: 您需要超级用户权限才能更改这些设置 您可以同时使用两者。有关详细信息,请阅读上面链接的文档。 Best Answer Ivan Voras 2016-08-12T02:41:07+08:002016-08-12T02:41:07+08:00 答案似乎是在打开 auto_explain 模块 ( https://www.postgresql.org/docs/current/static/auto-explain.html )的情况下记录所有内容( 或者至少是长时间运行的查询) ,然后解析结果。
我不知道只记录顺序扫描的方法。只是一个小评论:seqscans 不是邪恶的,你会一直得到它们(尤其是对于较小的表)。
另一方面,如果需要,您绝对可以记录所有内容,并且有多种方法。
最简单的可能是
这将记录通过解析器的每个查询:
实现它的另一种有趣的方法是设置
log_min_duration_statement
为(非常)低的值:两者的区别在于后者还会注册传递给函数的实际参数。
笔记:
答案似乎是在打开 auto_explain 模块 ( https://www.postgresql.org/docs/current/static/auto-explain.html )的情况下记录所有内容( 或者至少是长时间运行的查询) ,然后解析结果。