在Snowflake反规范化视图中是否应保留主键与外键?
关于Snowflake视图中是否保留ID字段的建议
结合你的场景(10亿条交易表+小维度表),建议保留product_id和product_category_id这两个整数ID字段,原因如下:
性能优化实际有效
整数类型的数值对比确实比字符串匹配更高效,尤其是在后续用这个视图做过滤或二次关联时。比如筛选特定分类的交易,WHERE product_category_id = 5的执行速度会明显快于WHERE productCategoryName = '家居用品'——字符串需要做字符编码匹配,而整数是直接的数值运算,Snowflake的查询优化器能更精准地做数据修剪(pruning),减少扫描的数据量,在10亿级的数据集上这种差异会被放大。业务灵活性更强
业务场景中维度名称(比如商品名、分类名)可能会变更(比如品牌更名、分类调整),但ID是稳定的唯一标识。如果视图只保留名称,历史数据的名称会和新数据不一致,用ID做统计或关联则不会受这类变更影响。另外,后续如果需要关联其他依赖ID的表,直接用视图里的ID即可,不用再回源关联底层的维度表,减少查询的关联层级。存储与成本可忽略
整数类型的存储体积远小于字符串(比如INT仅4字节),虽然Snowflake的视图本身不存储数据,但查询时传输和处理的字段体积更小,不会带来额外的成本负担,反而能降低后续查询的数据传输量。
另外,建议不要用t.*全选交易表字段,而是明确列出需要的字段,再加上ID和名称,这样能避免引入不必要的字段,让视图结构更清晰。示例代码如下:
# 创建优化后的视图 SELECT t.transaction_id, t.customer_id, t.transaction_date, t.amount, t.product_id, p.productName, p.product_category_id, pc.productCategoryName FROM TRANSACTIONS t JOIN PRODUCTS p ON p.product_id = t.product_id JOIN PRODUCT_CATEGORY pc ON pc.product_category_id = p.product_category_id
内容的提问来源于stack exchange,提问作者MYK
相关产品推荐
相关产品推荐

