Postgres HashAggregate运行缓慢

时间:2018-02-05 21:46:10

标签: postgresql query-optimization

下面的查询是在一个非常大的表(300MM行)上运行,并且运行时间不到半秒。

self.cardView.transform = CGAffineTransform.identity

以下是执行计划:

SELECT  ld.user_profile_id,
        CASE WHEN ld.first_name IS NULL THEN '' ELSE UPPER(first_name) END as first_name,
        CASE WHEN ld.last_name IS NULL THEN '' ELSE UPPER(ld.last_name) END as last_name
FROM data ld
WHERE ld.hashed_ssn = 'xxxx'

UNION

SELECT  ld.user_profile_id,
        CASE WHEN ld.first_name IS NULL THEN '' ELSE UPPER(first_name) END as first_name,
        CASE WHEN ld.last_name IS NULL THEN '' ELSE UPPER(ld.last_name) END as last_name
FROM data ld
WHERE ld.email = '123@GMAIL.COM'

UNION

SELECT  ld.user_profile_id,
        CASE WHEN ld.first_name IS NULL THEN '' ELSE UPPER(first_name) END as first_name,
        CASE WHEN ld.last_name IS NULL THEN '' ELSE UPPER(ld.last_name) END as last_name
FROM data ld
WHERE ld.home_phone = '5512345678';

我确实为hashed_ssn,电子邮件和手机添加了索引,但是我仍然没有达到我正在寻找的速度。这只是因为桌子那么大吗?有关如何加快此查询的任何建议吗?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您正在检索大约400行,这些行随机位于磁盘上。这需要大约1000个IO操作,其速度将取决于您的存储可提供多少IOPS。

如果您的表不经常更改,则可以强制它将相同hashed_ssn的数据行存储在彼此附近。这样查询就不必从存储中检索那么多随机块。

alter table data cluster on hashed_ssn_index_data;
cluster data;

这将花费相当多的时间并且即使对于读取也会阻止该表。数据库不会尝试在插入/更新时保留此顺序或行,因此如果您要更改数据,性能将逐渐降低。但您可以定期重新运行cluster data;