当前位置: 首页 > news >正文

崖山数据库-谓词没提前过滤优化器BUG

数据库版本崖山23.5.1

SQL> select * from v$version; BANNER VERSION_NUMBER ---------------------------------------------------------------- ----------------- Enterprise Edition Release 23.5.1.100 x86_64 23.5.1.100 1 row fetched.

测试SQL

select * from test02 t2 where t2.data_object_id = (select max(data_object_id) from test01 t3 where t3.object_id = t2.object_id) and t2.owner = 'SCOTT';

执行计划

SQL> select * from test02 t2 where t2.data_object_id = (select max(data_object_id) from test01 t3 where t3.object_id = t2.object_id) and t2.owner = 'SCOTT'; 2 3 4 5 6 7 Execution Plan ---------------------------------------------------------------- SQL hash value: 3493843295 Optimizer: ADOPT_C +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ | Id | Operation type | Name | Owner | E - Rows | A - Rows | Cost(%CPU) | A - Time | Loops | Memory | Disk | Partition info | +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ | 0 | SELECT STATEMENT | | | | 31| | 14233163| 32| 0| 0| | | 1 | SUBQUERY | QUERY[1] | | | 86987| | 14097886| 173974| 0| 0| | | 2 | AGGREGATE | | | 1| 86987| 5( 0)| 14069037| 173974| 0| 0| | |* 3 | TABLE ACCESS BY INDEX ROWID | TEST01 | SCOTT | 145| | 5( 0)| | | | | | |* 4 | INDEX RANGE SCAN | IDX_TEST01_OBJECT_ID | SCOTT | 446| 4696064| 1( 0)| 13655265| 4783051| 0| 0| | |* 5 | TABLE ACCESS FULL | TEST02 | SCOTT | 1| 31| 238( 0)| 14233153| 32| 0| 0| | +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ Operation Information (identified by operation id): --------------------------------------------------- 1 - Subquery NDV info - NDV percentage: 0.000011, NDV Expression: ("T2"."OBJECT_ID"[OPTMZ-1]) 3 - Predicate : filter("T3"."DATA_OBJECT_ID"[OPTMZ-1] IS NOT NULL) 4 - Predicate : access("T3"."OBJECT_ID" = "T2"."OBJECT_ID"[OPTMZ-1][OPTMZ-2]) 5 - Predicate : filter("T2"."DATA_OBJECT_ID"[OPTMZ-1] = QUERY[1][OPTMZ-0] AND "T2"."OWNER"[OPTMZ-1] = 'SCOTT'[OPTMZ-0]) Statistics ---------------------------------------------------------------------------------------------------- 0 physical reads 44795489 db block gets 0 consistent gets 0 redo size 0 recursive calls 0 bytes sent via SQL*Net to client 0 bytes received via SQL*Net from client 0 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 31 rows processed 0 bytes sent via PX 0 block received 34 rows fetched. Elapsed: 00:00:14.238

SQL耗时14秒,正常来说应该秒杀才对

改写(方法一)

SQL> select * from (select * from test02 where owner = 'SCOTT' and rownum >= 1) t2 where t2.data_object_id = (select max(data_object_id) from test01 t3 where t3.object_id = t2.object_id); 2 3 4 5 6 7 8 9 Execution Plan ---------------------------------------------------------------- SQL hash value: 2360477481 Optimizer: ADOPT_C +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ | Id | Operation type | Name | Owner | E - Rows | A - Rows | Cost(%CPU) | A - Time | Loops | Memory | Disk | Partition info | +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ | 0 | SELECT STATEMENT | | | | 31| | 26400| 32| 0| 0| | | 1 | SUBQUERY | QUERY[1] | | | 36| | 20842| 72| 0| 0| | | 2 | AGGREGATE | | | 1| 36| 5( 0)| 20745| 72| 0| 0| | |* 3 | TABLE ACCESS BY INDEX ROWID | TEST01 | SCOTT | 145| | 5( 0)| | | | | | |* 4 | INDEX RANGE SCAN | IDX_TEST01_OBJECT_ID | SCOTT | 446| 15872| 1( 0)| 19480| 15908| 0| 0| | |* 5 | VIEW | | | 12| 31| 223( 0)| 26398| 32| 0| 0| | | 6 | COUNT | | | 12| 36| 216( 0)| 5418| 37| 0| 0| | |* 7 | RESULT | | | 12| 36| 216( 0)| 5410| 37| 0| 0| | |* 8 | TABLE ACCESS FULL | TEST02 | SCOTT | 36| 36| 216( 0)| 5390| 37| 0| 0| | +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ Operation Information (identified by operation id): --------------------------------------------------- 3 - Predicate : filter("T3"."DATA_OBJECT_ID"[OPTMZ-1] IS NOT NULL) 4 - Predicate : access("T3"."OBJECT_ID" = "TEST02"."OBJECT_ID"[OPTMZ-3][OPTMZ-2]) 5 - Predicate : filter("TEST02"."DATA_OBJECT_ID"[OPTMZ-3] = QUERY[1][OPTMZ-0]) 7 - Predicate : filter(ROWNUM[OPTMZ-0] >= 1[OPTMZ-0]) 8 - Predicate : filter("TEST02"."OWNER"[OPTMZ-1] = 'SCOTT'[OPTMZ-0]) Statistics ---------------------------------------------------------------------------------------------------- 0 physical reads 19859 db block gets 0 consistent gets 0 redo size 0 recursive calls 0 bytes sent via SQL*Net to client 0 bytes received via SQL*Net from client 0 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 31 rows processed 0 bytes sent via PX 0 block received 38 rows fetched. Elapsed: 00:00:00.029

