提高简单左的生产力 join 在 postgreSQL
我正试图左边 join 在数据库中的两个表之间 postgreSQL 我发现它需要 14 分钟。 来自现有消息 SO 这似乎这型 join 必须有大约几秒钟,所以我想知道如何提高这个问题 join. 我推出
坐车
w/
, 使用
. 桌子的结构看起来像这样:
表A: "parcels_qtr":
包裹 /文本/ | 年 /㈡/ | 邻里 /文本/ | lpid /PK,文本/ |
它有 15.5 每列索引数百万条线路,并且 "lpid"- 这是主要键。 我还通过标准的真空过程花了这张表。
表: "postalvac_qtr":
包裹 /文本/ | 年 /㈡/ | 邻里 /文本/ | lpid /PK,文本/ | vacCountY /㈡/ |
它有 618 000 记录,所有字段除外 "vacCountY", 索引,A。 "lpid" 这是主要键。 它还通过标准的真空过程。
使用数据输出时,需要 14 分钟。 在工作时。
这需要一点点多。 第一个问题 - 这种性能的差异与数据的打印完全有关,或者在这里是别的吗?
第二个问题:我可以将这个执行时间减少几秒钟吗?
这是我的代码 SQL:
以下是我的解释性陈述的结果:
https://explain.depesz.com/s/uKkK
我是新的 postgreSQL, 因此,耐心和解释将非常感激!
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, 因此,耐心和解释将非常感激!
没有找到相关结果
已邀请:
1 个回复
冰洋
赞同来自:
读在整个表中 /
/
建造 hash 基于
读得完全不同,更大,更大,表 /
/
Hash 每个都是 15 毫米。
C并将它们与现有表进行比较 hash
这些桌子有多大? 您可以通过发出来查看:
我几乎确定这一点 hash join 溅在磁盘上,以及它是如何结构的 /"让我
全部
来自这两个表的数据"/, 不能另行。
索引没有帮助,不能。 虽然您完全询问整个表,但使用索引只会慢下来的工作Postgres,无论如何都必须完全通过整个表,所以它也可以提供连续扫描。
至于那个 , 为什么请求具有其他性能而不是
, 我怀疑你是对的。 组合1 - 发送 15M 您的客户端和2-traint显示它将导致上面和实际请求之外的重大放缓。
那么,你能做什么?
首先,试图提出这个要求? 你多久想捕获一次
全部
这些两个表中的数据完全没有过滤? 如果这是非常普遍的,您可以考虑回到要求阶段并找到另一种满足这种需求的方法。 /例如,它是否是合理的,而不是抓住一年和季度的所有数据?/. 如果这是不寻常的 /让我们说每日出口/, 那 1-14min 可能很好。
其次,您必须确保您的表格不臃肿。 如果您遇到大量交通
或者
在您的桌子上,它可以随着时间的推移增加它们。 恶魔 autovacuum 存在帮助应对这一点,但有时会发布
也有帮助。
第三,您可以尝试配置配置。 DB. 在
有类似预期数量的参数。 RAM, 您的服务器可以用于磁盘缓存和数字 RAM, 哪个服务器可以使用或联合起来 /在它溅在磁盘之前/. 使用此类参数,您可以提高速度。
第四,您可以修改您的计划。 你想要一年和季度是两个单独的列,还是你最好使用一个类型的列
? 你需要一把钥匙
, 或者你最好使用
/串行或列衍生物
/, 哪个很可能是 join 快点? 李领域
,
和
在两个表中需要或它们复制一张表中的数据?
无论如何,我希望它会有所帮助。