必须查v$sql_join_filter才能确认bloom filter是否实际创建,执行计划中出现join filter操作不代表运行时真正生成;需结合sql_id、active状态、probed/filtered比值及统计信息综合判断其有效性。

查 V$SQL_JOIN_FILTER 确认 Bloom Filter 是否真被创建
执行计划里看到 JOIN FILTER CREATE 和 JOIN FILTER USE,不代表运行时真的建了过滤器。必须查 V$SQL_JOIN_FILTER 才能确认——它只记录实际触发并行执行、且成功构建过滤器的 SQL。
常见错误现象是:执行计划有 JOIN FILTER 操作,但 V$SQL_JOIN_FILTER 为空或 ACTIVE = 'N'。这说明过滤器压根没生成,不是“失效”,而是“没活起来”。
- 先用
SQL_ID关联V$SQL,确认该语句确实以并行方式执行(DEGREE > 1且PARALLEL_EXECUTION_MESSED = 'YES') - 再查
V$SQL_JOIN_FILTER WHERE SQL_ID = 'xxx';若无记录,说明优化器跳过了 Bloom Filter 路径 - 若记录存在但
ACTIVE = 'N'或BLOCKED = 'Y',说明并行协调失败,可能是 PX server 不足或资源争用
看执行计划中 JOIN FILTER 的位置和驱动表是否合理
Bloom Filter 只在哈希连接(HASH JOIN)中由构建侧(build table)生成,并作用于探测侧(probe table)。如果执行计划里 JOIN FILTER CREATE 出现在小表上,而 JOIN FILTER USE 在大表上,方向是对的;反过来就大概率被忽略。
Oracle 19c 中,Bloom Filter 生效的前提是:构建侧数据量不能太大(一般建议
- 用
DBMS_XPLAN.DISPLAY_CURSOR('sql_id', NULL, 'ALLSTATS LAST')查真实执行统计,重点关注Build Rows和Probe Rows两列 - 若
Build Rows超过几十万,即使计划写了JOIN FILTER CREATE,V$SQL_JOIN_FILTER.FILTERED也常为 0 - 检查
V$SQL_PLAN.PLAN_HASH_VALUE是否稳定;自适应计划切换(如转成NESTED LOOPS)会导致 JOIN FILTER 消失
检查并行参数与统计信息是否满足 Bloom Filter 触发条件
Bloom Filter 不是默认打开的“高级开关”,它依赖一组隐式前提:并行度够、统计信息准、数据分布不极端。19c 默认启用,但很容易被现实条件反向压制。
最常被忽略的是 CLUSTERING_FACTOR 和直方图缺失——当构建表的连接键严重倾斜(比如 95% 的值集中在 3 个 ID 上),Bloom Filter 的假阳性率飙升,优化器会直接绕过它。
- 确保构建表连接列有最新统计信息:
DBMS_STATS.GATHER_TABLE_STATS带method_opt => 'FOR COLUMNS SIZE AUTO' - 检查
V$SQL_PLAN.OTHER_XML中是否有bloom_filter字段;没有则说明优化器根本没考虑该路径 - 临时禁用自适应特性验证:加 hint
/*+ NO_ADAPTIVE_PLAN */,排除执行计划动态切换干扰 -
parallel_degree_policy必须为AUTO或ADAPTIVE;设为MANUAL时,即使写/*+ parallel(4) */,Bloom Filter 也不会激活
对比 V$SQL_JOIN_FILTER 的 PROBED 和 FILTERED 值判断实际效果
就算过滤器建起来了,也可能只是“象征性工作”。关键看 PROBED(被检查的 probe 行数)和 FILTERED(真正被拦下的行数)的比值。低于 10% 就基本等于没用。
例如:某次执行 PROBED = 2456789,FILTERED = 120,说明 99.995% 的 probe 行都穿过了过滤器——这不是 Bloom Filter 失效,而是它本就不适合当前数据模式。
- 若
FILTERED = 0但PROBED > 0,说明过滤器已部署,但所有 probe 值都在布隆位图的“可能命中”范围内(假阳性太高) - 若
PROBED = 0,说明 probe 表压根没走到 JOIN FILTER USE 步骤,可能被上层操作提前剪枝(如FILTER操作符提前终止) - 不要只盯单次执行;查
V$SQL_JOIN_FILTER历史快照(需 AWR 配置),看FILTERED / PROBED是否随时间持续恶化——这往往指向统计信息漂移
PROBED 和 FILTERED 两个数字抄下来,拿计算器除一下。这个比值比任何文字描述都诚实。











