Redshift中未声明外键约束时,同分布键的表是否共置且免重分布连接?
Redshift表共置与分布键、外键约束的关系
先直接给你结论:不管有没有外键约束,只要两张表的分布键是对应的关联列(维度表PK和事实表FK),就会实现共置,连接时也不需要数据重分布。下面给你拆解细节:
1. 共置的核心驱动是分布键,和外键约束无关
Redshift的表共置(collocation)本质是让相同分布键值的行存储在同一个节点的同一个切片上。这个逻辑完全由你设置的DISTKEY决定,和外键约束没有任何绑定关系:
- 假设你有维度表
dim_user,DDL是这样的:CREATE TABLE dim_user ( user_id INT PRIMARY KEY, user_name VARCHAR(50) ) DISTSTYLE KEY DISTKEY (user_id); - 事实表
fact_order没声明外键,但把user_id设为分布键:
这种情况下,所有CREATE TABLE fact_order ( order_id INT, user_id INT, -- 这里没加FOREIGN KEY约束 order_amount NUMERIC(10,2) ) DISTSTYLE KEY DISTKEY (user_id);user_id=1001的行,不管在dim_user还是fact_order里,都会被分配到同一个节点切片上。执行JOIN操作时,Redshift会直接在本地节点完成连接,不需要跨节点重分布数据。
2. 仅设置分布键就能实现共置,外键约束不是必要条件
外键约束在Redshift里的作用是保证数据引用完整性(比如事实表的user_id必须存在于维度表中),但它不参与数据分布的决策。哪怕你完全不声明外键,只要两张表的分布键是关联的列(比如维度PK和事实FK),共置就会生效。
补充个小细节:Redshift默认不会自动验证外键约束,你需要手动执行ALTER TABLE fact_order VALIDATE CONSTRAINT fk_order_user;来验证数据完整性,但这一步完全不影响表的共置状态。
总结
- 维度表PK和事实表FK设为分布键,即使事实表没声明外键约束,两张表会共置,连接时无需重分布。
- 仅设置对应分布键,不声明外键约束,完全可以实现表的共置。
内容的提问来源于stack exchange,提问作者lfk
相关产品推荐
相关产品推荐

