2013-04-30 65 views
1

当我查询我的表像这样的特定对象,我会得到一个空的结果集:Oracle索引行为

SELECT 
    a, b, c, valid_to, pk_mykey, myobject 
FROM 
    myschema.mytable 
WHERE 
    valid_to = to_date('31.12.9999 23:59:59', 'dd.mm.yyyy hh24:mi:ss') 
AND 
    pk_mykey > 0 
AND 
    myobject = 'ABC.123'; 

但我知道的记录必须是在表中!

所以我用这个查询,它会突然出现:

SELECT 
    /*+ NO_INDEX(mytable myindex) */ 
    a, b, c, valid_to, pk_mykey, myobject 
FROM 
    myschema.mytable 
WHERE 
    valid_to = to_date('31.12.9999 23:59:59', 'dd.mm.yyyy hh24:mi:ss') 
AND 
    pk_mykey > 0 
AND 
    myobject = 'ABC.123'; 

因此,通过使用该记录不会显示指数,但没有索引它会?这怎么可能?我在这里错过了什么?我的表格和/或我的索引有什么问题?任何想法如何我可以解决这个问题?

(DBMS是的Oracle 11g EE 11.2.0.2.0 64位)

+0

什么是差异b/w的2个查询? – 2013-04-30 09:19:58

+0

@ ling.s:'NO_INDEX'提示 – 2013-04-30 09:30:57

+0

@ ling.s:是的,正是a_horse_with_no_name所说的提示。 query1根本不给我任何记录。 query2恰好为1条记录(因为它应该是)其中myobject ='ABC.123'且其他条件适用 – BaseBallBatBoy 2013-04-30 10:00:53

回答

3

您已确认有在执行计划的差异?

如果您在使用和不使用索引时得到不同的结果,那么我会考虑删除索引并重新创建它。不要只重建索引,因为新的细分将基于旧数据,并且如果确实存在无法解决问题的损坏问题。

+0

是,query1使用索引(唯一扫描)。 query2执行全表扫描,不包括索引。 – BaseBallBatBoy 2013-04-30 09:54:13

+0

这是myobject和valid_to上的索引吗? – 2013-04-30 10:39:09

+0

,myobject和valid_to上的唯一索引。所有索引(myschema_idx)都有一个表空间,所有表(myschema_tbl)都有一个表空间。 – BaseBallBatBoy 2013-04-30 10:54:19

-1

理论上,由于某些Oracle错误,您的索引内容可能会“无效”。这可能发生在一些早期的RAC版本上。 尝试执行该语句

ALTER TABLE myschema.mytable VALIDATE STRUCTURE CASCADE; 

这将“交叉检查”表内容针对它的索引。或者尝试重建索引。

+1

你不是指ANALYZE TABLE吗?如果是这样,我不是DBA,因此没有运行这种查询的权限...... – BaseBallBatBoy 2013-04-30 11:16:35

+0

它是“alter table”的非破坏性声明,即使在prod系统上也可以“安全”执行。它只会产生大量的IO。如果交叉检查失败,将在udump_dest中创建转储文件。该命令不需要DBA专有权,也可以作为模式所有者执行它。 – ibre5041 2013-04-30 11:23:24

+0

'ORA-01735:无效的ALTER TABLE选项' – 2013-05-01 22:34:54