隐含参数 _b_tree_bitmap_plans 导致 SQL 执行计划劣化
问题现象同一关键 SQL一厂平均执行 12ms三厂平均执行 700ms三厂数据量更小根因三厂数据库设置了隐含参数 _b_tree_bitmap_plansFALSE禁用了 BITMAP CONVERSION TO ROWIDS 访问路径优化器退化为全表扫描解决方案通过 SQL Profile 为三厂绑定含 BITMAP CONVERSION 的较优执行计划执行时间降至 1ms 以内1. 问题现象业务反馈某个关键 SQL 在一厂和三厂的执行时间差距较大。三厂数据量更小理论上应该更快但实际表现相反。1.1 执行时间对比工厂平均执行时间执行计划一厂~12msBITMAP CONVERSION TO ROWIDS索引访问三厂~700msFULL TABLE SCAN全表扫描1.2 执行计划差异一厂执行计划三厂执行计划关键差异访问路径就是一厂走的BITMAP 三厂走的全表2. 根因分析2.1 关键参数三厂为新建工厂数据库实施参数标准中配置了隐含参数_b_tree_bitmap_plans FALSE。该参数在 OLTP 最佳实践中建议设为 FALSE但在本案例中恰好阻止了优化器选择最优执行计划。参数说明_b_tree_bitmap_plans 控制优化器是否考虑 BITMAP CONVERSION TO ROWIDS / FROM ROWIDS 以及 BITMAP AND/OR/MINUS 等执行计划。默认为TRUE允许设为FALSE后所有 B-tree 索引转 Bitmap 的访问路径均被禁用。2.2 影响链路一厂执行计划访问路径h : SYS.SQLPROF_ATTR( q[BEGIN_OUTLINE_DATA], q[IGNORE_OPTIM_EMBEDDED_HINTS], q[OPTIMIZER_FEATURES_ENABLE(19.1.0)], q[DB_VERSION(19.1.0)], q[OPT_PARAM(_optimizer_extended_cursor_sharing none)], q[OPT_PARAM(_optimizer_extended_cursor_sharing_rel none)], q[OPT_PARAM(_optimizer_adaptive_cursor_sharing false)], q[OPT_PARAM(_optimizer_use_feedback false)], q[OPT_PARAM(_optimizer_gather_feedback false)], q[ALL_ROWS], q[OUTLINE_LEAF(SEL$1)], q[OUTLINE_LEAF(SEL$2)], q[NO_ACCESS(SEL$2 from$_subquery$_002SEL$2)], q[BITMAP_TREE(SEL$1 LXSEL$1 OR(1 1 (TEST.SN) 2 (TEST.SUBSN) 3 (TEST.XPSN)))], q[BATCH_TABLE_ACCESS_BY_ROWID(SEL$1 LXSEL$1)], q[END_OUTLINE_DATA]); :signature : DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt); :signaturef : DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt, TRUE);三厂执行计划访问路径h : SYS.SQLPROF_ATTR( q[BEGIN_OUTLINE_DATA], q[IGNORE_OPTIM_EMBEDDED_HINTS], q[OPTIMIZER_FEATURES_ENABLE(19.1.0)], q[DB_VERSION(19.1.0)],q[OPT_PARAM(_b_tree_bitmap_plans false)], --该隐含参数阻止了优化器选择BITMAPq[OPT_PARAM(_optim_peek_user_binds false)], q[OPT_PARAM(_bloom_filter_enabled false)], q[OPT_PARAM(_optimizer_extended_cursor_sharing none)], q[OPT_PARAM(_optimizer_outer_to_anti_enabled false)], q[OPT_PARAM(_bloom_pruning_enabled false)], q[OPT_PARAM(_optimizer_extended_cursor_sharing_rel none)], q[OPT_PARAM(_optimizer_adaptive_cursor_sharing false)], q[OPT_PARAM(_and_pruning_enabled false)], q[OPT_PARAM(_optimizer_use_feedback false)], q[OPT_PARAM(_px_adaptive_dist_method off)], q[OPT_PARAM(_optimizer_strans_adaptive_pruning false)], q[OPT_PARAM(_optimizer_null_accepting_semijoin false)], q[OPT_PARAM(_optimizer_gather_feedback false)], q[OPT_PARAM(_optimizer_reduce_groupby_key false)], q[OPT_PARAM(_optimizer_nlj_hj_adaptive_join false)], q[ALL_ROWS], q[OUTLINE_LEAF(SEL$1)], q[OUTLINE_LEAF(SEL$2)], q[NO_ACCESS(SEL$2 from$_subquery$_002SEL$2)], q[FULL(SEL$1 LXSEL$1)], q[END_OUTLINE_DATA]); :signature : DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt); :signaturef : DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt, TRUE);2.3 为何 OLTP 建议设为 FALSE该参数设为 FALSE 的初衷是避免 OLTP 场景下产生不合适的 Bitmap 转换计划。当 SQL 包含多个 B-tree 索引条件尤其是星型转换、多索引 AND/OR,本案例sql为多个or查询时优化器可能生成次优的 BITMAP CONVERSION 计划。此外19c 中存在已知 BugBug 30102774— ORA-7445 [kkosbn] Error With SQL With Bitmap Plans设为 FALSE 可作为 workaround 规避该类 Bug。但对于需要使用 BITMAP CONVERSION 的特定 SQL该设置会产生负面影响。3. 解决方案3.1 方案选择最简单且影响最小的方式是使用SQL Profile为该 SQL 绑定含 BITMAP CONVERSION 的较优执行计划无需修改全局参数不影响其他 SQL 的执行计划。3.2 一厂 SQL Profile Outline较优计划从一厂获取该 SQL 的较优执行计划 Outline通过 SQL Profile 绑定到三厂。关键 Hint 如下BITMAP_TREE(SEL$1 LXSEL$1 OR(1 1 (TEST.SN) 2 (TEST.SUBSN) 3 (TEST.XPSN)))BATCH_TABLE_ACCESS_BY_ROWID(SEL$1 LXSEL$1)一厂 Outline 中包含的优化器参数绑定OPT_PARAM(_optimizer_extended_cursor_sharing none)OPT_PARAM(_optimizer_extended_cursor_sharing_rel none)OPT_PARAM(_optimizer_adaptive_cursor_sharing false)OPT_PARAM(_optimizer_use_feedback false)OPT_PARAM(_optimizer_gather_feedback false)3.3 三厂当前 SQL Profile Outline较差计划三厂执行计划 Outline 中包含的关键差异OPT_PARAM(_b_tree_bitmap_plans false)— 直接导致无法使用 BITMAP CONVERSIONFULL(SEL$1 LXSEL$1)— 全表扫描替换了 BITMAP_TREE此外还包含以下参数绑定OPT_PARAM(_optim_peek_user_binds false)OPT_PARAM(_bloom_filter_enabled false)OPT_PARAM(_bloom_pruning_enabled false)OPT_PARAM(_and_pruning_enabled false)OPT_PARAM(_optimizer_outer_to_anti_enabled false)OPT_PARAM(_optimizer_null_accepting_semijoin false)OPT_PARAM(_optimizer_reduce_groupby_key false)OPT_PARAM(_optimizer_nlj_hj_adaptive_join false)OPT_PARAM(_px_adaptive_dist_method off)OPT_PARAM(_optimizer_strans_adaptive_pruning false)3.4 效果验证阶段执行计划平均执行时间优化前三厂原始FULL TABLE SCAN~700ms一厂参考值BITMAP CONVERSION TO ROWIDS~12ms优化后绑定 SQL ProfileBITMAP CONVERSION TO ROWIDS小于 1ms绑定 SQL Profile 后三厂该 SQL 的执行时间从 700ms 降至 1ms 以内性能提升约700 倍。4. _b_tree_bitmap_plans 参数详解4.1 控制范围该隐藏参数控制优化器是否考虑以下执行计划BITMAP CONVERSION TO ROWIDSBITMAP CONVERSION FROM ROWIDSBITMAP AND / OR / MINUS这类 B-tree 索引转 Bitmap 再运算的执行计划。4.2 参数值说明参数值行为TRUE默认允许优化器使用 BITMAP CONVERSION 相关计划FALSE禁止所有 BITMAP CONVERSION 计划不再出现 BITMAP CONVERSION TO ROWIDS 等路径4.3 典型执行计划场景当 SQL 包含多个 B-tree 索引条件尤其是星型转换、多索引 AND/OR时优化器可能生成如下计划BITMAP CONVERSION TO ROWIDSBITMAP ANDBITMAP CONVERSION FROM ROWIDS - INDEX RANGE SCANBITMAP CONVERSION FROM ROWIDS - INDEX RANGE SCAN将 _b_tree_bitmap_plans 设为 FALSE 后上述计划全部被禁用。4.4 查看与修改查看当前值select x.ksppinm name, y.ksppstvl value, y.ksppstdf isdefault, decode(bitand(y.ksppstvf, 7), 1, MODIFIED, 4, SYSTEM_MOD, FALSE) ismod, decode(bitand(y.ksppstvf, 2), 2, TRUE, FALSE) isadj from sys.x$ksppi x, sys.x$ksppcv y where x.inst_id userenv(Instance) and y.inst_id userenv(Instance) and x.indx y.indx and x.ksppinm like %b_tree_bitmap% order by translate(x.ksppinm, _, );会话级测试ALTER SESSION SET _b_tree_bitmap_plans FALSE;Hint方式禁用/启用SELECT /* OPT_PARAM(_b_tree_bitmap_plans, TRUE) */ SELECT /* OPT_PARAM(_b_tree_bitmap_plans, FALSE) */实例级修改需重启ALTER SYSTEM SET _b_tree_bitmap_plans FALSE SCOPESPFILE;5. 经验总结1. 参数标准不能一刀切OLTP 最佳实践中建议禁用 _b_tree_bitmap_plans 以规避已知 Bug 和次优计划但需评估业务 SQL 是否依赖 BITMAP CONVERSION 路径。新建工厂实施参数标准时建议先用一厂的执行计划基线做回归测试。2. SQL Profile 是精准调优利器当全局参数调整会影响其他 SQL 时SQL Profile 可以针对单条 SQL 绑定最优执行计划影响范围最小。适合「大部分 SQL 正常个别 SQL 受影响」的场景。3. 隐含参数变更需评估影响面修改隐含参数前建议在测试环境对关键 SQL 做执行计划对比explain plan / SQL Tuning Advisor确认不会产生回归。

