赞
踩
今天碰到一个奇怪的问题:
使用这个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表数据已经被写入并且未能回滚,但是索引受到破坏。
于是删除索引,再次新建,问题消失。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。