sql - 为什么 Postgres 在此查询中执行哈希?

标签 sql optimization postgresql query-optimization

我有两个表:AP。我想从 A 中的所有行中获取信息,其 ID 在我创建的临时表 tmp_ids 中。但是,Pfoo 中有关于 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.idP的主键,A.P_id有自己的索引。

更新:所有数据类型都是 INTEGER,除了 A.size 是 DOUBLE PRECISION 和 P.foo 是 VARCHAR。我使用的是 PostgreSQL 8.4 版。

这是解释:http://explain.depesz.com/s/WBo .

最佳答案

查询规划器估计顺序读取所有数据并对其进行哈希处理比执行估计的 2100 次索引扫描及其相关的更多随机磁盘访问要快。

关于sql - 为什么 Postgres 在此查询中执行哈希?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3065456/

相关文章:

sql - 在没有匹配的 JOINed 记录时指定默认值

javascript - Web 浏览器中的 SQL 数据库存储 Javascript/HTML5

c++ - 从位数组中提取任何更聪明的方法?

java - 创建多个 "throwaway"对象是否影响性能

sql - 使用顺序扫描而不是索引扫描的 SELECT

ruby-on-rails - Gitlab 架构 - Rails Postgresql

sql - 在 postgresql 9.5 中是否可以从 WITH 查询中插入冲突更新?

sql - 重复键值违反唯一约束且冲突不起作用

MySQL CLAUSE可以变成一个值吗?

ruby-on-rails - 如何将 Rails #update_attribute 与数组字段一起使用?