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、在最常用的列上做分區,這個要在設計初期就定好,後期更新會很麻煩;