You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 08:13:25