【发布时间】:2016-12-06 20:13:00
【问题描述】:
我正在尝试在 postgreSQL 数据库中的两个表之间进行左连接,发现它需要大约 14 分钟才能运行。从现有的 SO 帖子来看,这种类型的连接似乎应该是几秒钟的量级,所以我想知道如何提高这种连接的性能。我正在使用8 GB RAM 的Windows 8 机器上运行64-bit postgreSQL version 9.4.4,使用pgAdmin III。表结构如下:
表 A:“parcels_qtr”:
包裹(文字)|年(整数)| qtr(文本)| lpid(pk,文本)|
有 1550 万行,每列都有索引,“lpid”是主键。我还通过标准的真空过程运行了这张表。
表 B:“postalvac_qtr”:
包裹(文字)|年(整数)| qtr(文本)| lpid (pk, 文本) | vacCountY (int) |
有 618,000 条记录,除“vacCountY”外的所有字段都被索引,“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 还很陌生,因此非常感谢耐心和解释!
【问题讨论】:
-
yr (int) | qtr (text)这看起来像年和季度,为什么不使用日期字段代替(丢失文本字段)并对其执行 date_trunc() ?all fields except "vacCountY" are indexed and "lpid" is the primary key.请学习一些有关数据建模的知识,数据库不应该是带有索引的电子表格。 -
嘿@joop,感谢有关日期字段的提示。我会试试的。我在这些其他字段上添加了索引,因为它们可能会参与未来查询的连接。关于数据建模,您建议我查看哪些资源?你有什么特别的书或教程吗?
-
从您的问题中不清楚您的表格是什么意思。 parcels_qtr 看起来像计数字段“vacCountY”的预聚合。什么是 lpid(用作连接字段)。
parcel (text) | yr (int) | qtr (text) | lpid (pk, text) | vacCountY (int) |是什么意思。与您的克林贡符号 IMHP 相比,这里的大多数人更喜欢普通的 sql DDL 表定义。 -
这种性能差异是否完全归因于打印数据:是的,查询需要 53 秒,其余时间用于获取和显示结果,假设有 1500 万行。
标签: sql database performance postgresql join