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

DuckDB中WHERE IN查询的谓词下推实现方法咨询

DuckDB IN谓词下推失效的解决办法

问题现象

执行WHERE x IN (a,b,...)查询时,谓词未下推至表扫描阶段,而是在全表扫描后通过FILTER算子过滤数据,这对亿级行规模的表性能影响极大。而使用WHERE x='y'单值过滤时,过滤器能正常下推到表扫描阶段,提前过滤数据。

可行解决方案

方案1:用ANY替代IN

将IN语句改写为= ANY()的形式,DuckDB对这种写法的谓词下推支持更完善:

SELECT * FROM DATA
WHERE kind = ANY(VALUES ('dog'), ('cat'))

或者使用数组语法:

SELECT * FROM DATA
WHERE kind = ANY(['dog', 'cat']::VARCHAR[])

方案2:通过临时表关联实现过滤

将需要匹配的字符串列表存入临时表,通过JOIN或EXISTS关联查询,这种方式也能触发谓词下推:

-- 创建临时表存储匹配值
CREATE TEMP TABLE filter_vals (val VARCHAR);
INSERT INTO filter_vals VALUES ('dog'), ('cat');

-- 关联查询
SELECT d.* FROM data d
JOIN filter_vals f ON d.kind = f.val;

方案3:升级DuckDB至最新版本

部分旧版本的DuckDB对IN谓词的下推逻辑存在缺陷,升级到最新稳定版后可能自动修复该问题。

验证示例

修改原Python代码中的IN查询部分为ANY写法:

print("----------------")
print("SELECT USING ANY")
print("----------------")
result = connection.execute("""
    EXPLAIN ANALYZE
        SELECT * FROM DATA
        WHERE kind = ANY(VALUES ('dog'), ('cat'))
""").fetchone()

print(result[1])

执行后会看到TABLE_SCAN算子中出现Filters字段,说明谓词已成功下推:

┌───────────────────────────┐
│         TABLE_SCAN        │
│    ────────────────────   │
│            data           │
│                           │
│        Projections:       │
│            kind           │
│           sound           │
│                           │
│          Filters:         │
│ (kind = 'dog' OR kind = 'cat') AND kind IS NOT NULL │
│                           │
│           2 Rows          │
│          (0.00s)          │
└───────────────────────────┘

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:50:11