【发布时间】:2011-03-05 04:10:33
【问题描述】:
我有两张桌子:A 和 P。我想从A 中的所有行中获取信息,这些行的id 位于我创建的临时表tmp_ids 中。但是,在P 表foo 中有关于A 的其他信息,我也想获得这些信息。我有以下查询:
SELECT A.H_id AS hid,
A.id AS aid,
P.foo, A.pos, A.size
FROM tmp_ids, P, A
WHERE tmp_ids.id = A.H_id
AND P.id = A.P_id
我注意到它运行缓慢,当我要求 Postgres 解释时,我注意到它结合了 tmp_ids 和我为 H_id 创建的 A 上的索引和嵌套循环。但是,它会在与第一次合并的结果进行哈希连接之前对所有 P 进行哈希处理。 P 相当大,我认为这一直是需要的。为什么它会在那里创建一个哈希? P.id 是P 的主键,A.P_id 有自己的索引。
更新:所有数据类型都是整数,除了 A.size 是双精度和 P.foo 这是 VARCHAR。我使用的是 PostgreSQL 8.4 版。
【问题讨论】:
-
您可能必须明确声明连接字段的数据类型
-
发布解释分析,或者更好的是,在explain.depesz.com 上发布解释并提供链接。还有,什么PG版本?
-
使用一些 DBMS,您可以强制循环连接,但我认为 PostrgresSQL 不可能。这有点可惜,因为在很多情况下,优化器无法计算出像您这样的数据现实。
-
@Pointy 您可以“设置 enable_hashjoin = false”,在这种情况下可能会这样做。
-
嗯,我意识到它正在散列的表 P 只有 43000 个条目,所以也许这不是查询运行缓慢的原因.. 可能是程序的另一部分
标签: sql optimization postgresql query-optimization