oracle表分区设计_论oracle分区表的创建与维护
創建分區表:
oracle分區方法:range、hash、list和composite partition;
range分區表示例:
CREATE TABLE sales_range (salesman_id NUMBER(5), salesman_name VARCHAR2(30),
sales_amount NUMBER(10), sales_date DATE) COMPRESS PARTITION BY RANGE(sales_date)
(
PARTITION sales_jan2000 VALUES LESS THAN(TO_DATE('02/01/2000','DD/MM/YYYY')),
PARTITION sales_feb2000 VALUES LESS THAN(TO_DATE('03/01/2000','DD/MM/YYYY')),
PARTITION sales_mar2000 VALUES LESS THAN(TO_DATE('04/01/2000','DD/MM/YYYY')),
PARTITION sales_apr2000 VALUES LESS THAN(TO_DATE('05/01/2000','DD/MM/YYYY')));
分區字段values less than必須是確定值,最后一個可以是maxvalue,每個分區可以單獨指定物理屬性
range分區特點:
最早、最經典的分區方法
Range分區通過對分區字段值的范圍進行分區
Range分區特別適合于按時間周期進行數據的存儲:日、周、月、年等
數據管理能力強
數據遷移
數據備份
數據交換
范圍分區的數據可能不均勻
范圍分區與記錄值有關,實施難度和可維護性相對較差
hash分區表示例:
create table emp_t(empno integer,ename varchar2(20))
partition by hash(empno)
partitions 4;--指定分區所在表空間(partition part_01 tablespace test,partition part_02 tablespace sys);
list分區表示例:
CREATE TABLE sales_list (salesman_id NUMBER(5), salesman_name VARCHAR2(30),
sales_state VARCHAR2(20), sales_amount NUMBER(10), sales_date DATE)
PARTITION BY LIST(sales_state)
(
PARTITION sales_west VALUES('California', 'Hawaii'),
PARTITION sales_east VALUES ('New York', 'Virginia', 'Florida'),
PARTITION sales_central VALUES('Texas', 'Illinois'),
PARTITION sales_other VALUES(DEFAULT));
list分區特點:
List分區通過對分區字段的離散值進行分區
List分區是不排序的,而且分區之間也沒有關聯
List分區適合于對數據離散值進行控制
List分區只支持單個字段
List分區具有與range分區相似的優缺點:
數據管理能力強
各分區的數據可能不均勻
composite分區表示例:
CREATE TABLE quarterly_regional_sales (deptno NUMBER, item_no VARCHAR2(20),
txn_date DATE, txn_amount NUMBER, state VARCHAR2(2))
PARTITION BY RANGE (txn_date) SUBPARTITION BY LIST (state)
( PARTITION q1_1999 VALUES LESS THAN(TO_DATE('1-APR-1999','DD-MON-YYYY'))
(SUBPARTITION q1_1999_northwest VALUES ('OR', 'WA'),
SUBPARTITION q1_1999_southwest VALUES ('AZ', 'UT', 'NM'),
SUBPARTITION q1_1999_northeast VALUES ('NY', 'VM', 'NJ'),
SUBPARTITION q1_1999_southeast VALUES ('FL', 'GA'),
SUBPARTITION q1_1999_northcentral VALUES ('SD', 'WI'),
SUBPARTITION q1_1999_southcentral VALUES ('NM', 'TX')),
PARTITION q2_1999 VALUES LESS THAN(TO_DATE('1-JUL-1999','DD-MON-YYYY'))
(SUBPARTITION q2_1999_northwest VALUES ('OR', 'WA'),
SUBPARTITION q2_1999_southwest VALUES ('AZ', 'UT', 'NM'),
SUBPARTITION q2_1999_northeast VALUES ('NY', 'VM', 'NJ'),
SUBPARTITION q2_1999_southeast VALUES ('FL', 'GA'),
SUBPARTITION q2_1999_northcentral VALUES ('SD', 'WI'),
SUBPARTITION q2_1999_southcentral VALUES ('NM', 'TX')),
PARTITION q3_1999 VALUES LESS THAN (TO_DATE('1-OCT-1999','DD-MON-YYYY'))
(SUBPARTITION q3_1999_northwest VALUES ('OR', 'WA'),
… ….
SUBPARTITION q4_1999_northcentral VALUES ('SD', 'WI'),
SUBPARTITION q4_1999_southcentral VALUES ('NM', 'TX')));
composite分區特點:
Oracle支持的Composite分區:
range-hash
Range-list
既適合于歷史數據,又適合于數據均勻分布
與范圍分區一樣提高可用性和可管理性
更好的PDML和partition-wise joins特性
實現粒度更細的操作
支持符合local indexes
不支持符合 global indexes
分區表設計原則:
表的大小:當表的大小超過2GB,或對于OLTP系統,表記錄超過1000萬時,都應該考慮對表進行分區
數據訪問特性:基于表的大部分查詢應用,只訪問表中少量的數據。對于這樣的表進行分區,可充分利用分區排除無關數據查詢的特性
數據維護:按時間段刪除成批的數據,對于這樣的表需要考慮進行分區,以滿足維護需要
數據備份和恢復:按時間周期進行表空間備份時,將分區與表空間建立對應關系
只讀數據:如果一個表中大部分數據都是只讀,通過對表進行分區,可將只讀數據存儲在只讀表空間,對于數據的備份有利
OLAP并行數據操作
分區表及索引分區數據字典信息:
--1、查詢當前用戶下有哪些是分區表:
SELECT * FROM USER_PART_TABLES;
--2、查詢當前用戶下有哪些分區索引:
SELECT * FROM USER_PART_INDEXES;
--3、查詢當前用戶下分區索引的分區信息:
SELECT *
FROM USER_IND_PARTITIONS T
WHERE T.INDEX_NAME = ?
--4、查詢當前用戶下分區表的分區信息:
SELECT * FROM USER_TAB_PARTITIONS T WHERE T.TABLE_NAME = ?;
--5、查詢某分區下的數據量:
SELECT COUNT(*) FROM TABLE_PARTITION PARTITION(TAB_PARTOTION_01);
--6、查詢索引、表上在那些列上創建了分區:
SELECT * FROM USER_PART_KEY_COLUMNS;
--7、查詢某用戶下二級分區的信息(只有創建了二級分區才有數據):
SELECT * FROM USER_TAB_SUBPARTITIONS;
--查看某一分區上的數據
select * from user_table partition(partitionname);
分區表維護:
--刪除分區
ALTER TABLE table_name DROP PARTITION partition_name;
--說明:此語句不可用于hash分區表,如果是全局索引,因為全局索引的分區結構和表可以不一致,若不一致的情況下,會導致整個全局索引失效,在刪除分區的時候,語句修改為:
ALTER TABLE table_name DROP PARTITION partition_name UPDATE GLOBAL INDEXES;
--合并分區(coalesce partition):合并分區是用來操作HASH分區表和hash全局索引的,它會重新分配刪除的分區的數據到現有的分區中
ALTER TABLE table_name COALESCE PARTITION;
--合并分區和刪除中間的RANGE有點像,但是合并分區是不會刪除數據的,對于LIST、HASH分區也是和RANGE分區不一樣的,其語法為:
ALTER TABLE table_name MERGE PARTITIONS??? partition_name1,partition_name2 INTO PARTITION MERGED_PARTITION;
--創建新的分區(分區數據若不能提供范圍,則插入時會報錯,需要增加分區來擴大范圍)
ALTER TABLE table_name ADD PARTITION partition_name VALUES LESS THAN(2500000);--list分區or RANGE分區
ALTER TABLE table_name ADD PARTITION partition_name;--HASH分區
--創建子分區:在分區下創建新的子分區大致如下(RANGE分區,若為LIST或HASH分區,將創建方式修改為對應的方式即可)
ALTER TABLE MODIFY PARTITION ADD SUBPARTITION VALUES LESS THAN(....);
--修改分區名稱(修改相關的屬性信息):
ALTER TABLE TABLE_PARTITION RENAME PARTITION MERGED_PARTITION TO MERGED_PARTITION02;
--交換分區(快速交換數據,其實是交換段名稱指針),首先創建一個交換表,和原表結構相同,如果有數據,必須符合所交換對應分區的條件
CREATE TABLE TABLE_PARTITION_2
AS SELECT * FROM TABLE_PARTITION WHERE 1=2;
--然后將第一個分區的數據交換出去
ALTER TABLE TABLE_PARTITION EXCHANGE PARTITION TAB_PARTOTION_01
WITH TABLE TABLE_PARTITION_2 INCLUDING INDEXES;
--此時會發現第一個分區的數據和表TABLE_PARTITION_2做了瞬間交換,比TRUNCATE還要快,因為這個過程沒有進行數據轉存,只是段名稱的修改過程,和實際的數據量沒有關系。
--如果是子分區也可以與外部的表進行交換,只需要將關鍵字修改為:SUBPARTITION 即可。
--清空分區數據
ALTER TABLE TRUNCATE PARTITION ;
ALTER TABLE TRUNCATE subpartition ;
總結
以上是生活随笔為你收集整理的oracle表分区设计_论oracle分区表的创建与维护的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 对一张静态图片的识别
- 下一篇: 永远不会被杀的***捆绑机