我有两个表: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
有自己的索引。
更新:所有数据类型都是 INTEGER,除了 A.size
是 DOUBLE PRECISION 和 P.foo
是 VARCHAR。我使用的是 PostgreSQL 8.4 版。
最佳答案
查询规划器估计顺序读取所有数据并对其进行哈希处理比执行估计的 2100 次索引扫描及其相关的更多随机磁盘访问要快。
关于sql - 为什么 Postgres 在此查询中执行哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3065456/