提高简单左的生产力 join 在 postgreSQL

我正试图左边 join 在数据库中的两个表之间 postgreSQL 我发现它需要 14 分钟。 来自现有消息 SO 这似乎这型 join 必须有大约几秒钟,所以我想知道如何提高这个问题 join. 我推出
64-bit


postgreSQL version 9.4.4

坐车
Windows 8

w/
8 GB RAM

, 使用
pgAdmin III

. 桌子的结构看起来像这样:

表A: "parcels_qtr":

包裹 /文本/ | 年 /㈡/ | 邻里 /文本/ | lpid /PK,文本/ |

它有 15.5 每列索引数百万条线路,并且 "lpid"- 这是主要键。 我还通过标准的真空过程花了这张表。

表: "postalvac_qtr":

包裹 /文本/ | 年 /㈡/ | 邻里 /文本/ | lpid /PK,文本/ | vacCountY /㈡/ |

它有 618 000 记录,所有字段除外 "vacCountY", 索引,A。 "lpid" 这是主要键。 它还通过标准的真空过程。

使用数据输出时,需要 14 分钟。 在工作时。
explain /analyze, buffers/

这需要一点点多。 第一个问题 - 这种性能的差异与数据的打印完全有关,或者在这里是别的吗?

第二个问题:我可以将这个执行时间减少几秒钟吗?

这是我的代码 SQL:


EXPLAIN /ANALYZE, BUFFERS/
select a.parcel,
a.lpid,
a.yr,
a.qtr,
b."vacCountY"
from parcels_qtr as a
left join postalvac_qtr as b
on a.lpid = b.lpid;


以下是我的解释性陈述的结果:
https://explain.depesz.com/s/uKkK
我是新的 postgreSQL, 因此,耐心和解释将非常感激!
已邀请:

冰洋

赞同来自:

你问 DB 做了很多工作。 只是看解释计划,它是:

读在整个表中 /
postalvac_qtr

/

建造 hash 基于
lpid


读得完全不同,更大,更大,表 /
parcels_qtr

/

Hash 每个都是 15 毫米。
lpid

C并将它们与现有表进行比较 hash

这些桌子有多大? 您可以通过发出来查看:


SELECT pg_size_pretty/pg_relation_size/'parcels_qtr'//;


我几乎确定这一点 hash join 溅在磁盘上,以及它是如何结构的 /"让我

全部

来自这两个表的数据"/, 不能另行。

索引没有帮助,不能。 虽然您完全询问整个表,但使用索引只会慢下来的工作Postgres,无论如何都必须完全通过整个表,所以它也可以提供连续扫描。

至于那个 , 为什么请求具有其他性能而不是
explain analyze

, 我怀疑你是对的。 组合1 - 发送 15M 您的客户端和2-traint显示它将导致上面和实际请求之外的重大放缓。

那么,你能做什么?

首先,试图提出这个要求? 你多久想捕获一次

全部

这些两个表中的数据完全没有过滤? 如果这是非常普遍的,您可以考虑回到要求阶段并找到另一种满足这种需求的方法。 /例如,它是否是合理的,而不是抓住一年和季度的所有数据?/. 如果这是不寻常的 /让我们说每日出口/, 那 1-14min 可能很好。

其次,您必须确保您的表格不臃肿。 如果您遇到大量交通
update

或者
delete

在您的桌子上,它可以随着时间的推移增加它们。 恶魔 autovacuum 存在帮助应对这一点,但有时会发布
vacuum full

也有帮助。

第三,您可以尝试配置配置。 DB. 在
postgresql.conf

有类似预期数量的参数。 RAM, 您的服务器可以用于磁盘缓存和数字 RAM, 哪个服务器可以使用或联合起来 /在它溅在磁盘之前/. 使用此类参数,您可以提高速度。

第四,您可以修改您的计划。 你想要一年和季度是两个单独的列,还是你最好使用一个类型的列
date

? 你需要一把钥匙
text

, 或者你最好使用
bigint

/串行或列衍生物
text

/, 哪个很可能是 join 快点? 李领域
parcel

,
yr


qtr

在两个表中需要或它们复制一张表中的数据?

无论如何,我希望它会有所帮助。

要回复问题请先登录注册