从 tbl_5billion_rows 中选择 max(sort_key) 耗时太长

Posted

技术标签:

【中文标题】从 tbl_5billion_rows 中选择 max(sort_key) 耗时太长【英文标题】:Select max(sort_key) from tbl_5billion_rows taking too long 【发布时间】:2016-09-15 17:07:42 【问题描述】:

我有 50 亿行的 redshift 表,在不久的将来会增长很多。当我运行一个简单的查询select max(sort_key) from tbl 需要 30 秒。 我的表中只有一个排序键。我最近在表上运行了真空和分析。我担心 30 秒的原因是,我在我的表中多次使用 max(sort_key)子查询。 有什么我遗漏的吗?

输出解释 select max(sort_key) from tbl

XN Aggregate  (cost=55516326.40..55516326.40 rows=1 width=4)
  ->  XN Seq Scan on tbl  (cost=0.00..44413061.12 rows=4441306112 width=4)

输出解释 select sort_key from tbl order by sortkey desc limit 1

XN Limit  (cost=1000756095433.11..1000756095433.11 rows=1 width=4)
->  XN Merge  (cost=1000756095433.11..1000767198698.39 rows=4441306112 width=4)
        Merge Key: sort_key
        ->  XN Network  (cost=1000756095433.11..1000767198698.39 rows=4441306112 width=4)
              Send to leader
              ->  XN Sort  (cost=1000756095433.11..1000767198698.39 rows=4441306112 width=4)
                    Sort Key: sort_key
                    ->  XN Seq Scan on tbl  (cost=0.00..44413061.12 rows=4441306112 width=4)

【问题讨论】:

是否有很多行(sort_keys)具有相同的值? @kometen 对于排序键的每个值可能为 1000。 另一种查询是“select sort_key order by sort_key desc limit 1;”。它可能不会跑得更快。你能添加“解释分析 select max(sort_key) from tbl;”的输出吗?你的问题? 您是否对 postgresql.conf 进行了更改?如果没有,您可以将wiki.postgresql.org/wiki/Tuning_Your_PostgreSQL_Server 作为起点,尤其是 shared_buffers、effective_cache_size 和 work_mem。数据库是在生产中还是可以测试各种设置?他们需要重新启动数据库(而不是服务器)。 @kometen - 不,我没有更改 conf 文件中的任何内容。 Redshift 是同一个文件吗?它正在生产中,我不确定如何只重启数据库而不是集群。 【参考方案1】:

查找值的MAX() 需要 Amazon Redshift 浏览列中的每个值。意识到 Sortkey 的 MAX 就在末尾可能还不够聪明。

您可以通过帮助查询使用区域地图来加快速度,区域地图可以识别存储在每个块中的值的范围。

如果您知道最大排序键高于特定值,请将其包含在 WHERE 子句中,例如:

SELECT MAX(sort_key) FROM tbl WHERE sort_key > 50000;

这将大大减少 Redshift 需要从磁盘检索的块数。

【讨论】:

以上是关于从 tbl_5billion_rows 中选择 max(sort_key) 耗时太长的主要内容,如果未能解决你的问题,请参考以下文章

mysql插入tbl(从2个表中选择)

SQL中根据表的顺序选择数据

从多个表中选择逗号分隔

如何更新具有外键约束的数据库?

从 __m256 中选择元素子集?

如何从表中选择除外表中的值之外的所有值?