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

Snowflake查询添加OR NOT LIKE后运行缓慢问题求助

Snowflake查询逻辑修正与性能优化方案

问题背景

从ADRESSES和CUSTOMERS两张表查询3列数据,预期逻辑:

  1. 用IN语句筛选指定ClientNumber
  2. 通过ClientNumber与CNumber关联两张表
  3. 排除结尾为domain.nl或domain.com的MAIL_ADDR

但添加OR NOT LIKE后查询持续运行无结果,仅单条NOT LIKE时正常,怀疑性能问题。

原查询语句:

SELECT "MAIL_ADDR", "ClientNumber", "CNumber" 
FROM "ADRESSES", CUSTOMERS
WHERE "ClientNumber" IN ('0000206302','0000206307','0000206309','0000206321'                                         
    AND "ClientNumber" = "CNumber"
    AND "MAIL_ADDR" NOT LIKE '%domain.nl' 
    OR "MAIL_ADDR" NOT LIKE '%domain.com'

核心问题分析

  1. 语法错误:IN语句的括号未闭合,导致WHERE子句逻辑混乱
  2. 逻辑错误:OR优先级低于AND,加OR NOT LIKE '%domain.com'后,实际逻辑变为:(IN条件+关联+排除.nl) OR (排除.com),直接让IN和关联条件失效,查询范围暴增,才会出现持续运行的情况
  3. 需求逻辑误解:要同时排除两种后缀,应该用AND而非OR——OR会让所有不满足.com的数据都被保留,包括原本被IN条件过滤掉的大量数据

修正与优化方案

方案1:修正逻辑+显式JOIN(基础最优)

用显式JOIN替代隐式逗号关联,明确逻辑分组:

SELECT "MAIL_ADDR", "ADRESSES"."ClientNumber", CUSTOMERS."CNumber" 
FROM "ADRESSES"
JOIN CUSTOMERS 
  ON "ADRESSES"."ClientNumber" = CUSTOMERS."CNumber"
WHERE "ADRESSES"."ClientNumber" IN ('0000206302','0000206307','0000206309','0000206321')
  AND "MAIL_ADDR" NOT LIKE '%domain.nl' 
  AND "MAIL_ADDR" NOT LIKE '%domain.com';

方案2:正则表达式简化(多后缀场景高效)

如果后续需要排除更多后缀,用REGEXP_LIKE更简洁,性能也更优:

SELECT "MAIL_ADDR", "ADRESSES"."ClientNumber", CUSTOMERS."CNumber" 
FROM "ADRESSES"
JOIN CUSTOMERS 
  ON "ADRESSES"."ClientNumber" = CUSTOMERS."CNumber"
WHERE "ADRESSES"."ClientNumber" IN ('0000206302','0000206307','0000206309','0000206321')
  AND NOT REGEXP_LIKE("MAIL_ADDR", 'domain\\.(nl|com)$');

额外性能优化建议

  • 为ClientNumber和CNumber列创建搜索优化服务(Search Optimization Service),或设置合适的聚类键,加速IN条件和关联操作
  • 避免在WHERE子句中对关联列做函数转换,确保优化器能有效利用列的统计信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 09:31:32