分區功能是數據庫管理的一大關鍵技術成分。幾乎所有的Oracle數據庫都使用分區功能來提高查詢的性能,並且簡化數據庫的日常管理維護工作。Oracle 11G提供更多的分區功能選擇,大大減輕了DBA(數據庫設計和管理工程師)的工作負擔。
本文應該對主要在數據庫環境裡工作的數據庫設計和管理工程師以及程序設計師有所幫助。Oracle在11G中提供的新功能增添了更多的分區功能選擇,使分區功能在使用和維護上變得更加靈活。
Oracle 8.0版最早推出了表格的分區功能,使Oracle成為了第一個支持物理分區的RDBMS供應商。SQL Server(2000)和DB2都只支持邏輯分區(使用UNION ALL視圖),而SQL Server 2005並不直接支持物理分區(需通過分區功能)。Oracle的分區功能選擇很受用戶群的歡迎,因為分區功能能夠改善應用程序的性能、可管理性和可用性,其中最重要的是DSS應用程序。由於該功能受到廣泛的喜愛,因此每次發布新版本都會有功能上的不斷提高。
下面的表格列舉了隨版本更新而不斷提高的分區功能(高級):
Oracle數據庫版本
分區功能
8.0.5
引入范圍分區功
8i
引入散落列分區和組合范圍散列分區功能。
9i
引入列表分區和組合范圍列表分區功能。
10G
引入了對索引組織表進行范圍分區、列表分區和三列分區的功能。該版本還引入了其他組合分區功能選擇。
11G
引入擴展的分區功能:
-Interval分區
-外鍵分區
-虛擬列分區
-引入了分區建議器
分區功能類型
現在讓我們簡單的討論一下以上每個分區功能的特性:
范圍分區:數據根據分區鍵值范圍指定進行分布。比如,如果我們選擇一個日期列作為分區鍵,分區“JAN-2007”就會包括所有包含從01-JAN-2007到31-JAN-2007之間的分區鍵值(假設分區的范圍是從這個月的第一天到這個月的最後一天)。
散列分區:將散列算法用於分區鍵來確定指定行所在的分區。這個分區方法能夠保持I/O平衡,但是不可用於范圍查詢或不等式查詢。
列表分區:數據根據分區鍵值列表指定進行分布。這個分區方法對於離散的列表非常有用,如地區、國家等。
組合分區:結合2個數據分區方法可以成為一個組合分區方法。先用第一個數據分布方法對表格進行分區,然後再用第二個數據分區方法對每個分區進行二次分區。組合分區方法有以下組合:
組合范圍散列分區、組合范圍列表分區、組合范圍范圍分區、組合列表范圍分區、組合列表列表分區、組合列表散列分區。
10G支持對索引組織表(索引和數據一起的表格)進行范圍分區、列表分區或散列分區,但是不支持對其進行組合分區。
Interval分區:11G版本引入的interval分區范圍分區的一種增強功能,可實現equi-sized范圍分區的自動化。創建的分區作為元數據,只有最開始的分區是永久分區。隨著數據的增加會分配更多的部分,並自動創建新的分區和本地索引。
SQL>CREATE TABLE SALES_PART
(TIME_ID NUMBER,
REGION_ID NUMBER,
ORDER_ID NUMBER,
ORDER_DATE DATE,
SALES_QTY NUMBER(10,2),
SALES_AMOUNT NUMBER(12,2)
)
PARTITION BY RANGE (ORDER_DATE)
INTERVAL (NUMTOYMINTERVAL(1,'month')
(PARTITION p_first VALUES LESS THAN ('01-JAN-2006');
Numtoyminterval功能把數字轉換成 INTERVAL YEAR TO MONTH文字(‘YEAR’ or ’MONTH’)。
進行Interval分區的表格有傳統的范圍部分和自動生成的interval部分。進行范圍分區的表格可以通過使用ALTER TABLE命令的 SET INTERVAL選項擴展成為Interval分區的表格。
外鍵分區:分區方案的引入是以相關表格通過相同的分區策略獲得好處作為前提設想的。Detail表格通過PK-FK關系從master表格繼承相同的分區方案。我們不需要把分區鍵存儲在detail表格中,通過關鍵詞“PARTITION BY REFERENCE”,detail表格獲得master表格的分區方案。
虛擬列分區:在之前的Oracle版本裡,只有分區鍵存在與表格中才可以實現對表格的分區功能。而Oracle 11G的新功能“虛擬列”打破了這一限制,允許通過使用表格中的一列或多列的表述確定分區鍵。而虛擬列只作為元數據存儲。
例如:在表格ACCOUNTS中添加一個虛擬列:
SQL>CREATE TABLE ACCOUNTS
(acc_no number(10) not null,
acc_name varchar2(50) not null,
acc_loc varchar2(5),
acc_branch number(2) generated always as
(to_number(substr(to_char(acc_no),1,2)));
使用虛擬列作為分區鍵:
SQL>CREATE TABLE accounts
(acc_no number(10) not null,
acc_name varchar2(50) not null,
acc_loc varchar2(5),
acc_branch number(2) generated always as
(to_number(substr(to_char(acc_no),1,2)))
partition by list (acc_branch);
分區建議器
Oracle 11g還提供了一個分區建議器,可支持分區建議的生成,類似於10G中支持實物化視圖、實物化視圖日志和索引的功能。事實上,分區建議器在Oracle 11g中是SQL Access Advisor的一部分。這個建議器幫助生成建議,並可以顯示出推薦分區實施後可獲得的效果。它還會生成創建有效分區的腳本,可手動通過SQL*Plus提交給Oracle或Enterprise Manager。