我现在想把当前/临时/历史建在同一张数据表内,预计数年内数据量会达到500~800万.
临时数据通过审核后,相应的当前数据状态改为历史,相应的临时数据状态改为当前
我考虑过两种分区策略,但各优缺点.
(1)按入库时间来建范围分区表
查询一年的数据,速度上是没问题的
查询当前状态的数据时,速度上慢,我理解它是整表搜索
(2)按入库时间(范围)数据状态(列表)组合分区
数据状态做为分区关键列的前提是:允许该表的数据行可以移动分区
查询一年的数据,速度上是可以的
查询一种状态的数据,速度上也是可以的
虽然查询速度上是解决了,但每次数据状态的改变,会引起DML,引起数据行分区的移动(实际上是DEL+ADD) 以上两种分区策略各有优缺点,请各位高手帮我答疑,谢谢.
临时数据通过审核后,相应的当前数据状态改为历史,相应的临时数据状态改为当前
我考虑过两种分区策略,但各优缺点.
(1)按入库时间来建范围分区表
查询一年的数据,速度上是没问题的
查询当前状态的数据时,速度上慢,我理解它是整表搜索
(2)按入库时间(范围)数据状态(列表)组合分区
数据状态做为分区关键列的前提是:允许该表的数据行可以移动分区
查询一年的数据,速度上是可以的
查询一种状态的数据,速度上也是可以的
虽然查询速度上是解决了,但每次数据状态的改变,会引起DML,引起数据行分区的移动(实际上是DEL+ADD) 以上两种分区策略各有优缺点,请各位高手帮我答疑,谢谢.
“虽然查询速度上是解决了,但每次数据状态的改变,会引起DML,引起数据行分区的移动(实际上是DEL+ADD) ”,这个带来的额外资源消耗是可以接受的,并不比你update同一记录慢多少,对于一个系统来说,查询所消耗的系统资源远远高于更新数据。
也可以创建索引
你也可以指定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
)
还是?