1 表分区。
经过试验,对于大表的以表分区格式进行存放是最好的。这样的大表主要体现,表内容表现为历史部分及新增部分,也就是说,表内容会随着时间的推进而慢慢的变大,越来越大。这样的表,就得用分区的格式存放,好处是,对于分区表和没有分区的表,在查询的时候,有分区的表会查询比较快。
创建表 P_TABLE ,这表是每月都有一批新的数。一般比较重要的数都会保存十年以上。那么我这里就以年为分区的界线对表进行划分存放。
sql> CREATE TABLE P_TABLE ( ID NUMBER(8), TDATE , MEMO VARCHAR2(100)
PARTITION BY RANGE(TDATE)
(
PARTITION P_TABLE_2000 VALUES LESS THAN ( TO_DATE('2001-01-01','YYYY-MM-DD') ) TABLESPACE P_TABLE_2000 ,
PARTITION P_TABLE_2001 VALUES LESS THAN ( TO_DATE('2002-01-01','YYYY-MM-DD') ) TABLESPACE P_TABLE_2001 ,
PARTITION P_TABLE_2002 VALUES LESS THAN ( TO_DATE('2003-01-01','YYYY-MM-DD') ) TABLESPACE P_TABLE_2002 ,
PARTITION P_TABLE_2003 VALUES LESS THAN ( TO_DATE('2004-01-01','YYYY-MM-DD') ) TABLESPACE P_TABLE_2003 ,
PARTITION P_TABLE_2004 VALUES LESS THAN ( TO_DATE('2005-01-01','YYYY-MM-DD') ) TABLESPACE P_TABLE_2004 ,
PARTITION P_TABLE_2005 VALUES LESS THAN ( TO_DATE('2006-01-01','YYYY-MM-DD') ) TABLESPACE P_TABLE_2005 ,
PARTITION P_TABLE_2006 VALUES LESS THAN ( TO_DATE('2007-01-01','YYYY-MM-DD') ) TABLESPACE P_TABLE_2006
) ;
这样就可以建立带有 2000 ~ 2006 数据的分区表,而且我这里把每个分区表都存放到一个独立的表空间里面,方便数据的备份转移,或者进行表分区的数据交换等。
至于表空间是需要先创建的。
sql>CREATE TABLESPACE P_TABLE_2000 NOLOGGING DATAFILE 'D:\ORACLE\PRODUCT\10.2\ORCL\MYTABLESPACE\P_TABLE_2000.DBF'
SIZE 10M AUTOEXTEND ON ;
这样就可以建立一个属于自己管理的表空间,而且分区表的索引也可以同时建到单独的表空间内进行管理。以后不用了就可以先DROP表,然后再DROP表空间,就可以把P_TABLE_2000.DBF等自己创建的表空间文件删除,以节约硬盘空间了。
分区表索引的建立:
sql> CREATE INDEX IDX_P_TABLE_2000_MEMO ON P_TABLE_2000(MEMO)
(
PARTITION P_TABLE_2000 TABLESPACE P_TABLE_2000 ,
PARTITION P_TABLE_2001 TABLESPACE P_TABLE_2001 ,
PARTITION P_TABLE_2002 TABLESPACE P_TABLE_2002 ,
PARTITION P_TABLE_2003 TABLESPACE P_TABLE_2003 ,
PARTITION P_TABLE_2004 TABLESPACE P_TABLE_2004 ,
PARTITION P_TABLE_2005 TABLESPACE P_TABLE_2005 ,
PARTITION P_TABLE_2006 TABLESPACE P_TABLE_2006
) ;
当建立分区后,对于带有日期的查询条件时,会先对分区进行筛选,这样就起到把大表先缩成小分区表进行查询,再配合上其他的索引值,那就会变得很快了。就算同等建有索引的表,分区后的查询速度也会比不分区时要快。
具体分析我会在下一次日志写上分析的细节,主要是用到 AUTOTRACE的分析功能。
今天就写到这里。。。