将enable_nestloop设置为OFF有什么缺陷

cod*_*ger 11 postgresql

我的应用程序中有一个查询,当我的表中有大量行时,它运行得非常快.但是当行数是中等大小(既不大也不小)时 - 相同的查询运行速度要慢15倍.

解释计划显示对中型数据集的查询使用嵌套循环作为其连接算法.大数据集使用散列连接.

我可以阻止查询规划器在数据库级别(postgresql.conf)或每个session(SET enable_nestloop TO off)使用嵌套循环.

有哪些潜在的陷阱set enable_nestloop to off

其他信息:PostgreSQL 8.2.6,在Windows上运行.

Qua*_*noi 9

什么是设置的潜在陷阱enable_nestloopoff

这意味着您永远无法有效地使用索引.

而且你好像现在都不使用它们.

像这样的查询:

SELECT u.name, p.name
FROM users u
JOIN profiles p ON p.id = u.profile_id
WHERE u.id = :id
Run Code Online (Sandbox Code Playgroud)

将最有可能使用NESTED LOOPSINDEX SCANuser.idINDEX SCANprofile.id,只要您建立在这些领域的指标.

具有低选择性过滤器的查询(即,需要多于10%来自其使用的表的数据的查询)将受益于MERGE JOINSHASH JOINS.

但是像上面给出的查询需要NESTED LOOPS高效运行.

如果您在此处发布查询和表定义,则可能会对索引和查询性能做很多事情.


Mil*_*dev 5

在采取如此严厉的措施之前需要考虑以下几点:

  • 将您的安装升级到最新的 8.2.x(现在是 8.2.12)。更好 - 考虑升级到下一个稳定版本 8.3 (8.3.6)。

  • 考虑将您的生产平台更改为 Windows 以外的平台。PostgreSQL 的 Windows 端口虽然对开发目的非常有用,但仍然无法与 Un*x 的端口相提并论。

  • 阅读“规划器方法配置”的第一段。这个wiki 页面可能也会有所帮助。