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

同SQL查询在Snowflake与Redshift返回结果差异的根因排查

排查Redshift与Snowflake同SQL查询结果差异的根本原因

我在Redshift中执行以下SQL仅返回18条记录,但在Snowflake中执行相同查询却返回27000条记录。已确认两个数据库中team_incite.gmi_grace_prima_temp和team_incite.gmi_grace_translated两张表的总记录数一致,请求排查差异原因。

执行的查询语句

SELECT CUR.datasource
       , CUR.reqid
       , CUR.respid
       , CUR.caseno
       , CUR.category
       , CUR.topic
       , CUR.contact_type
       , CUR.division
       , CUR.gender
       , CUR.city
       , CUR.region
       , CUR.country
       , CUR.entrydate_loc
       , CUR.entrydate_loc_month
       , CUR.product_name
       , CUR.product_description
       , CUR.req_mode
       , CUR.languages
       , CUR.CODE
       , CUR.CODE_ORIG
       , CUR.dept
       , CUR.inquiry_text
       , CUR.subregion
       , CUR.subregion_amer_la
       , CUR.therapeutic_area
       , CUR.ae_flag
       , CUR.pc_flag
       , CUR.facilitator_flag
       , CUR.resolution
       , CUR.inbound_channel1
       , CUR.inbound_channel2
       , CUR.state_or_region
       , CUR.specialty
       , cur.load_date
 FROM team_incite.gmi_grace_prima_temp CUR
 full outer join team_incite.gmi_grace_translated PREV
  ON CUR.REQID=PREV.REQID AND CUR.RESPID=PREV.RESPID
 WHERE PREV.REQID IS NULL AND PREV.RESPID IS NULL   

计数验证语句

select count(*) from team_incite.gmi_grace_translated;
select count(*) from team_incite.gmi_grace_prima_temp;

可能的差异原因排查方向

  • NULL值处理差异:Redshift和Snowflake对NULL=NULL的判断逻辑可能不同,部分场景下NULL无法匹配成功。可以分别统计两张表中REQID、RESPID为NULL的记录数,对比两个库的数据是否一致。
  • 数据类型不匹配:检查REQID和RESPID在两个数据库中的数据类型是否完全一致。比如Redshift中是VARCHAR(50)、Snowflake中是STRING,或数值类型精度不同,可能导致隐式转换后匹配结果不同。
  • 重复记录影响:虽然总记录数一致,但两张表中(REQID, RESPID)的唯一组合数可能不同。比如Redshift中PREV表该组合重复更多,导致更多CUR记录能匹配到PREV记录被过滤;Snowflake中则相反。可执行以下语句统计唯一组合数:
    -- 统计PREV表唯一组合数
    SELECT COUNT(DISTINCT CONCAT(REQID, '|', RESPID)) FROM team_incite.gmi_grace_translated;
    -- 统计CUR表唯一组合数
    SELECT COUNT(DISTINCT CONCAT(REQID, '|', RESPID)) FROM team_incite.gmi_grace_prima_temp;
    
  • 大小写敏感性差异:若REQID/RESPID是字符串类型,Redshift和Snowflake的大小写敏感规则可能不同。比如Redshift默认不敏感,Snowflake默认敏感,导致'ABC'和'abc'匹配结果不同。可尝试在JOIN条件中统一转换大小写验证:
    ON LOWER(CUR.REQID)=LOWER(PREV.REQID) AND LOWER(CUR.RESPID)=LOWER(PREV.RESPID)
    
  • 执行计划差异:两个数据库的查询优化器生成的执行计划可能不同,比如Redshift提前过滤了部分数据,或FULL JOIN的实现逻辑有差异。可查看各自的执行计划对比细节。

内容的提问来源于stack exchange,提问作者bigDaddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:43:25