相关新闻

NR37-CP双麦DSP芯片:20pin CSP封装与14mA低功耗架构的电路设计权衡

NR37-CP双麦DSP芯片:20pin CSP封装与14mA低功耗架构的电路设计权衡

一、20pin CSP封装的PCB集成挑战 NR37-CP采用20pin 2.62.2mm专有CSP(Chip Scale Package)封装,底部视图,pin间距0.5mm。这一封装尺寸在芯片级属于超小型设计——2.6mm2.2mm的面积仅略大于BGA封装的接触点区域,相比QFP…

2026/7/30 12:17:51 阅读更多 →
现在不学AI驱动微服务开发,6个月后将错过DevOps 3.0人才认证窗口期

现在不学AI驱动微服务开发,6个月后将错过DevOps 3.0人才认证窗口期

更多请点击: https://intelliparadigm.com 第一章:AI驱动微服务开发的时代必然性 在云原生架构持续演进与业务复杂度指数级增长的双重压力下,传统微服务开发模式正面临交付周期长、故障定位难、配置治理碎片化等系统性瓶颈。AI技术不再仅作…

2026/7/30 12:16:51 阅读更多 →
Mac系统R与RStudio安装配置全攻略:从零搭建数据分析环境

Mac系统R与RStudio安装配置全攻略:从零搭建数据分析环境

1. 为什么在Mac上搞R和RStudio值得你花时间 如果你正在读这篇文章,大概率是刚接触数据分析、统计建模或者生物信息学,然后发现导师、教程或者论文里都在提R语言。你手头正好是一台Mac,于是开始搜索怎么安装。网上的信息零散,有的教…

2026/7/30 12:16:51 阅读更多 →

最新新闻

KMS智能激活终极指南:3分钟实现Windows和Office永久激活

KMS智能激活终极指南:3分钟实现Windows和Office永久激活

KMS智能激活终极指南:3分钟实现Windows和Office永久激活 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活和Office软件激活而烦恼吗?KMS_VL_ALL_AIO…

2026/7/30 12:26:54 阅读更多 →
C#实现全局鼠标按键屏蔽:Windows钩子原理与完整代码实战

C#实现全局鼠标按键屏蔽:Windows钩子原理与完整代码实战

1. 项目概述:为什么需要屏蔽鼠标按键?在桌面应用开发中,我们有时会遇到一些非常规但极具实用价值的需求,屏蔽鼠标按键就是其中之一。乍一听,这似乎是个“破坏性”功能,但实际上,它在很多专业场景…

2026/7/30 12:26:54 阅读更多 →
C++六个默认成员函数:从内存管理到三五法则的全面解析

