oracle大表查询效率

wlnlgt 2013-07-05 12:35:51
每天生成一张表,5000个终端每10s左右发来一条数据,发来的信息都存在这个表里,大概有几千万条记录。
主要字段有终端ID(VARCHAR2 15). DATATIME(VARCHAR2 20)...其他的不重要 其中终端ID不唯一
查询时候一般是按终端ID和时间条件查询
不建索引,查询一个终端的一天数据,大概要13s左右
建了终端ID字段的索引,查询一个终端的一天数据,大概要7s左右。还不满足要求。
这是执行计划
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'DATA20130630'
2 1 INDEX (RANGE SCAN) OF '0630_PK' (NON-UNIQUE)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
4639 consistent gets
3198 physical reads
0 redo size
402252 bytes sent via SQL*Net to client
38231 bytes received via SQL*Net from client
290 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
4324 rows processed

哪位能帮我分析一下怎么优化
如果建分区表,这个datattime是这种类型可以吗?

如果我不每天生成一张表,而是每个终端生成一个表。那样插入又好慢。
...全文
330 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
wlnlgt 2013-07-11
  • 打赏
  • 举报
回复
暂时先这样吧。只能提高到2s,暂时没办法1s内完成了
chzjw254 2013-07-08
  • 打赏
  • 举报
回复
试一下用并行select/*+parallel(data20130630,4)*/ id,time,allcolum... from data20130630 where id='' and datatime<='' and datatime>=''; 如果有效果的话最好在数据库压力小的时候执行,因为并行会影响数据库的性能
wdx12065 2013-07-06
  • 打赏
  • 举报
回复
按月建分区,然后datatime建分区索引。
shy315 2013-07-05
  • 打赏
  • 举报
回复
客户一般都比较关注统计数据,不需要所有的记录吧。 每天记录完后,跑一个定时的统计程序,生成统计临时表,这类需求更普遍些。
wlnlgt 2013-07-05
  • 打赏
  • 举报
回复
是呀。客户一般都是查询好几天。然后我就要查好几天的表,只有结束和开始那张表有时间条件,中间的表都只有ID条件
u010412956 2013-07-05
  • 打赏
  • 举报
回复
引用 7 楼 wlnlgt 的回复:
对哦。对哦。别人都最少要查一天。我现在想着按ID后一位建分区表不知道怎么样 sql是很简单的查询:select id,time,allcolum... from data20130630 where id='' and datatime<='' and datatime>='';
那我就疑惑了。 你这个表是一天一张,那按道理 里面存的就是一天的数据 你又要至少查一天的数据,那 就得查多张表吧?
wlnlgt 2013-07-05
  • 打赏
  • 举报
回复
对哦。对哦。别人都最少要查一天。我现在想着按ID后一位建分区表不知道怎么样 sql是很简单的查询:select id,time,allcolum... from data20130630 where id='' and datatime<='' and datatime>='';
shy315 2013-07-05
  • 打赏
  • 举报
回复
引用 楼主 wlnlgt 的回复:
每天生成一张表,……
没看清,抱歉!
u010412956 2013-07-05
  • 打赏
  • 举报
回复
引用 2 楼 shy315 的回复:
create index IDX_TABLE_ID_DATETIME on TABLE (ID, DATETIME);
别人都是查一天的,建个DATETIME 索引有啥用。
shy315 2013-07-05
  • 打赏
  • 举报
回复
贴一下sql,可能想象的不同
wlnlgt 2013-07-05
  • 打赏
  • 举报
回复
试了。建了两个字段的复合索引跟只建id的索引,效率一样,甚至还比这个多1s
shy315 2013-07-05
  • 打赏
  • 举报
回复
create index IDX_TABLE_ID_DATETIME on TABLE (ID, DATETIME);
wlnlgt 2013-07-05
  • 打赏
  • 举报
回复
为什么没人回复啊?分数太少了,可是我没那么多分数给

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