从 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) 耗时太长的主要内容,如果未能解决你的问题,请参考以下文章