Sql 红移更新使用Seq扫描非常慢
我必须在一个大表(6亿行)中更新大约300行,我正在努力加快更新速度 我使用的查询有点棘手:Sql 红移更新使用Seq扫描非常慢,sql,amazon-redshift,Sql,Amazon Redshift,我必须在一个大表(6亿行)中更新大约300行,我正在努力加快更新速度 我使用的查询有点棘手: UPDATE my_table SET name = CASE WHEN (event_name in ('event_1', 'event_2', 'event_3')) THEN 'deleted' ELSE name END WHERE uid IN ('id_1', 'id_2') 我尝试在这个查询中使用EXPLAIN,我得到: XN Seq Scan on my_table (cost=
UPDATE my_table
SET name = CASE WHEN (event_name in ('event_1', 'event_2', 'event_3'))
THEN 'deleted' ELSE name END
WHERE uid IN ('id_1', 'id_2')
我尝试在这个查询中使用EXPLAIN,我得到:
XN Seq Scan on my_table (cost=0.00..103935.76 rows=4326 width=9838)
Filter: (((uid)::text = 'id_1'::text) OR ((uid)::text = 'id_2'::text))
我有一个交错的sortkey,uid是这个sortkey中包含的列之一。
查询看起来像这样的原因是,在实际上下文中,集合中的列数(以及名称)可能会有所不同,但可能不会超过10。
基本思想是我不希望交叉连接(更新规则是特定于列的,我不希望将它们混合在一起)。
例如,将来会出现如下查询:
UPDATE my_table
SET name = CASE WHEN (event_name in ("event_1", "event_2", "event_3")) THEN 'deleted' ELSE name END,
address = CASE WHEN (event_name in ("event_1", "event_4")) THEN 'deleted' ELSE address END
WHERE uid IN ("id_1", "id_2")
无论如何,回到第一个查询,它会运行很长时间(大约45分钟),并且需要100%的CPU
我尝试检查更简单的查询:
explain UPDATE my_table SET name = 'deleted' WHERE uid IN ('id_1', 'id_2')
XN Seq Scan on my_table (cost=0.00..103816.80 rows=4326 width=9821)
Filter: (((uid)::text = 'id_1'::text) OR ((uid)::text = 'id_2'::text))
我不知道还有什么可以补充的,我很乐意听到任何建议。您是否尝试过删除交错排序键,并将其替换为
uid
上的简单排序键或第一列为uid
的复合排序键
此外,名称uid
使我认为您可能正在使用GUID/UUID作为值。对于红移中的id
值,尤其是排序键,我建议这是一个反模式
GUID/UUIDid
存在问题:
- 不要以可预测的顺序发生
- 通常会触发完整的顺序扫描
- 新行总是破坏排序
- 压缩得很差
- 需要更多的磁盘空间进行存储
- 查询时需要读取更多数据
- 红移中的更新是删除,然后插入。按设计红移只是将行标记为已删除,而不是实际删除它们(重影行)。显式仅真空删除回收空间所需的