我正在使用 Oracle 10g。这是我的查询
select * from Entries
where RefKey in (select RefKey
from Entries
where KeyStat = 1)
and RefKey = Key;
这里 RefKey、Key 和 KeyStat 都被索引了。该表在此处未使用的另一列上进行了分区。在此查询中,我选择当前活动的主密钥(如果 RefKey = Key 然后是主密钥)(KeyStat = 1)。下面是使用 SQLTools 1.21 RC3 执行此查询的计划。
----------------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 270 | 218K (1)| 00:43:37 | | |
| 1 | NESTED LOOPS SEMI | | 1 | 270 | 218K (1)| 00:43:37 | | |
| 2 | PARTITION RANGE ALL | | 1 | 262 | 218K (1)| 00:43:37 | 1 | 12 |
|* 3 | TABLE ACCESS FULL | ENTRIES | 1 | 262 | 218K (1)| 00:43:37 | 1 | 12 |
|* 4 | TABLE ACCESS BY GLOBAL INDEX ROWID| ENTRIES | 10M| 77M| 3 (0)| 00:00:01 | ROWID | ROWID |
|* 5 | INDEX RANGE SCAN | IND_ENTR_REFKEY| 1 | | 2 (0)| 00:00:01 | | |
----------------------------------------------------------------------------------------------------------------------
我担心 ID = 3 "TABLE ACCESS FULL"。如果此查询中使用的所有列都已编入索引,那么为什么 oracle 会进行全表扫描。
如何优化?如果我在内部查询中放入一些值,它会返回得更快。
解释为什么需要子查询:我选择具有至少一个活动键的整个批次。Refkey 不是唯一的;例如:
Key=1, RefKey=1, Stat=1
Key=2, RefKey=1, Stat=0
Key=3, RefKey=2, Stat=1