ORACLE表连接查询结果不一致?

来源:互联网 发布:新西兰基督城公交软件 编辑:程序博客网 时间:2024/05/12 22:18

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


使用这个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表数据已经被写入并且未能回滚,但是索引受到破坏。
于是删除索引,再次新建,问题消失。

原创粉丝点击