【翻譯】分割槽表和索引(9i)(一)

yellowlee發表於2009-09-08

分割槽表和索引(9i)
oracle支援表、表的索引,物化檢視,物化檢視的索引使用分割槽。oracle不支援簇表或者簇表的索引使用分割槽。

分割槽簡介
分割槽技術支援將大的表和索引劃分成多個較小的更容易管理的塊,這些塊叫做分割槽。sql查詢語言和dml語句不需要
為了訪問分割槽表而修改。分割槽定義以後,ddl語句可以訪問和操縱各個分割槽,而不是整個表或者索引。分割槽技術
使得大的資料庫物件更易於管理。同時,分割槽對於應用程式是透明的。

表和索引的每個分割槽必須有相同的邏輯屬性,例如:列名,資料型別,約束等。但每個分割槽可以有獨立的物理屬性,
比如pctfree,pctused和tablespaces。

分割槽技術對於很多不用型別的應用,特別是管理大資料量的應用來說是非常用的。使用分割槽技術,OLTP系統通常可
以提高可管理型和可用性,資料倉儲系統可以提高效能和克管理性。
 ---------------------------------------------------------
 注:一個分割槽物件的所有分割槽必須儲存在塊大小相同的表空間內。
 ---------------------------------------------------------
 參考:
  Multiple block size
  oracle9i data warehousing guide

分割槽技術的優點:
 分割槽技術可以在分割槽級別對資料匯入,索引建立,重建,分割槽級別的備份恢復等資料管理的操作,而非針對整個表。
 這大大減少了這些操作的時間。
 
 分割槽技術提高了查詢的速度。大多數情況下,查詢結果來自幾個分割槽內,而並非整個表。在一些查詢中,使用這項技術
 (called partition pruning)可以獲得數量級的效能提升。
 
 分割槽技術能夠顯著減少由於維護操作帶來的停機時間。
 分割槽的獨立性使得可以同時在相同的表和索引的不同分割槽上進行不同的操作。使用者可以在維護時未收到影響的分割槽
 進行select或者其他dml操作。
 
 通過對關鍵的表和索引的劃分為多個分割槽,能夠縮短維護時間和恢復時間,減少故障發生時的影響,從而提高資料庫
 的可用性。
 
 分割槽技術不需要對現有的應用進行修改。例如:可以將一個非分割槽錶轉換成分割槽表,但並不需要修改select或者其他dml
 語句。不需要重寫應用程式碼就可以發揮分割槽的優勢。
 
圖11-1顯示了非分割槽表和分割槽表的不同結構。

分割槽鍵
 分割槽表的每一行分配給一個分割槽。分割槽鍵是確定每一行的一個或者多個列集。oracle9i通過使用分割槽鍵來
 自動的直接對適當的分割槽進行插入、更新、刪除操作。
 一個分割槽鍵:
  包括一個1至16列的有序列表
  不能包含level,rowid或者mlslabel偽列或者rowid型別的列
  可以包含允許空值的列
  
分割槽表
 一個表可以劃分為64000個獨立的分割槽。除了包含long或者longraw型別欄位的表以外,所有的表都可以被分割槽。
 分割槽表可以有clob或者blob欄位。
 
分割槽索引組織表
 你可以依據範圍對索引表分割槽。這個特性對於提高索引組織表的可管理性,可用性和效能都非常有用。
 此外,data cartridges可以利用索引表對其資料分割槽。常見的比如image和intermedia cartridges。

對索引表分割槽時:
 只支援範圍和hash分割槽技術
 分割槽的列必須是主鍵列的子集
 輔助索引可以採用本地和全域性分割槽
 溢位(overflow)資料段的分割槽與表的分割槽相同 

分割槽方法
oracle提供下面集中分割槽方法:
 範圍(range)分割槽
 列表(list)分割槽
 hash分割槽
 複合(composite)分割槽
圖11-2為分割槽方法示意圖:

複合分割槽是其他幾種分割槽方法的組合。oracle支援rang-hash和rang-list複合分割槽。圖11-3顯示了次2中複合分割槽方法:

範圍分割槽技術
 範圍分割槽依據使用者建立分割槽時設定的分割槽鍵值(partition key value)範圍將資料對映到不同的分割槽。
 這是最常見的分割槽型別,通常用在對時間的分割槽。比如你可能希望將銷售資料按照月份來分割槽。
使用範圍分割槽的時候,要注意以下規則:
 使用 VALUES LESS THAN 子句定義分割槽的開區間上限(noninclusive upper bound)。分割槽鍵的任何值
 等於或者大於這個上限值的記錄都會被加入到下一個高一些的分割槽中。
 所有分割槽,除了第一個,都有一個隱式的最低值,這個值就是前一個分割槽的上限值。
 在最高的分割槽中,MAXVALUE被定義。MAXVALUE代表了一個不確定的值。這個值高於其它分割槽中的任何分
 區鍵的值,也可以理解為高於任何分割槽中指定的VALUE LESS THEN的值,同時包括空值。
下面給出一個典型的示例,以下語句建立一個sales_range表,依據sales_date來分割槽

Range Partitioning Example:
create table sales_range(
salesman_id number(5),
salesman_name varchar2(30),
sales_amount number(10),
sales_date  date
)
partition by range(sales_date)
(
partition sales_jan2000 values less than(date '2000-2-1'),
partition sales_feb2000 values less than(date '2000-3-1'),
partition sales_mar2000 values less than(date '2000-4-1'),
partition sales_apr2000 values less than(date '2000-5-1')
);