改写(方法二)

SQL> select * from (select t2.*, (select max(data_object_id) from test01 t3 where t3.object_id = t2.object_id) max_data_object_id from test02 t2) where data_object_id = max_data_object_id and own 2 3 4 5 6 7 8 er = 'SCOTT'; Execution Plan ---------------------------------------------------------------- SQL hash value: 1214109186 Optimizer: ADOPT_C +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ | Id | Operation type | Name | Owner | E - Rows | A - Rows | Cost(%CPU) | A - Time | Loops | Memory | Disk | Partition info | +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ | 0 | SELECT STATEMENT | | | | 31| | 19245| 32| 0| 0| | | 1 | SUBQUERY | QUERY[1] | | | 31| | 13584| 62| 0| 0| | | 2 | AGGREGATE | | | 1| 31| 5( 0)| 13568| 62| 0| 0| | |* 3 | TABLE ACCESS BY INDEX ROWID | TEST01 | SCOTT | 145| | 5( 0)| | | | | | |* 4 | INDEX RANGE SCAN | IDX_TEST01_OBJECT_ID | SCOTT | 446| 15872| 1( 0)| 12120| 15903| 0| 0| | |* 5 | VIEW | | | 12| 31| 225( 0)| 19242| 32| 0| 0| | |* 6 | TABLE ACCESS FULL | TEST02 | SCOTT | 12| 31| 218( 0)| 5533| 32| 0| 0| | +----+--------------------------------+----------------------+------------+----------+----------+-------------+----------+----------+----------+----------+--------------------------------+ Operation Information (identified by operation id): --------------------------------------------------- 3 - Predicate : filter("T3"."DATA_OBJECT_ID"[OPTMZ-1] IS NOT NULL) 4 - Predicate : access("T3"."OBJECT_ID" = "T2"."OBJECT_ID"[OPTMZ-3][OPTMZ-2]) 5 - Predicate : filter("T2"."DATA_OBJECT_ID"[OPTMZ-3] = QUERY[1][OPTMZ-2]) 6 - Predicate : filter("T2"."OWNER"[OPTMZ-1] = 'SCOTT'[OPTMZ-0] AND "T2"."DATA_OBJECT_ID"[OPTMZ-1] IS NOT NULL) Statistics ---------------------------------------------------------------------------------------------------- 0 physical reads 17283 db block gets 0 consistent gets 0 redo size 0 recursive calls 0 bytes sent via SQL*Net to client 0 bytes received via SQL*Net from client 0 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 31 rows processed 0 bytes sent via PX 0 block received 35 rows fetched. Elapsed: 00:00:00.026

结论:看上去原始SQL没有提前过滤t2.owner = ‘SCOTT’,优化器有BUG

http://www.jsqmd.com/news/564177/

相关文章:

  • Z-Image Atelier 生成3D纹理与材质贴图效果展示
  • 【Mojo混合编程黄金三角模型】:类型桥接层×异步调度器×零拷贝内存池——工业级落地必备架构图解
  • Zotero Citation插件开发指南:从环境适配到定制优化的全流程实践
  • MusicFree插件完全指南:5个步骤打造个性化音乐播放体验
  • 阿里开源文生图模型Z-Image-Turbo:指令遵循强,图片质量高
  • 共享图书借阅系统 Java 源码 + 数据库设计完整方案
  • BTP学习笔记01_关联Eclipse和BTP
  • 2026年脱硫塔钢板定制加工:如何挑选实力厂家?固溶不锈钢管/钢管/不锈钢换热器管,钢板厂家选哪家 - 品牌推荐师
  • Palo Alto PAN-OS 11.2.8 VM-Series for ESXi - ML 驱动的下一代防火墙操作系统
  • 佰力博金属电导率测试:精准赋能金属材料性能评估
  • 突破视频解析技术壁垒:LAMDA框架实战解密与流媒体提取全攻略
  • 现代桌面开发的运行时框架:解决企业级应用部署难题的技术突破
  • 这两天的AI资讯看完感觉......
  • 开源社区实践:使用nlp_structbert_sentence-similarity_chinese-large为GitHub项目自动生成相关项目推荐
  • 紫光FPGA PCIe驱动在Ubuntu 24.04下的实战避坑指南
  • Wan2.2-I2V-A14B部署案例:游戏公司AI过场动画原型快速验证方案
  • subfinder完全掌握手册:从入门到专家的实战路径
  • vivado自定义IP封装与总线接口封装方法
  • Mathtype公式编辑与LiuJuan20260223Zimage结合:科研论文中的数学公式智能识别与转换
  • 二极管 vs PMOS:电源防反接电路的成本与性能全面对比(含实测数据)
  • 忍者像素绘卷算法解析:从经典算法到AI生成像素艺术的原理对比
  • STM32 HardFault实战:从寄存器分析到精准定位
  • Vue异步数据获取中数组下标取值失效的深度解析与解决方案
  • CLion调试FreeRTOS任务卡死?手把手教你配置时基与解决变量优化问题
  • DanKoe 视频笔记:生产力未来:一种组织不确定生活的日常惯例
  • LongCat-Image-Edit企业级应用:SpringBoot集成实现宠物电商智能主图生成
  • 报告厅、无纸化会议怎么选?先看懂这些坑!国内这家品牌凭实力出圈
  • LFM2.5-1.2B-Thinking-GGUF模型精讲:深入理解卷积神经网络原理
  • 从零开始用Python+TensorFlow搭建IQ信号识别模型(避坑指南)
  • 重庆口碑较好的舞台搭建团队,你知道有哪些?