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

【YashanDB知识库】filter or改写问题

问题现象

当filter中出现or的时候,会导致filter无法走索引或者走hash join,就需要进行改写,例如:

create table test_tab1(col1 int, col2 int, col3 int);
create table test_tab2(col4 int, col5 int, col6 int);begin
for i in 1..10000 loopinsert into test_tab1 values (i,i+1,i+2);insert into test_tab2 values (i,i+1,i+2);
endloop;
commit;
end;
/exec DBMS_STATS.GATHER_TABLE_STATS('SYS', 'test_tab1', null, 1, FALSE, 'FOR ALL COLUMNS SIZE AUTO', 4, 'AUTO', TRUE);
exec DBMS_STATS.GATHER_TABLE_STATS('SYS', 'test_tab2', null, 1, FALSE, 'FOR ALL COLUMNS SIZE AUTO', 4, 'AUTO', TRUE);select * from test_tab1, test_tab2 where col1=col4 or col2=col5;select * from test_tab1, test_tab2 where col1=col4
union all
select * from test_tab1, test_tab2 where col1<>col4 and col2=col5;create unique index idx1 on test_tab1(col1);
create unique index idx2 on test_tab1(col2);exec DBMS_STATS.GATHER_TABLE_STATS('SYS', 'test_tab1', null, 1, FALSE, 'FOR ALL COLUMNS SIZE AUTO', 4, 'AUTO', TRUE);
exec DBMS_STATS.GATHER_TABLE_STATS('SYS', 'test_tab2', null, 1, FALSE, 'FOR ALL COLUMNS SIZE AUTO', 4, 'AUTO', TRUE);select * from test_tab1 where col1=5 or col2=5;select * from test_tab1 where col1=5
union all
select * from test_tab1 where col1<>5 and col2=5;

执行计划:

SQL> explain select * from test_tab1, test_tab2 where col1=col4 or col2=col5;PLAN_DESCRIPTION
----------------------------------------------------------------
SQL hash value: 1783492608
Optimizer: ADOPT_C+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| 0 | SELECT STATEMENT | | | | | |
|* 1 | NESTED LOOPS INNER | | | 15003| 16082( 0)| |
| 2 | TABLE ACCESS FULL | TEST_TAB1 | SYS | 10000| 24( 0)| |
| 3 | TABLE ACCESS FULL | TEST_TAB2 | SYS | 10000| 24( 0)| |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+Operation Information (identified by operation id):
---------------------------------------------------1 - Predicate : filter("TEST_TAB1"."COL2" = "TEST_TAB2"."COL5" OR "TEST_TAB1"."COL1" = "TEST_TAB2"."COL4")16 rows fetched.SQL> explain select * from test_tab1, test_tab2 where col1=col4
union all3 select * from test_tab1, test_tab2 where col1<>col4 and col2=col5;PLAN_DESCRIPTION
----------------------------------------------------------------
SQL hash value: 2495885085
Optimizer: ADOPT_C+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| 0 | SELECT STATEMENT | | | | | |
| 1 | VIEW | | | 20000| 111( 0)| |
| 2 | UNION ALL | | | 20000| 111( 0)| |
|* 3 | HASH JOIN INNER | | | 10000| 54( 0)| |
| 4 | TABLE ACCESS FULL | TEST_TAB1 | SYS | 10000| 24( 0)| |
| 5 | TABLE ACCESS FULL | TEST_TAB2 | SYS | 10000| 24( 0)| |
|* 6 | HASH JOIN INNER | | | 10000| 54( 0)| |
| 7 | TABLE ACCESS FULL | TEST_TAB1 | SYS | 10000| 24( 0)| |
| 8 | TABLE ACCESS FULL | TEST_TAB2 | SYS | 10000| 24( 0)| |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+Operation Information (identified by operation id):
---------------------------------------------------3 - Predicate : access("TEST_TAB1"."COL1" = "TEST_TAB2"."COL4")6 - Predicate : access("TEST_TAB1"."COL2" = "TEST_TAB2"."COL5")filter("TEST_TAB1"."COL1" <> "TEST_TAB2"."COL4")23 rows fetched.SQL> explain select * from test_tab1 where col1=5 or col2=5;PLAN_DESCRIPTION
----------------------------------------------------------------
SQL hash value: 3573759094
Optimizer: ADOPT_C+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| 0 | SELECT STATEMENT | | | | | |
|* 1 | TABLE ACCESS FULL | TEST_TAB1 | SYS | 2| 25( 0)| |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+Operation Information (identified by operation id):
---------------------------------------------------1 - Predicate : filter("TEST_TAB1"."COL1" = 5 OR "TEST_TAB1"."COL2" = 5)14 rows fetched.SQL> explain select * from test_tab1 where col1=5
union all3 select * from test_tab1 where col1<>5 and col2=5;PLAN_DESCRIPTION
----------------------------------------------------------------
SQL hash value: 2073754267
Optimizer: ADOPT_C+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| Id | Operation type | Name | Owner | Rows | Cost(%CPU) | Partition info |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+
| 0 | SELECT STATEMENT | | | | | |
| 1 | VIEW | | | 2| 1( 0)| |
| 2 | UNION ALL | | | 2| 1( 0)| |
| 3 | TABLE ACCESS BY INDEX ROWID | TEST_TAB1 | SYS | 1| 1( 0)| |
|* 4 | INDEX UNIQUE SCAN | IDX1 | SYS | 1| 1( 0)| |
|* 5 | TABLE ACCESS BY INDEX ROWID | TEST_TAB1 | SYS | 1| 1( 0)| |
|* 6 | INDEX UNIQUE SCAN | IDX2 | SYS | 1| 1( 0)| |
+----+--------------------------------+----------------------+------------+----------+-------------+--------------------------------+Operation Information (identified by operation id):
---------------------------------------------------4 - Predicate : access("TEST_TAB1"."COL1" = 5)5 - Predicate : filter("TEST_TAB1"."COL1" <> 5)6 - Predicate : access("TEST_TAB1"."COL2" = 5)21 rows fetched.

