避免在表Oracle上进行全表扫描

时间:2015-02-27 19:25:31

标签: oracle plsql full-text-search

我有一个包含70列的表,其中主键是15列的组合(包括number和varchar2)。请参阅以下查询

select * from tab1 where k1=1234567889; 

Plan hash value: 1179808636
---------------------------------------------------------------------------------
| Id  | Operation         | Name        | Rows  | Bytes | Cost (%CPU)| Time     |
---------------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |             |  6044 |  2201K|  4585K  (1)| 15:17:04 |
|*  1 |  TABLE ACCESS FULL| tab1        |  6044 |  2201K|  4585K  (1)| 15:17:04 |
---------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 – filter ("K1"=30064825087)

其中tab1是上面提到的表,k1是作为主键一部分的列。表未分区。插入数据后,还会分析表(表,索引和列)。上述查询的输出返回100000加上记录。问题是即使在k1列上使用PK后,查询也在进行全表扫描,这是不可接受的。另一方面,使用索引提示并不能真正加快进程。

请告知可能的解决方案。

1 个答案:

答案 0 :(得分:2)

对于此查询:

select *
from tab1
where k1 = 1234567889;

最佳索引是在索引中使用k1作为第一个键的索引。可以有一个复合索引,k1必须是第一个密钥。听起来你有一个复合主键,而k1不是第一把钥匙。

我建议你只需定义另一个索引:

create index idx_tab1_k1 on tab1(k1);