orcle 分区表创建、查询、知识总结

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、在最常用的列上做分区,这个要在设计初期就定好,后期更新会很麻烦;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章