执行时间:

SQL> select * from test_tab1, test_tab2 where col1=col4 or col2=col5;...10000 rows fetched.Elapsed: 00:00:45.263SQL> select * from test_tab1, test_tab2 where col1=col4
union all3 select * from test_tab1, test_tab2 where col1<>col4 and col2=col5;...10000 rows fetched.Elapsed: 00:00:00.447SQL> select * from test_tab1 where col1=5 or col2=5;COL1 COL2 COL3
------------ ------------ ------------4 5 65 6 72 rows fetched.Elapsed: 00:00:00.004SQL> select * from test_tab1 where col1=5
union all2 3 select * from test_tab1 where col1<>5 and col2=5;COL1 COL2 COL3
------------ ------------ ------------5 6 74 5 62 rows fetched.Elapsed: 00:00:00.000

问题的风险及影响

性能会大幅下降。

问题影响的版本

截止2024年4月份,最新版本依然有这个问题。

问题发生原因

问题单:优化器支持or改为了集合操作(CONCATENATION)需求没有实现。

解决方法以及规避方法

理论上有两种解决方案,一种是使用or索引,另一种是改写为集合操作,改写为集合操作的覆盖面会更大一些。

问题分析以及处理过程

1、可以通过观察oracle的执行计划,是否出现CONCATENATION这个算子,如果出现说明计划被改写为集合操作;

2、观察filter中是否有or导致了无法走hash join或者阻碍了走索引计划。

经验总结

执行计划并不是建了索引就可以选上索引的,需要将条件改为可以走索引才行。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • EXO项目解析:pynvml怎么实现监控的,包括什么参数
  • 怎么服务器组内网?
  • 【BES2500x系列 -- RTX5操作系统】系统启动流程 -- boot loader概念讲解 --(九)
  • GO内存分配详解
  • Python 使用TCP\UDP协议创建一个聊天室
  • 四、Object 通⽤⽅法
  • es master 节点数据丢失导致数据节点加入集群失败的灾难恢复
  • C# 之工控机数据类型 高低位(大小端)、BitConverter、IsLittleEndian、字节数组转换(高低位)
  • Redis 主从复制、哨兵机制关键参数与命令
  • Spring Boot + Spring Cloud 入门
  • java模拟多ip请求【搬代码】
  • 基于STM32的农业大棚温湿度采集控制系统的设计
  • git实现多人协作开发同一个项目
  • 100个python的基本语法知识【下】
  • 【洛谷】P2241 统计方形(数据加强版)——C++
  • [iOS]Core Data浅析一 -- 启用Core Data
  • Angular2开发踩坑系列-生产环境编译
  • Apache Pulsar 2.1 重磅发布
  • Apache Zeppelin在Apache Trafodion上的可视化
  • JAVA SE 6 GC调优笔记
  • Java应用性能调优
  • js
  • Median of Two Sorted Arrays
  • Mysql优化
  • Netty 框架总结「ChannelHandler 及 EventLoop」
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 阿里云爬虫风险管理产品商业化,为云端流量保驾护航
  • 包装类对象
  • 回顾 Swift 多平台移植进度 #2
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 京东美团研发面经
  • 设计模式(12)迭代器模式(讲解+应用)
  • 思考 CSS 架构
  • 微信开放平台全网发布【失败】的几点排查方法
  • 做一名精致的JavaScripter 01:JavaScript简介
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • $forceUpdate()函数
  • (~_~)
  • (02)Hive SQL编译成MapReduce任务的过程
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (安全基本功)磁盘MBR,分区表,活动分区,引导扇区。。。详解与区别
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (二刷)代码随想录第15天|层序遍历 226.翻转二叉树 101.对称二叉树2
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (九)c52学习之旅-定时器
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转) 深度模型优化性能 调参
  • ***原理与防范
  • .mysql secret在哪_MySQL如何使用索引
  • .net 发送邮件
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 中让 Task 支持带超时的异步等待