暂无图片
Oracle 三表关联统计信息异常
我来答
分享
陈年酒诗
2024-06-11
Oracle 三表关联统计信息异常

两表关联时,统计信息正常

select count(1) 2 from lcpol b 3 inner join lcgrpcont g 4 on g.grpcontno = b.grpcontno 5 and g.grpcontno = '2017081000014618'; Execution Plan ---------------------------------------------------------- Plan hash value: 3988393551 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 35 | 2770 (1)| 00:00:34 | | 1 | SORT AGGREGATE | | 1 | 35 | | | | 2 | NESTED LOOPS | | 535K| 17M| 2770 (1)| 00:00:34 | |* 3 | INDEX UNIQUE SCAN| PK_LCGRPCONT | 1 | 17 | 1 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | IDX_LCPOL_GRPCONTNO | 535K| 9419K| 2769 (1)| 00:00:34 | ------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("G"."GRPCONTNO"='2017081000014618') 4 - access("B"."GRPCONTNO"='2017081000014618')
复制

增加了一个a表的关联,统计信息就错了

select count(1) 2 from lcpol b 3 inner join lcgrpcont g 4 on g.grpcontno = b.grpcontno 5 and g.grpcontno = '2017081000014618' 6 inner join lcinsured a 7 on a.insuredno = b.insuredno 8 and a.contno = b.contno 9 and b.grpcontno = '2017081000014618'; Execution Plan ---------------------------------------------------------- Plan hash value: 2873904152 ------------------------------------------------------------------------------------------------------ | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------------------ | 0 | SELECT STATEMENT | | 1 | 91 | 91 (0)| 00:00:02 | | 1 | SORT AGGREGATE | | 1 | 91 | | | | 2 | NESTED LOOPS | | 41 | 3731 | 91 (0)| 00:00:02 | | 3 | NESTED LOOPS | | 41 | 2583 | 50 (0)| 00:00:01 | |* 4 | INDEX UNIQUE SCAN | PK_LCGRPCONT | 1 | 17 | 1 (0)| 00:00:01 | | 5 | TABLE ACCESS BY INDEX ROWID| LCPOL | 41 | 1886 | 49 (0)| 00:00:01 | |* 6 | INDEX RANGE SCAN | IDX_LCPOL_GRPCONTNO | 70 | | 13 (0)| 00:00:01 | |* 7 | INDEX UNIQUE SCAN | PK_LCINSURED | 1 | 28 | 1 (0)| 00:00:01 | ------------------------------------------------------------------------------------------------------ Predicate Information (identified by operation id): --------------------------------------------------- 4 - access("G"."GRPCONTNO"='2017081000014618') 6 - access("G"."GRPCONTNO"="B"."GRPCONTNO") filter("B"."GRPCONTNO"='2017081000014618') 7 - access("A"."CONTNO"="B"."CONTNO" AND "A"."INSUREDNO"="B"."INSUREDNO")
复制

是怎么回事?

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
陈年酒诗

继续分析发现,问题不在a表,在于
g.grpcontno = ‘2017081000014618’
b.grpcontno = ‘2017081000014618’;
两个条件不能同时出现,什么原理?
我看了两个字段类型都是VARCHAR2(20)