C++六个默认成员函数:从内存管理到三五法则的全面解析

1. 项目概述:为什么“六个默认成员函数”是C的基石刚接触C面向对象编程的朋友,常常会被构造函数、析构函数这些概念绕晕。很多人上来就想写游戏、做项目,结果连一个简单的class都定义得漏洞百出,程序运行时内存泄漏、数据错乱的问…

2026/7/30 12:26:54 阅读更多 →
【单片机毕设案例分享】基于权限校验的 STM32 电子密码锁系统设计 基于单片机输入校验的智能防盗门锁设计(012501)

【单片机毕设案例分享】基于权限校验的 STM32 电子密码锁系统设计 基于单片机输入校验的智能防盗门锁设计(012501)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于单片机,STM32单片机,51单片机,J…

2026/7/30 12:26:54 阅读更多 →
终极风扇控制指南:用Fan Control打造完美静音电脑

终极风扇控制指南:用Fan Control打造完美静音电脑

终极风扇控制指南:用Fan Control打造完美静音电脑 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fan…

2026/7/30 12:26:54 阅读更多 →
深入解析CAN总线:从核心原理到STM32实战应用

深入解析CAN总线:从核心原理到STM32实战应用

1. 项目概述:从“线”到“网络”的认知跃迁提到CAN总线,很多刚接触汽车电子或工业控制的朋友,第一反应可能就是“车上的一根通讯线”。这个理解对,但也不全对。它确实是一根线(准确说是两根差分线)&#xf…

2026/7/30 12:25:54 阅读更多 →

日新闻

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南

Windows驱动存储终极清理工具:DriverStoreExplorer完全指南 【免费下载链接】DriverStoreExplorer Driver Store Explorer 项目地址: https://gitcode.com/gh_mirrors/dr/DriverStoreExplorer 您是否曾因Windows系统盘空间不足而烦恼?是否遇到过设…

2026/7/30 0:00:13 阅读更多 →
如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南

如何3步掌握Video Download Helper:网页视频下载的完整实战指南 【免费下载链接】VideoDownloadHelper Chrome Extension to Help Download Video for Some Video Sites. 项目地址: https://gitcode.com/gh_mirrors/vi/VideoDownloadHelper 你是否曾经在浏览…

2026/7/30 0:00:13 阅读更多 →
“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

“双减”后首个AI备课压力测试报告:覆盖32所中小学的176节AI辅助课,暴露4大隐性增负节点

更多请点击: https://intelliparadigm.com 第一章:AI 教师备课辅助 AI 教师备课辅助系统正逐步成为教育数字化转型的核心支撑工具,它并非替代教师,而是通过语义理解、知识图谱与多模态生成能力,将教师从重复性劳动中解…

2026/7/30 0:00:13 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/29 22:18:20 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/29 14:34:28 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/29 15:00:03 阅读更多 →

月新闻