我的应用程序中有一个查询,当我的表中有大量行时,它运行得非常快.但是当行数是中等大小(既不大也不小)时 - 相同的查询运行速度要慢15倍.
解释计划显示对中型数据集的查询使用嵌套循环作为其连接算法.大数据集使用散列连接.
我可以阻止查询规划器在数据库级别(postgresql.conf)或每个session(SET enable_nestloop TO off
)使用嵌套循环.
有哪些潜在的陷阱set enable_nestloop to off
?
其他信息:PostgreSQL 8.2.6,在Windows上运行.
什么是设置的潜在陷阱
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
与INDEX SCAN
上user.id
和INDEX SCAN
上profile.id
,只要您建立在这些领域的指标.
具有低选择性过滤器的查询(即,需要多于10%
来自其使用的表的数据的查询)将受益于MERGE JOINS
和HASH JOINS
.
但是像上面给出的查询需要NESTED LOOPS
高效运行.
如果您在此处发布查询和表定义,则可能会对索引和查询性能做很多事情.