列表(list)分割槽
 列表分割槽可以(list partitioning)顯示地控制如何將資料行對映到各個分割槽。使用者在各分割槽的定義中
 指定一個分割槽鍵(partitioning key)離散值的列表,從而實現列表分割槽。列表分割槽與範圍分割槽
 (range partitioning)有所不同,在範圍分割槽中是為每個分割槽設定一個分割槽鍵值的範圍;列表分割槽與哈
 希分割槽也有區別,雜湊分割槽是通過一個雜湊函式(hash function)控制資料行與分割槽間的對映關係。使用者
 可以採用列表分割槽,將無序(unordered)或互不相關(unrelated)的資料進行分組整理。
 
以下例子是對列表分割槽的一個很好的說明。這個例子中按照區域來分割槽。即把地理位置接近的州歸為一組。
List Partitioning Example
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)
);

一行在對映到分割槽時,將與分割槽列的值比較是否包含了分割槽定義的值。例如,下面的行插入時:
(10, 'Jones', 'Hawaii', 100, '05-JAN-2000') 對映到 sales_west
(21, 'Smith', 'Florida', 150, '15-JAN-2000')對映到 sales_east
(32, 'Lee', 'Colorado', 130, '21-JAN-2000') 不被對映到表的任何分割槽

和range和hash分割槽不同,列表分割槽不支援多列的分割槽鍵。如果一個表使用列表分割槽,那麼分割槽鍵只能是表的單列。
預設的分割槽允許除了列表分割槽以外的其他值,避免瞭如果所有行都不能對映到任何分割槽而發生錯誤。

雜湊(hash)分割槽
雜湊分割槽可以對不適用於range和list分割槽的資料進行分割槽。hash分割槽語法簡單且容易實現。
hash分割槽在以下方面比range分割槽要適合:
 對於給定的範圍,資料量不能事先確定
 各範圍分割槽的容量可能相差很大,或很難通過人工進行平衡
 採用範圍分割槽可能導致資料不正常的集中
 應用系統對並行 DML(parallel DML),分割槽剪除(partition pruning),及基於分割槽的關聯
 (partition-wise joins)等與效能有關的分割槽特性要求較高

分裂(splitting),移除或者合併分割槽不適用hash分割槽。但hash分割槽可以新增和接合。

Hash Partitioning Example
CREATE TABLE sales_hash
(salesman_id  NUMBER(5),
salesman_name VARCHAR2(30),
sales_amount  NUMBER(10),
week_no       NUMBER(2))
PARTITION BY HASH(salesman_id)
PARTITIONS 4
STORE IN (data1, data2, data3, data4);

上面的語句建立了依據saleman_id進行hash分割槽的表sales_hash。表空間名為data1,data2,data3,data4。

複合分割槽
複合分割槽(composite partitioning)首先根據範圍(range)進行分割槽,再使用雜湊或列表方式建立子分割槽。
複合範圍-雜湊分割槽既能夠發揮範圍分割槽的可管理性優勢,也能夠發揮雜湊分割槽的資料分佈(data placement),
條帶化(striping),及並行化(parallelism)優勢。複合範圍-列表分割槽能夠發揮範圍分割槽的可管理性優勢,
也能利用列表分割槽的顯示控制能力。

複合分割槽(composite partitioning)便於使用者進行與時間相關的維護操作(historical operation),例如新增
新的範圍分割槽等。同時複合分割槽還能夠利用子分割槽(subpartitioning)實現高度的並行 DML 操作,並對資料分佈
進行精細的控制。
 
Composite Partitioning Range-Hash Example
CREATE TABLE sales_composite
(salesman_id  NUMBER(5),
 salesman_name VARCHAR2(30),
 sales_amount  NUMBER(10),
 sales_date    DATE)
PARTITION BY RANGE(sales_date)
SUBPARTITION BY HASH(salesman_id)
SUBPARTITION TEMPLATE(
SUBPARTITION sp1 TABLESPACE data1,
SUBPARTITION sp2 TABLESPACE data2,
SUBPARTITION sp3 TABLESPACE data3,
SUBPARTITION sp4 TABLESPACE data4)
(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'))
 PARTITION sales_may2000 VALUES LESS THAN(TO_DATE('06/01/2000','DD/MM/YYYY')));

該語句建立了依據sales_date列的範圍分割槽,在子分割槽內按照salesman_id列hash分割槽。
如果使用者在語句中使用了模板(template),Oracle 命名子分割槽的模式為“分割槽名”加“下劃線”再加模板中
設定的“子分割槽名”。同樣,Oracle 將子分割槽儲存在模板中指定的表空間中。在上述語句中,
子分割槽 sales_jan2000_sp1 儲存在表空間 data1 中,而子分割槽 sales_jan2000_sp4 儲存在表空間 data4 中。
同樣,子分割槽 sales_apr2000_sp1 儲存在表空間 data1 中,而子分割槽 sales_apr2000_sp4 儲存在表空間 data4 中。

 

何時應該對錶進行分割槽

以下是關於何時應該對錶進行分割槽的一些建議:
如果表資料量超過 2GB,就應該考慮進行分割槽。
如果表中包含歷史資料,且新資料會被新增到最新的表空間中。
典型的例子是一種歷史表,其中只有當前月份的資料可以被修改,而其他十一個月的資料為只讀。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16179598/viewspace-614153/,如需轉載,請註明出處,否則將追究法律責任。

相關文章