有没有办法将执行计划保存在 PostgreSQL 的文件中?

zli*_*i89 2 postgresql optimization execution-plan

通过将计划保存在文件中,我并不是要查看它,而是强制优化器使用保存的计划来执行某些查询。

例如,如果优化器选择对两表查询进行哈希连接,而我设法强制优化器使用嵌套循环连接,是否有任何方法可以保存嵌套循环连接计划并让优化器接下来使用它我执行相同查询的时间?

Cra*_*ger 7

不,无法将查询计划保存到磁盘、强制执行查询计划等。

修正您的优化器参数并确保您的统计数据准确无误。您没有费心提及您的版本、显示explain analyze输出等,因此我无法详细帮助您。从这里开始:

http://wiki.postgresql.org/wiki/Slow_Query_Questions

检查您的行数估计与explain analyze输出中的实际结果。http://explain.depesz.com/使这更容易。

检查成本估算是否反映现实。如果您的随机 I/O 比 PostgreSQL 的估计更快或更慢,请考虑调整random_page_cost/ seq_page_cost。还要确保effective_page_size合理反映可用于缓存的 RAM 量。

如果根据手册和调优指南进行适当的更改后仍然有问题,请向 pgsql-peform 邮件列表报告问题的详细描述和自包含的测试用例。

看:

我个人的观点是 PostgreSQL 没有提示的政策(除了实际上有提示,它们只是比实际提示更丑陋的黑客)是对用户怀有敌意和毫无意义的。大多数用户会使用他们可以使用的任何技巧来避免真正理解基于成本的优化器,所以我们只是强迫他们使用更丑陋的技巧。想要理解并正确执行的用户仍然会发现优化器有时会产生不适当的结果,虽然修复这些结果很好,但同时对这些用户有一个解决方法也有好处。并且是基于成本的优化器纯粹主义者的用户不必使用任何现有的提示功能,包括已经存在的非提示功能。

这使我特别有共同的表表达式,其中PostgreSQL的作为优化围栏他们的离奇解释坚果引起我们痛苦和苦难的道路时,我们要开始优化放进去,但发现大家都在用它们作为一种查询我们没有的查询提示的提示解决方法。

不提示的例子包括:

  • enable_参数
  • OFFSET 0
  • CTE 术语的优化栅栏