Amazon Redshift临时表数字填充异常:行数不足且起始值非1
为什么用Redshift的stl_scan生成连续数字表只得到3632行且步长为4?
问题场景
试图创建包含1到25567连续数字的临时表,执行以下SQL:
-- Create temp table DROP TABLE IF EXISTS numbers; CREATE TEMP TABLE numbers ( n INT NOT NULL PRIMARY KEY ); -- Insert numbers from 1 to 25567 INSERT INTO numbers SELECT ROW_NUMBER() OVER () AS n FROM stl_scan LIMIT 25567; SELECT COUNT(*) FROM numbers
实际执行后,计数结果仅为3632,且生成的数字从4开始,以4为步长递增(4、8、12...),完全不符合预期。
异常原因
1. stl_scan本身的数据量不足
stl_scan是Redshift的系统表,仅存储最近的扫描操作日志,它的总行数本身就只有3632条左右,因此即使设置了LIMIT 25567,也只能返回现有行数的数据。
2. MPP架构下ROW_NUMBER()的无规则执行问题
Redshift是分布式MPP架构,stl_scan的数据分散在多个计算节点上。ROW_NUMBER() OVER ()未指定分区和排序规则时,每个计算节点会独立对本地数据计算行号,再将结果汇总到leader节点。
如果你的集群恰好有4个计算节点,每个节点的本地数据都会生成从1开始的连续行号,汇总后不同节点的相同行号会冲突,最终留存的是各节点中不重复的行号,形成步长为4的序列。
3. 主键约束过滤了重复行
临时表的n字段设为主键,当多个节点返回相同行号(比如每个节点都有行号1)时,插入操作会因主键冲突自动丢弃重复值,进一步导致最终行数远少于预期,且行号呈现节点数的步长。
内容的提问来源于stack exchange,提问作者Nicolás Lope de Barrios
相关产品推荐
相关产品推荐

