首页 > 其他分享 >【YashanDB知识库】filter or改写问题

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

时间:2024-07-24 15:08:21浏览次数:12  
标签:YashanDB tab1 知识库 col1 filter TEST test where select

问题现象

当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,tab1,知识库,col1,filter,TEST,test,where,select
From: https://www.cnblogs.com/YashanDB/p/18320933

相关文章

  • 【YashanDB知识库】yac修改参数后关闭数据库hang住
    【标题】yac修改参数后关闭数据库hang住【问题分类】性能优化【关键词】YashanDB,yac,shutdownhang【问题描述】修改yac参数后执行shutdownimmediate,数据库hang住。【问题原因分析】Shutdown操作时,线程在获取gInstance->trigger->sema信号量时卡住。该信号量应由mai......
  • 【YashanDB知识库】EXP导致主机卡死问题
    问题现象问题单:exp导出全库1主2备主节点执行,DMP文件30G左右系统卡死,发生主备切换现象:expsys/Cod-2022file=bim20240402.dmpfull=y服务器卡死,ssh连接不上服务器。等待一两个小时后,可以重新连接上。备用节点升主正常,查看run.log,心跳发送不到主节点。重连后,yasdb不......
  • 【机器学习】FastGPT 知识库搜索测试功能解析
    本文以FastGPT知识库的搜索测试功能为入口,分析FastGPT的知识检索流程。一、搜索功能介绍1.1整体介绍搜索测试功能包含三种类型:语义检索、全文检索、混合检索。语义检索:使用向量进行文本相关性查询,即调用向量数据库根据向量的相似性检索;全文检索:使用传统的全文检索,适......
  • 利用helplook建立个人知识库
    我使用过多个个人知识库系统,但一直没有找到理想的.我心目中的个人知识库应具有如下特征:知识管理系统知识管理支持类似于word的富文本或者markdown格式,可以复杂的系统性知识.简单知识管理有些知识点比较零碎.比如一些随笔.这类知识点希望有多层级的分类管理.日记......
  • ASP.NET Core MVC如何在Filter中获取ControllerName和ActionName,以及在Action方法上声
    在ASP.NETCoreMVC的Filter中,我们可以通过ActionContext对象获取到许多有用的信息,例如下面的代码在IAuthorizationFilter中,获取了ControllerName和ActionName,以及在Action方法上声明的Filter:usingMicrosoft.AspNetCore.Mvc.Controllers;usingMicrosoft.AspNetCore.Mvc.Filte......
  • 预处理知识库文件
    在载入知识库文件的时候,直接上传文档虽然能实现基础的问答,但是,其效果并不能发挥到最佳水平。因此,我们建议开发者对知识库文件做出以下的预处理。以下方式的预处理如果执行了,有概率提升模型的召回率。1.使用TXT/Markdown 等格式化文件,并按照要点排版例如,以下段落应该被处......
  • gateway filter
    默认filter默认的有38个,分为5组:请求头、请求参数(查询字符串)、响应头、前缀和路径、其他,作用都不是很大,挑几个举个例#请求和响应filter-id:test_my_consumeruri:http://localhost:8082predicates:-Path=/feign/**filters:-AddRequestHeader=custom......
  • 过滤器(Filter)和拦截器(Interceptor)的执行顺序和区别
    https://www.cnblogs.com/kuotian/p/13176186.html过滤器FilterFilter有如下几个用处。Filter有如下几个种类。javax.servlet.Filter接口1.通过@WebFilter注解配置2.通过@Bean来配置3.SpringMVC在web.xml配置过滤器启动测试拦截器InterceptorHandlerIn......
  • 看看我发现了什么好东西!FlowUs知识库还有“就业服务站点”?!
    不得不说,FlowUs的知识库内容是在是太丰富了,浏览了一下,发现真有能帮助毕业生的就业信息分享+人才政策汇总等我需要的信息......
  • 【YashanDB知识库】oracle dblink varchar类型查询报错记录
    问题单:OracleDBLINK查询崖山DB报错oracle服务器上ODBC安装unixodbc安装:yum-yinstallunixODBCmysql配置安装对应版本的odbc:myodbc-installer-d-a-n"MySQL8.0"-t"DRIVER=/home/oracle/tools/mysql-connector-odbc-8.0.20/lib/libmyodbc8w.so;SETUP=/home/oracle/tool......