Snowflake中:UPPER()函数应在查询视图还是创建视图时使用?
在Snowflake中将UPPER()嵌入视图定义是否更高效?
是的,把UPPER()函数嵌入视图的创建语句中,确实比每次查询时调用该函数更优,具体差异和优势如下:
两种方案的对比
原方案(查询时调用UPPER())
每次执行SELECT UPPER(varid) AS varid FROM DATABASE.PUBLIC.ALL_TABLES时,Snowflake需要:
- 扫描
TABLE_A、TABLE_B、TABLE_C的所有目标行 - 对每一行的
VARID字段重复执行UPPER()转换 - 这会导致每次查询都重复计算,额外增加CPU开销,同时需要持续读取原始
VARID数据,维持较高的扫描字节量
原视图定义代码:
CREATE OR REPLACE VIEW DATABASE.PUBLIC.ALL_TABLES( ID, CODE, VARID ) as Select ID::string as ID, CODE::string as CODE, VARID::string as VARID, From (SELECT ID, CODE, VARID FROM TABLE_A) union all (SELECT ID, CODE, VARID FROM TABLE_B) union all (SELECT ID, CODE, VARID FROM TABLE_C);
修改后的方案(视图定义时调用UPPER())
修改后的视图在定义阶段就对基础表的VARID字段完成大写转换,后续查询SELECT varid FROM DATABASE.PUBLIC.ALL_TABLES时:
- Snowflake的查询优化器会将视图逻辑下推到基础表扫描阶段,相当于读取
TABLE_A/B/C数据时就完成UPPER()转换,无需后续重复计算 - 后续查询直接取用预处理后的大写
VARID值,减少了重复运算开销,且不会额外增加扫描字节量(转换在数据读取时完成,无额外存储成本)
修改后的视图定义代码:
CREATE OR REPLACE VIEW DATABASE.PUBLIC.ALL_TABLES( ID, CODE, VARID ) as Select ID::string as ID, CODE::string as CODE, VARID::string as VARID, From (SELECT ID, CODE, UPPER(VARID) AS VARID FROM TABLE_A) union all (SELECT ID, CODE, UPPER(VARID) AS VARID FROM TABLE_B) union all (SELECT ID, CODE, UPPER(VARID) AS VARID FROM TABLE_C);
额外注意点
- 如果业务场景中所有查询都需要大写的VARID,这个修改完全适用;若存在需要原始大小写
VARID的场景,建议保留原视图,或新建带大写转换的专用视图(比如ALL_TABLES_UPPER_VARID),避免影响其他查询 - 原代码中已通过
::string将VARID转为字符串类型,无需担心UPPER()函数的类型兼容问题
内容的提问来源于stack exchange,提问作者jen
相关产品推荐
相关产品推荐

