当前位置:   article > 正文

ORACLE表连接查询结果不一致?_select count(*) from table_a a, table_b b

select count(*) from table_a a, table_b b

今天碰到一个奇怪的问题:


使用这个SQL
SQL1:
SELECT * FROM table_a a,table_b b WHERE a.id=b.code AND a.task_id=1001 AND b.spec_id=10302;
查不到记录,但是使用下面的count查询记录数时竟然出现了灵异事件:

SQL2:
SELECT COUNT(*) FROM table_a a,table_b b WHERE a.id=b.AND a.task_id=1 AND b.spec_id=10302;

结果是10000条记录。

 

此后变换了多种SQL写法,总是一会儿有10000记录,一会儿没记录。

 

后来看了执行计划,


SQL1的执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS   20122 1 369
 TABLE ACCESS BY INDEX ROWID  table_b 2 1 68
  NESTED LOOPS   20122 1 369
   TABLE ACCESS FULL  table_a 111 10000 3010000
   INDEX RANGE SCAN  IDX_table_b_CODE 2 1 

 

SQL2的执行计划:
SELECT STATEMENT, GOAL = ALL_ROWS   15089 1 41
 SORT AGGREGATE    1 41
  HASH JOIN   15089 1 41
   TABLE ACCESS FULL  table_a 110 10000 150000
   TABLE ACCESS FULL  table_b 14929 6587191 171266966

 

可以看出SQL2对于两个表都是全表扫描,而写法1则走了table_b表的索引。
怀疑是索引不正确,导致走索引的时候,这些记录查不到。
于是单独查询了table_b表,果然实际上是有记录的。


回忆了一下,可能是昨天在测试时强制kill session,导致table_b表数据已经被写入并且未能回滚,但是索引受到破坏。
于是删除索引,再次新建,问题消失。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/425238
推荐阅读
相关标签
  

闽ICP备14008679号