一、何謂分區表(索引)?
分區表是一種數據庫的物理存儲機制,它將一個表的數據存儲在不同的存儲片段中,這些不同的存儲片稱為區(partition)。為什麼要這樣做呢?理由之一是,當一個表的數據量不斷增加大的時候。如果這些數據都存儲在同一個數據區域(同一個物理磁盤或數據文件)中,當同時有多個對這個表的數據並行訪問時,很容易就會造成I/O瓶勁。而如果將表的數據按照一定的分布規則存儲在不同的磁盤中,就可以很好的解決上述情況下可能出現的問題,從而提高了數據庫的性能。分區索引也是一樣的道理。
分區技術在超大型數據庫中的效果更加明顯。
二、分區方式
Oracle有四種分區方式:
·
Range
按某字段的值的范圍分區
·
Hash
按某字段的值的哈稀函數結果分區
·
List
按指定列的值列表分區
·
Range-Hash
Range分區內再按Hash分區(子分區)
·
Range-List
Range分區內再按List(子分區)
三、創建分區表
1.創建Range分區表
CREATE TABLE sales
( invoice_no NUMBER,
sale_year INT NOT NULL,
sale_month INT NOT NULL,
sale_day INT NOT NULL )
STORAGE (INITIAL 100K NEXT 50K) LOGGING
PARTITION BY RANGE ( sale_year, sale_month, sale_day)
( PARTITION sales_q1 VALUES LESS THAN ( 1999, 04, 01 )
TABLESPACE tsa STORAGE (INITIAL 20K, NEXT 10K),
PARTITION sales_q2 VALUES LESS THAN ( 1999, 07, 01 )
TABLESPACE tsb,
PARTITION sales_q3 VALUES LESS THAN ( 1999, 10, 01 )
TABLESPACE tsc,
PARTITION sales
_
q4 VALUES LESS THAN ( 2000, 01, 01 )
TABLESPACE tsd
,
PARTITION Sales_q5 VALUES LESS THAN (MAXVALUE)
)
上述DML的功能是:
創建一個名為sales的表,含有字段invoice_no,sale_year,sale_money,sale_day。該表的分區方式為按sale_year,sale_money,sale_day這三個字段的Range分區,具體分區情況為:
sale_year小於1999,sale_money小於04,sale_day小於01的數據劃分到分區sale_q1中,該分區存儲在tsa表空間中,數據存儲的擴展方式為
INITIAL 20K, NEXT 10K
;
sale_year小於1999,sale_money小於07,sale_day小於01的數據劃分到分區sale_q2中,該分區存儲在tsb表空間中;
sale_year小於1999,sale_money小於10,sale_day小於01的數據劃分到分區sale_q3中,該分區存儲在tsc表空間中;
sale_year小於2000,sale_money小於01,sale_day小於01的數據劃分到分區sale_q4中,該分區存儲在tsd表空間中;
未能劃分到這四個分區中的數據在存儲在sales_q5分區中,如果未指定最後這一行,oracle在存儲未能劃分到各分區的數據時將產生錯誤。
2.創建Hash分區表
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
STORAGE (INITIAL 10K)
PARTITION BY HASH(deptno)
(PARTITION p1 TABLESPACE ts1, PARTITION p2 TABLESPACE ts2,
PARTITION p3 TABLESPACE ts1, PARTITION p4 TABLESPACE ts3,
PARTITION p5 TABLESPACE ts4);
或者
CREATE TABLE dept (deptno NUMBER, deptname VARCHAR(32))
STORAGE (INITIAL 10K)
PARTITION BY HASH(deptno)
PARTITIONS 5
STORE IN (ts1,ts2,ts3,ts4,ts5)
OVERFLOW STORE IN ts6
;
3.創建List分區表
CREATE TABLE sales_by_region (item# INTEGER, qty INTEGER,
store_name VARCHAR(30), state_code VARCHAR(2),sale_date DATE)
STORAGE(INITIAL 10K NEXT 20K) TABLESPACE tbs5
PARTITION BY LIST (state_code)
(
PARTITION region_east
VALUES ('MA','NY','CT','NH','ME','MD','VA','PA','NJ')
STORAGE (INITIAL 20K NEXT 40K PCTINCREASE 50)
TABLESPACE tbs8,
PARTITION region_west
VALUES ('CA','AZ','NM','OR','WA','UT','NV','CO')
PCTFREE 25 NOLOGGING,
PARTITION region_south
VALUES ('TX','KY','TN','LA','MS','AR','AL','GA'),
PARTITION region_central
VALUES ('OH','ND','SD','MO','IL','MI','IA'),
PARTITION region_null
VALUES (NULL),
PARTITION region_unknown
VALUES (DEFAULT)
);
4.創建Range-Hash分區表
CREATE TABLE emp (deptno NUMBER, empname VARCHAR(32), grade NUMBER)
PARTITION BY RANGE(deptno)
SUBPARTITION BY HASH(empname)
SUBPARTITIONS 8 STORE IN (ts1, ts3, ts5, ts7)
(
PARTITION p1 VALUES LESS THAN (1000) PCTFREE 40,
PARTITION p2 VALUES LESS THAN (2000)
STORE IN (ts2, ts4, ts6, ts8),
PARTITION p3 VALUES LESS THAN (MAXVALUE)
(SUBPARTITION p3_s1 TABLESPACE ts4,
SUBPARTITION p3_s2 TABLESPACE ts5)
);
5.創建Range-List分區表
CREATE TABLE sample_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’))
TABLESPACE tbs_1
(
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_others VALUES (DEFAULT) TABLESPACE tbs_4
),
PARTITION q2_1999 VALUES LESS THAN ( TO_DATE(’1-JUL-1999’,’DD-MON-YYYY’))
TABLESPACE tbs_2
(
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 (’OK’, ’TX’)
),
PARTITION q3_1999 VALUES LESS THAN (TO_DATE(’1-OCT-1999’,’DD-MON-YYYY’))
TABLESPACE tbs_3
(
SUBPARTITION q3_1999_northwest VALUES (’OR’, ’WA’),
SUBPARTITION q3_1999_southwest VALUES (’AZ’, ’UT’, ’NM’),
SUBPARTITION q3_others VALUES (DEFAULT) TABLESPACE tbs_4
),
PARTITION q4_1999 VALUES LESS THAN ( TO_DATE(’1-JAN-2000’,’DD-MON-YYYY’))
TABLESPACE tbs_4
);
四、維護分區表
詳見:
oracle官方文檔中的alter table參考
“
oracle administrator
”
五、與分區相關的視圖
DBA_PART_TABLES
ALL_PART_TABLES
USER_PART_TABLES
-----------------------
DBA_TAB_PARTITIONS
ALL_TAB_PARTITIONS
USER_TAB_PARTITIONS
-----------------------
DBA_TAB_SUBPARTITIONS
ALL_TAB_SUBPARTITIONS
USER_TAB_SUBPARTITIONS
-----------------------
DBA_PART_KEY_COLUMNS
ALL_PART_KEY_COLUMNS
USER_PART_KEY_COLUMNS
-----------------------
DBA_SUBPART_KEY_COLUMNS
ALL_SUBPART_KEY_COLUMNS
USER_SUBPART_KEY_COLUMNS
-----------------------
DBA_PART_COL_STATISTICS
ALL_PART_COL_STATISTICS
USER_PART_COL_STATISTICS
-----------------------
DBA_SUBPART_COL_STATISTICS
ALL_SUBPART_COL_STATISTICS
USER_SUBPART_COL_STATISTICS
-----------------------
DBA_PART_HISTOGRAMS
ALL_PART_HISTOGRAMS
USER_PART_HISTOGRAMS
-----------------------
DBA_SUBPART_HISTOGRAMS
ALL_SUBPART_HISTOGRAMS
USER_SUBPART_HISTOGRAMS
-----------------------
DBA_PART_INDEXES
ALL_PART_INDEXES
USER_PART_INDEXES
-----------------------
DBA_IND_PARTITIONS
ALL_IND_PARTITIONS
USER_IND_PARTITIONS
-----------------------
DBA_IND_SUBPARTITIONS
ALL_IND_SUBPARTITIONS
USER_IND_SUBPARTITIONS