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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 21:10:45