10月

27

2010

今天又遇到了个问题,我在应用中发现我们的一个web列表显示的特别慢,列表只是简单的将数据单表数据order 下输出,并且是对

Sql代码  a5182d54d192f4006b199cce274df37f.png

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,我以为会默认走主键索引排序,但是当我看执行计划时却发现如下图

aa2774c68381330c41c34bea2c628475.png

采用的是全表查询,经过网上查询发现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之间的空格,这个很关键).

798 次访问过

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