2009-02-27 36 views
6

我的应用程序中有一个查询,当我的表中有大量行时,查询运行速度非常快。但是,当行数是中等大小(既不大也不小)时,相同的查询运行速度会慢15倍。将enable_nestloop设置为OFF有什么缺陷

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

我可以阻止查询计划程序在数据库级别(postgresql.conf)或每个会话(SET enable_nestloop TO off)上使用嵌套循环。

set enable_nestloop to off有什么潜在的缺陷?

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

回答

7

enable_nestloop设置为off有什么潜在的缺陷?

这意味着你将永远无法有效地使用索引。

而现在看来你并没有使用它们。

像这样的查询:

SELECT u.name, p.name 
FROM users u 
JOIN profiles p ON p.id = u.profile_id 
WHERE u.id = :id 

将最有可能使用NESTED LOOPS与上user.idprofile.id一个,只要您建立在这些领域的指标。

具有低选择性过滤器的查询(也就是说,查询所需的数据超过10%)将受益于MERGE JOINSHASH JOINS

但是,像上面给出的查询需要NESTED LOOPS有效运行。

如果您在此处发布您的查询和表定义,可能会对索引和查询性能做很多工作。

4

有几件事情采取这样严厉的措施之前,需要考虑:

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

  • 考虑将您的生产平台更改为Windows以外的其他平台。 PostgreSQL的Windows端口尽管对于开发目的非常有用,但仍然与Un * x不兼容。

  • 阅读“Planner Method Configuration”的第一段。这个wiki page可能也会有帮助。

1

我有完全相同的经历。一些大型数据库的查询使用嵌套循环执行,耗时12小时!当它关闭嵌套循环或删除索引时运行时间为30秒。

有提示将是非常好的位置,但我想

... 
SET ENABLE_NESTLOOP TO FALSE; 
... critical query 
SET ENABLE_NESTLOOP TO TRUE; 
... 

来处理这件事。所以你可以肯定禁用和重新启用嵌套循环使用,你不能争论9000倍的速度增加:)

我遇到的一个问题是在PgSQL/PL过程中更改ENABLE_NESTLOOP。我可以在Aqua Data Studio中运行SQL脚本,但是当我将它放在PgSQL/PL过程中时,它仍然需要12个小时。显然它忽略了这种变化。

相关问题