天天看點

《Oracle資料庫管理與維護實戰》——2.7 資料分區

本節書摘來自異步社群出版社《oracle資料庫管理與維護實戰》一書中的第2章,第2.7節,作者: 何偉娜 , 常建功,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

oracle資料庫管理與維護實戰

巨型表或索引由于太大,在資料庫系統會引起類似以下幾條的很多問題。

因為表變得非常大,以至于要花費大量的時間對這張表進行管理。

對巨型表進行全表掃描,會花費系統大量的時間和資源。

一個事務要查詢這張巨型表,如果由于磁盤錯誤,讀寫一個資料塊發生錯誤,整個表就變得不能用。管理者恢複這張表要耗費很長時間。

為減少這類問題的發生,oracle使用分區表和分區索引。

oracle允許将表的存儲分離為一些空間較小的存儲單元,這些小的存儲單元就稱為分區。每個表的分區含有相同的資料類型和完整性限制,但每個分區之間可以含有不同的實體屬性。例如,oracle能夠在不同的表空間中存儲一個表的各個分區,并且每一個分區都可以設定pctfree、pctused等存儲參數,分區表與普通表的實體存儲如圖2-26所示。

《Oracle資料庫管理與維護實戰》——2.7 資料分區

表分區有以下優點。

使用者能對表分區單獨建立、重建索引,能單獨裝載、備份恢複表分區資料。因為隻對指定的表分區進行操作,是以比對整張表進行操作快得多。

表分區能提高查詢性能。一般要查詢的資料都在一個表分區中,是以不必對全表掃描,而隻需對分區掃描。

表分區可以提高對表的并發操作。不同僚務可以對同一表的不同分區同時進行操作。

分區表對使用者來說是透明的,使用者可以像操作一張普通的表一樣操作分區表。

oracle表有幾種分區方法:範圍分區(range partitioning)、清單分區(list partitioning)、散列分區(hash partitioning)、複合分區(composite partitioning)。

1.範圍分區

oracle支援範圍分區表,根據表分區鍵值決定資料存儲的分區。表分區鍵值是一個表字段值或多個字段值的組合(最多16個字段組合),但這些字段不能是level、rowid或mlslabel等僞列。為防止表分區之間記錄遷移,表分區鍵值不宜修改。為了了解範圍分區表,下面我們舉一個建立範圍分區表的例子。以下是一張銷售清單表,以銷售日期為分區鍵值分區。

2.清單分區

清單分區和範圍分區不同,範圍分區以分區鍵值的範圍為标準劃分分區,而清單分區按照預先給定的一系列離散值進行分區。新資料插入表中時,根據分區鍵值找到對應分區。以下是建立清單分區的例子。

如以下一行資料,因為在分區sales_west中有 'hawaii' ,是以這一行插入sales_west分區中。

因為清單分區隻根據離散值指定分區,是以有很多記錄并不對應任何值,清單分區就将這些記錄存儲在一個預設的分區中。需要注意的是,清單分區隻能用一列分區鍵值,而不能像範圍分區一樣能定多個分區鍵值。

3.散列分區

散列分區的分區方法完全不同于範圍分區和清單分區。散列分區先通過散列函數對分區鍵值計算,根據計算結果确定記錄存儲到哪個分區。散列分區的定義比較簡單,使用也比較友善。散列分區适用于以下幾種情況:

事先不知道指定的範圍内将會有多少資料,此時可以用散列分區。

如果用範圍分區,各區之間資料量差異将會很大,并且很難人工幹預達到各分區間資料量平衡,此時可以用散列分區。

以下是一個定義散列分區的例子。

4.複合分區

複合分區是将範圍分區和清單分區或散列分區混合使用的一種分區方法。複合分區在分區上用的是範圍分區,而在每個分區上又可以用清單分區法或散列分區分成多個子分區,是以複合分區又分為範圍散列分區和範圍清單分區兩種類型。圖2-27是範圍清單分區的存儲示意圖。

《Oracle資料庫管理與維護實戰》——2.7 資料分區

圖2-27中縱向是根據月份來劃分的範圍分區,每個範圍分區又以清單方式劃分為3個子分區。使用複合分區的優點是能吸取多個分區類型的優點。

與表一樣,索引可以分區,叫作分區索引,每個索引必須有相同的索引列,但可以有不同的存儲特性。一個索引的分區鍵值決定在哪個分區存儲索引項。一個索引的分區必須包含一個或多個被索引的列。索引分區的定義和表分區定義類似。不論是分區表還是非分區表,使用者都可以給它建立分區索引。

隻有當索引本身很大時,分區索引才有必要建立。分區索引的主列選擇和普通索引的主列選擇一樣。分區索引有兩種類型:本地索引和全局分區索引。

1.本地索引

如果兩個或兩個以上的資料庫對象有相同的邏輯分區屬性,例如兩張分區表有相同的分區鍵值和相同的分區範圍,那麼它們就是相同的分區。如果一張分區表和分區索引具有相同的邏輯分區屬性,那麼這兩個索引就是具有相同分區的本地索引,如圖2-28所示。

《Oracle資料庫管理與維護實戰》——2.7 資料分區

建立本地索引比較容易,範圍說明和最大索引值可以不指定。分區索引會自動從分區表中獲得這些屬性。

2.全局索引

使用者可以建立一個和分區表不同分區屬性的索引,這就是全局分區索引。全局分區索引覆寫了整個表的範圍,和表分區沒有任何聯系,不分區的表也可以建立全局索引。全局索引在oltp環境下能夠提供比本地索引更好的性能。圖2-29是全局索引的使用示例。

《Oracle資料庫管理與維護實戰》——2.7 資料分區

使用者可以對表的每個分區進行單獨命名,也可以像操作一張普通表一樣對這個命名的表分區進行存取。使用命名表分區能夠友善開發人員,并且能減少查詢的備援。雖然開發人員可以像操作表一樣操作命名分區,但是表分區畢竟涉及到表的實體存儲方式,還是盡量不要輕易使用。oracle提供了很多操作分區表的方法,這些方法對表調優很有用。

分區表和非分區表可以互相轉化。

使用者可以在一個已有的表分區後添加新分區。

使用者可以分割合并表分區。

使用者可以删除表中不含任何記錄的分區。

使用者可以删除指定的表分區而不删除整個表。