SQL> select count(1) 2 from lcpol b 3 inner join lcgrpcont g 4 on g.grpcontno = b.grpcontno 5 where g.grpcontno = '2017081000014618' 6 ; Execution Plan ---------------------------------------------------------- Plan hash value: 3988393551 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 35 | 2770 (1)| 00:00:34 | | 1 | SORT AGGREGATE | | 1 | 35 | | | | 2 | NESTED LOOPS | | 535K| 17M| 2770 (1)| 00:00:34 | |* 3 | INDEX UNIQUE SCAN| PK_LCGRPCONT | 1 | 17 | 1 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | IDX_LCPOL_GRPCONTNO | 535K| 9419K| 2769 (1)| 00:00:34 | ------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("G"."GRPCONTNO"='2017081000014618') 4 - access("B"."GRPCONTNO"='2017081000014618') SQL> select count(1) 2 from lcpol b 3 inner join lcgrpcont g 4 on g.grpcontno = b.grpcontno 5 where g.grpcontno = '2017081000014618' 6 and b.grpcontno = '2017081000014618'; Execution Plan ---------------------------------------------------------- Plan hash value: 3988393551 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 35 | 14 (0)| 00:00:01 | | 1 | SORT AGGREGATE | | 1 | 35 | | | | 2 | NESTED LOOPS | | 41 | 1435 | 14 (0)| 00:00:01 | |* 3 | INDEX UNIQUE SCAN| PK_LCGRPCONT | 1 | 17 | 1 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | IDX_LCPOL_GRPCONTNO | 41 | 738 | 13 (0)| 00:00:01 | ------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("G"."GRPCONTNO"='2017081000014618') 4 - access("G"."GRPCONTNO"="B"."GRPCONTNO") filter("B"."GRPCONTNO"='2017081000014618') SQL> select count(1) 2 from lcpol b 3 inner join lcgrpcont g 4 on g.grpcontno = b.grpcontno 5 where b.grpcontno = '2017081000014618'; Execution Plan ---------------------------------------------------------- Plan hash value: 3988393551 ------------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | ------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 35 | 2770 (1)| 00:00:34 | | 1 | SORT AGGREGATE | | 1 | 35 | | | | 2 | NESTED LOOPS | | 535K| 17M| 2770 (1)| 00:00:34 | |* 3 | INDEX UNIQUE SCAN| PK_LCGRPCONT | 1 | 17 | 1 (0)| 00:00:01 | |* 4 | INDEX RANGE SCAN | IDX_LCPOL_GRPCONTNO | 535K| 9419K| 2769 (1)| 00:00:34 | ------------------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 3 - access("G"."GRPCONTNO"='2017081000014618') 4 - access("B"."GRPCONTNO"='2017081000014618')
复制
暂无图片 评论
暂无图片 有用 0
打赏 0
吾亦可往

从提供的执行计划和查询来看,问题可能出在索引的使用和条件的组合上。


当单独使用 g.grpcontno = '2017081000014618' 作为条件时,索引可以正常被使用进行查询(如第一个执行计划中的 INDEX UNIQUE SCAN 和 INDEX RANGE SCAN)。


而当同时使用 g.grpcontno = '2017081000014618' 和 b.grpcontno = '2017081000014618' 时,执行计划发生了变化(第二个执行计划),可能是因为这种条件组合导致了索引的使用方式改变,或者是数据库在这种情况下对查询进行了不同的优化处理。


比如,可能由于同时对两个表的相同字段进行精确匹配条件的限制,使得数据库在执行时需要更复杂的索引操作或数据关联策略,从而导致了不同的执行计划和性能表现。

暂无图片 评论
暂无图片 有用 0
打赏 0
Thomas

三表关联时,最后一行and b.grpcontno = '2017081000014618',感觉有点多余。三表都是内连接,第一次内连接已经可确保输出的b表的grpcontno必然是'2017081000014618'。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
oracle业务表的数据发生增删改,该表的索引会写redo,undo吗?
回答 6
自己简单测试一下,一目了然,为啥要猜,凭感觉?SQL>createtablet1(idnumber);Tablecreated.SQL>insertall2intot1values(1)3
Oracle数据库的哪种数据类型精度最高?
回答 2
已采纳
TIMESTAMP数据类型在Oracle中精度最高,通常可以精确到微秒(百万分之一秒)。
如果定期清除oracle数据库审计表
回答 2
也可以把审计改成os或者xml,然后使用操作系统脚本根据时间定期删除当然,还是不建议开审计,增加维护成本
请问有试过在OGG目标端开启归档日志的么?会影响传输不?
回答 1
一般都会开的;归档其实不影响传输速度。当然前提是你机器性能还过得去。
ORACLE 主机sqlplus登录时记录连接终端的IP地址
回答 3
已采纳
1、oracle 用户的.bashprofile写入exportMYIP\'whoami|awk'{print$NF}'|sede's/[()]//g'\'echo"execdbmssess
数据量大的表该怎么提升查询速度
回答 11
执行计划里面有没有回表?索引本身的碎片问题严重吗?
Oracle:建表的时候没有重复语句 ,为什么查表有重复记录 ,用distinct只会在查询结果中去重没有删除表重复记录 ?
回答 4
已采纳
因为最开始没有设置约束条件。查询只是查询。不会删除。建议删除重复数据后加上主键或者唯一约束。或者清空数据后加上主键或者唯一约束。以后就不会有了。
如何清除不存在的归档日志
回答 23
最后咋解决的呀,学习学习
ogg 源和目标的表数据不一致了
回答 1
好像没吧?可以试试ogg的监控工具oggdirector,可以比较一下数据差异。ogg本来是做得增量同步,看看是不是自己配置哪有问题导致数据不同步。
关于Oracle12c 统计信息的问题
回答 1
据我了解,系统没有记录这个参数的变更历史,可能要用logminer根据时间段找一下SYS.OPTSTATUSERPREFS$表的dml.