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_costeffective_cache_size 等成本参数来指导规划者选择最适合自己的计划。

如果您绝对必须在您的应用中使用这样的参数,请使用SET LOCAL 将它们设置在一个事务中。

没有办法为单个语句设置它们然后自动取消设置它们。这部分是因为它们不应该以这种方式使用。它们被设计为作为查询提示。

【讨论】:

以上是关于PostgreSQL 9.2 设置 enable_nestloop 没有效果的主要内容,如果未能解决你的问题,请参考以下文章

Postgresql 9.2 错误与 group by 未出现在 postgresql 12 中

播放框架中未解决的 postgresql 9.2 jar 依赖关系

如何在 PostgreSQL 9.2 中分析 plpgsql 函数

PostgreSQL 9.2 服务不断失败

PostgreSQL 9.2 归档恢复后最后重放的 WAL

将 CSV 文本数组导入 PostgreSQL 9.2