【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 loop
insert into test_tab1 values (i,i+1,i+2);
insert into test_tab2 values (i,i+1,i+2);
end
loop;
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 all
3 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 all
3 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.263
SQL> select * from test_tab1, test_tab2 where col1=col4
union all
3 select * from test_tab1, test_tab2 where col1<>col4 and col2=col5;
...
10000 rows fetched.
Elapsed: 00:00:00.447
SQL> select * from test_tab1 where col1=5 or col2=5;
COL1 COL2 COL3
------------ ------------ ------------
4 5 6
5 6 7
2 rows fetched.
Elapsed: 00:00:00.004
SQL> select * from test_tab1 where col1=5
union all
2 3 select * from test_tab1 where col1<>5 and col2=5;
COL1 COL2 COL3
------------ ------------ ------------
5 6 7
4 5 6
2 rows fetched.
Elapsed: 00:00:00.000
问题的风险及影响
性能会大幅下降。
问题影响的版本
截止2024年4月份,最新版本依然有这个问题。
问题发生原因
问题单:优化器支持or改为了集合操作(CONCATENATION)需求没有实现。
解决方法以及规避方法
理论上有两种解决方案,一种是使用or索引,另一种是改写为集合操作,改写为集合操作的覆盖面会更大一些。
问题分析以及处理过程
1、可以通过观察oracle的执行计划,是否出现CONCATENATION这个算子,如果出现说明计划被改写为集合操作;
2、观察filter中是否有or导致了无法走hash join或者阻碍了走索引计划。
经验总结
执行计划并不是建了索引就可以选上索引的,需要将条件改为可以走索引才行。
【YashanDB知识库】filter or改写问题的更多相关文章
- day13:迭代器&高阶函数(map,reduce,filter,sorted)
迭代器 1.迭代器的定义: 能被next调用,并不断返回下一个值的对象,叫做迭代器(对象) 2.迭代器的概念: 迭代器指的是迭代取值的工具,迭代是一个重复的过程, 每次重复都是基于上一次的结果而继续的 ...
- 谈谈“色彩空间表示方法”——RGB、YUY2、YUYV、YVYU、UYVY、AYUV
转自:http://bbs.chinavideo.org/viewthread.php?tid=4143 还可参考http://www.fourcc.org/yuv.php 小知识:RGB与YUV-- ...
- day13. 迭代器与高阶函数
一.迭代器 """ 能被next调用,并不断返回下一个值的对象,叫做迭代器(对象) 概念: 迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果 ...
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- Javaweb 使用Servlet技术改写用户登录 使用Filter技术解决中文乱码
先把实验3的jsp页面复制过来: WebContent->WEB-INF->lib下面的jar包8.0版本也要记得复制: Java Resources->src下的 cn.edu.h ...
- 关于for、foreach、filter等的一些用法
通常我们使用得最熟悉的是for循环. 比如对于一组数字的排大小,可以使用冒泡法. var a=[]; for(var d=0;d<5;d++){ var b=window ...
- 陨石坑之webapi使用filter
首先为什么说这是一个坑,是因为我们在webapi中使用filter的时候也许会先百度一下,好吧,挖坑的来了,我看了好几篇文章写的是使用System.Web.Mvc.Filters.ActionFilt ...
- Swift函数编程之Map、Filter、Reduce
在Swift语言中使用Map.Filter.Reduce对Array.Dictionary等集合类型(collection type)进行操作可能对一部分人来说还不是那么的习惯.对于没有接触过函数式编 ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
- javaWeb 使用 filter 处理全站乱码问题
1. web.xml文件中的配置 <filter> <filter-name>CharacterEncodingFilter</filter-name> <f ...
随机推荐
- springboot 整合 pagehelper
pom.xml <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pa ...
- nuxt3正确使用keepalive页面缓存组件缓存
最近使用nuxt@3.x版本做SEO优化项目比较多,之前也踩坑过,所以记录一下在 nuxt3 中路由缓存的正确使用方法,本人也之前在GitHub社区中提交过反馈问题,最后是在 3.8.2 版本解决了路 ...
- 在github开源市场如何高效寻找优秀开源项目
作为程序员,不论是开发还是学习,肯定会用到开源项目,那么怎么快速在开源网站找到这些项目呢? 常用的开源网站有:github 和 gitee github是全球最大的开源社区,今天就以github为例, ...
- [oeasy]python0041_ 转义字符_转义序列_escape_序列_sequence
转义序列 回忆上次内容 上次回顾了5bit-Baudot博多码的来历 从 莫尔斯码 到 博多码 原来 人 来 收发电报 现在 机器 来 收发电报 输入方式 从 电键 改成 键盘 输出方式 从 纸带 变 ...
- WPF/C#:实现导航功能
前言 在WPF中使用导航功能可以使用Frame控件,这是比较基础的一种方法.前几天分享了wpfui中NavigationView的基本用法,但是如果真正在项目中使用起来,基础的用法是无法满足的.今天通 ...
- AT_agc017_b 题解
洛谷链接&Atcoder 链接 本篇题解为此题较简单做法,请放心阅读. 题目简述 一共有 \(n\) 个格子,给定两个整数 \(A,B\) 分别位于第 \(1\) 和第 \(n\) 格,中间有 ...
- 基础-数组_C语言
C 语言支持数组数据结构,它可以存储一个固定大小的相同类型元素的顺序集合.数组是用来存储一系列数据,但它往往被认为是一系列相同类型的变量. 数组的声明并不是声明一个个单独的变量,比如 runoob0. ...
- Vue 中引用第三方js总结
vue中引用第三方js总结 By:授客 QQ:1033553122 实践环境 win10 Vue 2.9.6 本文以引用jsmind为例,讲解怎么在vue中引用第三方js类库 基础示例 1.把下载好的 ...
- ScaleDet:AWS 基于标签相似性提出可扩展的多数据集目标检测器 | CVPR 2023
论文提出了一种可扩展的多数据集目标检测器(ScaleDet),可通过增加训练数据集来扩大其跨数据集的泛化能力.与现有的主要依靠手动重新标记或复杂的优化来统一跨数据集标签的多数据集学习器不同,论文引入简 ...
- mysql数据库无法录入汉字问题
1.插入数据出现错误 show full columns from 表名;//查看数据表列编码 2. alter table 表名 change 列名 列名 varchar(自己设置) charact ...