我有一个包含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后,查询也在进行全表扫描,这是不可接受的。另一方面,使用索引提示并不能真正加快进程。
请告知可能的解决方案。
答案 0 :(得分:2)
对于此查询:
select *
from tab1
where k1 = 1234567889;
最佳索引是在索引中使用k1
作为第一个键的索引。可以有一个复合索引,k1
必须是第一个密钥。听起来你有一个复合主键,而k1
不是第一把钥匙。
我建议你只需定义另一个索引:
create index idx_tab1_k1 on tab1(k1);