今天又遇到了个问题,我在应用中发现我们的一个web列表显示的特别慢,列表只是简单的将数据单表数据order 下输出,并且是对
create table T_ATTACKEVENT
(
ATTEVNT_ID_N NUMBER not null,
ATTEVNT_SIP_C VARCHAR2(15) not null,
ATTEVNT_SPORT_N NUMBER not null,
ATTEVNT_DIP_C VARCHAR2(15) not null,
ATTEVNT_DPORT_N NUMBER not null,
ATTEVNT_PROTOCOL_C VARCHAR2(10),
ATTEVNT_TIME_C TIMESTAMP(6) not null,
ATTEVNT_NOOFDAY_N NUMBER not null
)
alter table T_ATTACKEVENT
add constraint PK_ATTACKEVENT primary key (ATTEVNT_ID_N)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255
storage
(
initial 64K
minextents 1
maxextents unlimited
);
select * from t_attackevent_0809 t order by t.attevnt_id_n desc
select * from t_attackevent t order by t.attevnt_id_n desc,我以为会默认走主键索引排序,但是当我看执行计划时却发现如下图
采用的是全表查询,经过网上查询发现oracle自动优化,在面对这种情况时会认为全表更有效率而不是采用索引,
解决方法
1.我们这个应用可以考虑以时间字段排序,即
select * from t_attackevent t order by t.attevnt_time_c desc,这种方式即用到了我们在时间上的索引,效率也是可以接受的。
2.如果更广泛一些的情况,我们只有一个主键索引,我们必须使用order by pk ,这时候为了使用index可以采用hint
select /*+index(t PK_ATTACKEVENT)*/* from t_attackevent t order by t.attevnt_id_n desc
(注意hint之间的空格,这个很关键).