Snowflake查询添加OR NOT LIKE后运行缓慢问题求助
Snowflake查询逻辑修正与性能优化方案
问题背景
从ADRESSES和CUSTOMERS两张表查询3列数据,预期逻辑:
- 用IN语句筛选指定ClientNumber
- 通过ClientNumber与CNumber关联两张表
- 排除结尾为
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'
核心问题分析
- 语法错误:IN语句的括号未闭合,导致WHERE子句逻辑混乱
- 逻辑错误:
OR优先级低于AND,加OR NOT LIKE '%domain.com'后,实际逻辑变为:(IN条件+关联+排除.nl) OR (排除.com),直接让IN和关联条件失效,查询范围暴增,才会出现持续运行的情况 - 需求逻辑误解:要同时排除两种后缀,应该用
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
相关产品推荐
相关产品推荐

