PostgreSQL 9.2 设置 enable_nestloop 没有效果
Posted
技术标签:
【中文标题】PostgreSQL 9.2 设置 enable_nestloop 没有效果【英文标题】:PostgreSQL 9.2 set enable_nestloop has no effect 【发布时间】:2015-09-17 09:46:00 【问题描述】:我尝试改变嵌套循环
set enable_nestloop=1
当我看时
show enable_nestloop;
enable_nestloop
-----------------
on
(1 row)
一切正常。但它没有效果。 如果在配置文件中更改此参数,然后从 cli 重新加载配置,一切正常。 为什么 set 对我不起作用?
【问题讨论】:
“没有效果”是什么意思? 查询计划没有改变 你确实看到了in the manual 的评论:“完全禁止嵌套循环连接是不可能的,但是如果有其他方法可用,关闭这个变量会阻止规划器使用一个"(加:默认是on
反正)
我的错误,不好的例子。我知道默认情况下它是“开启”的。对于某些查询,我需要在应用程序中将其设置为“关闭”,然后返回“打开”。也许你知道如何实现它?
如果您的查询速度较慢,最好发布查询并获得有关如何改进它的帮助:wiki.postgresql.org/wiki/Slow_Query_Questions
【参考方案1】:
enable_nestloop
是一个测试参数。默认情况下它是打开的,这就是为什么打开它没有效果。它在那里,因此您可以将其关闭 以告诉查询规划器“请不要使用嵌套循环,除非您没有其他方法来执行此查询”。它通过将嵌套循环的成本估算值强制很高来做到这一点。
这不是一个查询提示,您可以用它来表示“请为此查询使用嵌套循环”。这样不行。
强烈建议您不要将这些测试参数用于生产用途。现在强制执行计划可能会在以后产生不幸的后果。如果可能,请使用 random_page_cost
和 effective_cache_size
等成本参数来指导规划者选择最适合自己的计划。
如果您绝对必须在您的应用中使用这样的参数,请使用SET LOCAL
将它们设置在一个事务中。
没有办法为单个语句设置它们然后自动取消设置它们。这部分是因为它们不应该以这种方式使用。它们被设计为不作为查询提示。
【讨论】:
以上是关于PostgreSQL 9.2 设置 enable_nestloop 没有效果的主要内容,如果未能解决你的问题,请参考以下文章
Postgresql 9.2 错误与 group by 未出现在 postgresql 12 中
播放框架中未解决的 postgresql 9.2 jar 依赖关系