oracle 大数据 单表查询优化

在项目中有一个单表数据量比较大,曾经一天100w.现在小一点,但也是很可观的。问一下,对于大数据单表(有索引),查询条件多个,并且需要按照时间排序。有没有比较好一点的方法啊?
select id, devicename, devicetype, alarm_level, logdesc, start_time, end_time, event_status, src_ip, src_port, dest_ip, dest_port, flow_alarm_type, flow_alias, group_name, event_man, event_advice, event_time from  (select  id, devicename, devicetype, alarm_level, logdesc, start_time, end_time, event_status, src_ip, src_port, dest_ip, dest_port, flow_alarm_type, flow_alias, group_name, event_man, event_advice, event_time from alarm_manage where 1=1  and (end_time is null or event_time is null )  and (event_status = '未确认' or event_status = '已确认')  order by id desc)  where rownum<=200 

附上表结构
索引字段为去掉id之后的其他索引 DEVICENAME, DEVICETYPE, START_TIME, ALARM_LEVEL, LOGDESC, EVENT_STATUS
jinnianshilongnian 2012-12-20
1、end_time is null or event_time is null  如果end_time/event_time 允许null 将不走索引,建议不用使用null值

2、建议使用下执行计划看看啥情况
魔力猫咪 2012-12-21
分区+合适的索引吧。
jinnianshilongnian 写道
1、end_time is null or event_time is null  如果end_time/event_time 允许null 将不走索引,建议不用使用null值

2、建议使用下执行计划看看啥情况

针对第一种,我想“涛---哥”的意思是默认不使用null吗?
魔力猫咪 写道
分区+合适的索引吧。

我这里的索引基本都是需要的,因为这里面,几个索引需要用户在页面可以手动进行排序。分区没考虑过。因为感觉数据不是太重要,并且我们已经给用户提供了数据清理的功能,可以定时清理。数据也不会太恐怖。
i4late 2012-12-31
使用 union all 把后面的 (end_time is null or event_time is null )  and (event_status = '未确认' or event_status = '已确认') 分为四种情况结合起来。
select id, devicename, devicetype, alarm_level, logdesc, start_time, end_time, event_status, src_ip, src_port, dest_ip, dest_port, flow_alarm_type, flow_alias, group_name, event_man, event_advice, event_time from  (
select  id, devicename, devicetype, alarm_level, logdesc, start_time, end_time, event_status, src_ip, src_port, dest_ip, dest_port, flow_alarm_type, flow_alias, group_name, event_man, event_advice, event_time from alarm_manage where 1=1  and end_time is null and event_status = '未确认'
union all
....
union all
select  id, devicename, devicetype, alarm_level, logdesc, start_time, end_time, event_status, src_ip, src_port, dest_ip, dest_port, flow_alarm_type, flow_alias, group_name, event_man, event_advice, event_time from alarm_manage where 1=1  and end_time is null and  event_status = '已确认' order by id desc)  where rownum<=200
de6566088 2012-12-31
首先,大数据量将表建为分区表;
第二点,不知道你说“曾经一天100w.现在小一点”是不是说明这个表是个增量表(就是每天都有新数据插入)设计方面最好添加账期今天插入哪些数据;
第三点,“end_time is null or event_time is null"和event_status = '未确认' or event_status = '已确认'条件判断的尽量不要使用NULL和中文;最好将其设计为编码方式!
lvwenwen 2012-12-31
学习了
de6566088 写道
首先,大数据量将表建为分区表;
第二点,不知道你说“曾经一天100w.现在小一点”是不是说明这个表是个增量表(就是每天都有新数据插入)设计方面最好添加账期今天插入哪些数据;
第三点,“end_time is null or event_time is null"和event_status = '未确认' or event_status = '已确认'条件判断的尽量不要使用NULL和中文;最好将其设计为编码方式!

该表为增量表,数据每个时刻都在增加。对于条件中涉及中文的,假如在查询条件中使用编码是不是插入的时候也需要使用编码插入啊。总之,我在插入时时汉子插入,查询时使用unicode转码之后查询没有成功。
de6566088 2012-12-31
月亮不懂夜的黑 写道
de6566088 写道
首先,大数据量将表建为分区表;
第二点,不知道你说“曾经一天100w.现在小一点”是不是说明这个表是个增量表(就是每天都有新数据插入)设计方面最好添加账期今天插入哪些数据;
第三点,“end_time is null or event_time is null"和event_status = '未确认' or event_status = '已确认'条件判断的尽量不要使用NULL和中文;最好将其设计为编码方式!

该表为增量表,数据每个时刻都在增加。对于条件中涉及中文的,假如在查询条件中使用编码是不是插入的时候也需要使用编码插入啊。总之,我在插入时时汉子插入,查询时使用unicode转码之后查询没有成功。

我说的编码方式的意思,我猜你的‘已确认’和‘未确认’是表示状态值的,最好用1来代替‘已确认’用0代替‘未确认’(这个1、0就是泛指,最优是用数字);还有为什么最好别用IS NULL进行判断呢,这个IS NULL有些情况下是不走索引的所以不建议使用。
Global site tag (gtag.js) - Google Analytics