每天生成一张表,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是这种类型可以吗?如果我不每天生成一张表,而是每个终端生成一个表。那样插入又好慢。性能优化

解决方案 »

  1.   

    create index IDX_TABLE_ID_DATETIME on TABLE (ID, DATETIME);
      

  2.   

    试了。建了两个字段的复合索引跟只建id的索引,效率一样,甚至还比这个多1s
      

  3.   


    别人都是查一天的,建个DATETIME 索引有啥用。
      

  4.   

    对哦。对哦。别人都最少要查一天。我现在想着按ID后一位建分区表不知道怎么样
    sql是很简单的查询:select id,time,allcolum... from data20130630 where id='' and datatime<='' and datatime>='';
      

  5.   

    按月建分区,然后datatime建分区索引。
      

  6.   

    试一下用并行select/*+parallel(data20130630,4)*/ id,time,allcolum... from data20130630 where id='' and datatime<='' and datatime>='';
    如果有效果的话最好在数据库压力小的时候执行,因为并行会影响数据库的性能