1.orcle 10g 创建分区表不能自动创建,
如果想自动根据时间创建分区表需要
写脚本自动增加partition
CREATE TABLE jcsj_sssj (
tagname VARCHAR2(128),
tagvalue VARCHAR2(128),
timetamp DATE
)
PARTITION BY RANGE (timetamp)
(
PARTITION P0 VALUES LESS THAN (TO_DATE('11-2-2017', 'dd-mm-yyyy')),
PARTITION P1 VALUES LESS THAN (TO_DATE('21-2-2017', 'dd-mm-yyyy')),
PARTITION P2 VALUES LESS THAN (TO_DATE('1-3-2017', 'dd-mm-yyyy')),
PARTITION P3 VALUES LESS THAN (TO_DATE('11-3-2017', 'dd-mm-yyyy')),
PARTITION P4 VALUES LESS THAN (TO_DATE('21-3-2017', 'dd-mm-yyyy')),
PARTITION P5 VALUES LESS THAN (TO_DATE('1-4-2017', 'dd-mm-yyyy')),
PARTITION P6 VALUES LESS THAN (TO_DATE('11-4-2017', 'dd-mm-yyyy')),
PARTITION P7 VALUES LESS THAN (TO_DATE('21-4-2017', 'dd-mm-yyyy')),
PARTITION P8 VALUES LESS THAN (TO_DATE('1-5-2017', 'dd-mm-yyyy')),
PARTITION P9 VALUES LESS THAN (TO_DATE('11-5-2017', 'dd-mm-yyyy')),
PARTITION P10 VALUES LESS THAN (TO_DATE('21-5-2017', 'dd-mm-yyyy'))
)
alter table jcsj_sssj add constraints jcpk primary key (timetamp,tagname);--创建联合主键,会生成索引,提高查询速度
2.orcle11g 创建分区表自动根据每天创建分区表从2011-1-1号以后
CREATE TABLE jcsj_sssj (
tagname VARCHAR2(128),
tagvalue VARCHAR2(128),
timetamp DATE
)
PARTITION BY RANGE (timetamp)
INTERVAL(NUMTOYMINTERVAL(1, 'day')) --自动创建语句
(
PARTITION P0 VALUES LESS THAN (TO_DATE('1-1-2011', 'dd-mm-yyyy'))
);
根据年: INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))
根据月: INTERVAL(NUMTOYMINTERVAL(1,'MONTH'))
根据天: INTERVAL(NUMTODSINTERVAL(1,'DAY'))
3.分区操作
1. 通过as select建立分区表createtable t1_trans_2
partitionbyrange (polno)
(partition part_01 valueslessthan(10000) tablespace users, partition part_02 valueslessthan(maxvalue) tablespace wxq_tbs)
Asselect * from lcpol;
2查找某分区数据
select * from t1_transpartition(part_01);
3操作某分区数据
delete t1_transpartition(part_01);
注:当数据量很大的时候,指定分区会大大提高效率
4.分区表维护
1. 删除分区Altertable t1_transdroppartition part_02; 注:删除分区会自动删除分区中的所有数据。
2. 截断分区
ALTERTABLE t1_trans TRUNCATEPARTITION P1;
注:截断某个分区是指删除某个分区中的数据,并不会删除分区,也不会删除其它分区中的数据。当表中即使只有一个分区时,也可以截断该分区。
3. 添加分区
Altertable t1_trans
addpartition part_02 valueslessthan(20000) tablespace users; 注:添加时不能在两个范围内插入分区,必须要大于最后一个分区的最大值。
4. 合并分区
altertable t1_trans
mergepartitions part_01,part_02 intopartition part_new;
注:合并分区是将相邻的分区合并成一个分区,结果分区将采用较高分区的界限,值得注意的是,不能将分区合并到界限较低的分区。
5. 分裂分区
Altertable t1_transsplitpartition part_02 at (20000) into (partition part_02,partition part_03);
6. 改换分区所属tablespace
altertable t1_trans
movepartition part_03 tablespace wxq_tbs;
7. 重命名分区表名
ALTERTABLEt1_trans RENAMEPARTITION P21 TO P2;
8. 查看表分区情况
SELECT * FROMUSER_TAB_PARTITIONS WHERE TABLE_NAME=upper('jcsj_sssj')
Upper():使列不区分大小写,已返回所有的结果
会出现分区统计和实际查询条数不对应情况,这是orcle滞后统计机制,如果想要详细研究请学习
9. select table_name, partition_name, HIGH_VALUE from dba_tab_partitionst wheretable_name = 'TEST_INTERVAL';
5.分区表注意事项
1.建立主键会生成索引,通过索引会查询条件,提高查询效率。2.不能把分区字段做计算(比如to_char),否则会引起分区裁剪失效
3.对索引字段做计算也会引起索引失效
1、对分区表进行了计算,就只能走全表了;
2、如果建立索引,尽可能的建立分区索引,而不是全局索引,当然还要看具体情况;
3、减少隐性的数据转换,否则,分区裁剪和索引也会失效,还会增加 CPU 负担;
4、在最常用的列上做分区,这个要在设计初期就定好,后期更新会很麻烦;