我现在想把当前/临时/历史建在同一张数据表内,预计数年内数据量会达到500~800万.
   临时数据通过审核后,相应的当前数据状态改为历史,相应的临时数据状态改为当前
我考虑过两种分区策略,但各优缺点.
(1)按入库时间来建范围分区表
   查询一年的数据,速度上是没问题的
   查询当前状态的数据时,速度上慢,我理解它是整表搜索
(2)按入库时间(范围)数据状态(列表)组合分区
   数据状态做为分区关键列的前提是:允许该表的数据行可以移动分区
   查询一年的数据,速度上是可以的
   查询一种状态的数据,速度上也是可以的
   虽然查询速度上是解决了,但每次数据状态的改变,会引起DML,引起数据行分区的移动(实际上是DEL+ADD)   以上两种分区策略各有优缺点,请各位高手帮我答疑,谢谢.

解决方案 »

  1.   

    尝试一下  时间,hash 的组合分区
      

  2.   

    我的关键查询业务是查询当前数据,用时间+hash分区,还是需要整表查询吧?
      

  3.   

    分为当前,临时,历史三个分区,基于时间的索引可采用全局按时间范围分区,即,索引的分区方式和表分区方式不同。
    “虽然查询速度上是解决了,但每次数据状态的改变,会引起DML,引起数据行分区的移动(实际上是DEL+ADD) ”,这个带来的额外资源消耗是可以接受的,并不比你update同一记录慢多少,对于一个系统来说,查询所消耗的系统资源远远高于更新数据。
      

  4.   

    不需要整表查询 oracle 比较智能的
    也可以创建索引
    你也可以指定partition,
    create table partition_test
    (
      channel_id number(10),
      channel_number number(10),
      channel_type varchar2(10),
      channel_ varchar2(50)
    )
    partition by range (channel_number)
    subpartition by hash (channel_id)
    subpartitions 4
    ( PARTITION p1 VALUES LESS THAN (TO_DATE('01-APR-1998','DD-MON-YYYY')), tablespace ts1,
     PARTITION p2 VALUES LESS THAN (TO_DATE('01-JUL-1998','DD-MON-YYYY')) tablespace ts2,
     PARTITION p3 VALUES LESS THAN (TO_DATE('01-OCT-1998','DD-MON-YYYY')) tablespace ts3,
     PARTITION p4 VALUES LESS THAN (TO_DATE('01-JAN-1998','DD-MON-YYYY')) tablespace ts4
    )
      

  5.   

    楼主为什么觉得第一个方案是全表扫描?你设计的partition key不符合你的查询要求吗?
    还是?