【发布时间】:2022-10-29 23:55:14
【问题描述】:
在 PostgreSQL 中,我们可以在查询上使用“EXPLAIN ANALYZE”来获取给定 SQL Query 的查询计划。虽然这很有用,但我们是否能够获得有关优化器生成(并随后丢弃)的其他候选计划的信息?
这样我们就可以自己对 DBMS 生成的一些候选(例如前 3 个)进行分析。
【问题讨论】:
标签: postgresql query-optimization rdbms query-planner
在 PostgreSQL 中,我们可以在查询上使用“EXPLAIN ANALYZE”来获取给定 SQL Query 的查询计划。虽然这很有用,但我们是否能够获得有关优化器生成(并随后丢弃)的其他候选计划的信息?
这样我们就可以自己对 DBMS 生成的一些候选(例如前 3 个)进行分析。
【问题讨论】:
标签: postgresql query-optimization rdbms query-planner
不会。计划者会尽早放弃初始计划,甚至在它们完全形成之前。一旦它决定一个计划不可能是最好的,它就永远不会完成它的构建,因此它无法显示它。
您通常可以使用各种 enable_* 设置或 *_cost 设置来强制它做出不同的选择并为此显示计划,但很难准确控制不同的选择是什么。
您还可以暂时删除一个索引,看看没有该索引会做什么。如果您在事务中 DROP 索引,然后执行 EXPLAIN,然后 ROLLBACK 事务,它将回滚 DROP INDEX,以便不需要重建索引,它只会被恢复。但请注意,DROP INDEX 会在表上采取强锁并保持它直到 ROLLBACK,因此这种方法并非完全没有后果。
如果您只想查看其他计划是什么,您只需要 EXPLAIN,而不是 EXPLAIN ANALYZE。这更快,如果语句有副作用,也更安全。
【讨论】: