oracle 大数据 单表查询优化
月亮不懂夜的黑
2012-12-20
在项目中有一个单表数据量比较大,曾经一天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
分区+合适的索引吧。
|
|
月亮不懂夜的黑
2012-12-31
jinnianshilongnian 写道 1、end_time is null or event_time is null 如果end_time/event_time 允许null 将不走索引,建议不用使用null值
2、建议使用下执行计划看看啥情况 针对第一种,我想“涛---哥”的意思是默认不使用null吗? |
|
月亮不懂夜的黑
2012-12-31
魔力猫咪 写道 分区+合适的索引吧。
我这里的索引基本都是需要的,因为这里面,几个索引需要用户在页面可以手动进行排序。分区没考虑过。因为感觉数据不是太重要,并且我们已经给用户提供了数据清理的功能,可以定时清理。数据也不会太恐怖。 |
|
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
学习了
|
|
月亮不懂夜的黑
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有些情况下是不走索引的所以不建议使用。 |