Snowflake中IS DISTINCT FROM查询结果优化问题咨询
问题解决思路
首先明确:IS DISTINCT FROM运算符本身就符合你「两列均为null视为相等」的要求——它不会把(null, null)判定为差异项。你现在结果里出现大量看似相同的行,核心问题大概率是表关联逻辑错误或存在重复数据,以下是具体优化方案:
1. 修正表关联逻辑
你的原查询缺少JOIN关联条件,这会导致两张表产生笛卡尔积(所有行两两匹配),必然出现大量无效行。必须用唯一键(比如业务主键)关联两张表,确保是同一数据主体的对比:
SELECT * FROM tab1 JOIN tab2 ON tab1.primary_key = tab2.primary_key -- 替换为实际关联键,比如id_1 WHERE tab1.id_1::date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND ( tab1.id_2 IS DISTINCT FROM tab2.id_2 OR tab1.id_3 IS DISTINCT FROM tab2.id_3 OR tab1.id_4 IS DISTINCT FROM tab2.id_4 -- 补充更多需要对比的列 );
2. 过滤重复结果
如果关联逻辑正确,但仍有重复行,说明表本身存在重复数据,可通过DISTINCT或DISTINCT ON去重:
通用去重方式
SELECT DISTINCT * FROM tab1 JOIN tab2 ON tab1.primary_key = tab2.primary_key WHERE tab1.id_1::date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND ( tab1.id_2 IS DISTINCT FROM tab2.id_2 OR tab1.id_3 IS DISTINCT FROM tab2.id_3 OR tab1.id_4 IS DISTINCT FROM tab2.id_4 );
PostgreSQL专属精准去重
如果只需要基于关联键保留唯一行,用DISTINCT ON更高效:
SELECT DISTINCT ON (tab1.primary_key) * FROM tab1 JOIN tab2 ON tab1.primary_key = tab2.primary_key WHERE tab1.id_1::date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND ( tab1.id_2 IS DISTINCT FROM tab2.id_2 OR tab1.id_3 IS DISTINCT FROM tab2.id_3 OR tab1.id_4 IS DISTINCT FROM tab2.id_4 ) ORDER BY tab1.primary_key;
3. 直观验证差异列
如果仍不确定差异来源,可以新增标记列,明确显示哪几列存在差异,方便排查:
SELECT tab1.*, tab2.*, tab1.id_2 IS DISTINCT FROM tab2.id_2 AS id_2_diff, tab1.id_3 IS DISTINCT FROM tab2.id_3 AS id_3_diff, tab1.id_4 IS DISTINCT FROM tab2.id_4 AS id_4_diff FROM tab1 JOIN tab2 ON tab1.primary_key = tab2.primary_key WHERE tab1.id_1::date BETWEEN 'YYYY-MM-DD' AND 'YYYY-MM-DD' AND ( tab1.id_2 IS DISTINCT FROM tab2.id_2 OR tab1.id_3 IS DISTINCT FROM tab2.id_3 OR tab1.id_4 IS DISTINCT FROM tab2.id_4 );
内容的提问来源于stack exchange,提问作者Robertino Bonora
相关产品推荐
相关产品推荐

