跳轉到內容

Oracle 和 DB2,比較和相容性/儲存模型/索引/總結

來自華夏公益教科書,開放的書籍,開放的世界

關係理論指出,資料的物理組織不應該有任何效能限制。這是在一個理想的世界中,資料庫的實際世界實現作為同時存在於磁碟和記憶體中的結構意味著,合併在一起的資料將更快地返回。這種合併被稱為叢集。由於資料之間的關係(以及因此進行叢集)是由您的應用程式需求決定的,這種結構似乎更像是邏輯約束。在現實中,它有一個物理含義,即物理分組在一起的資料(無論是在磁碟上還是在 RAM 中)都可以更快地訪問,因為單個塊獲取可以返回大量所需資料(與從不同物理位置獲取相同資料的大量昂貴的 I/O 請求相反)。使用叢集技術時需要考慮的是,如果您的應用程式正在執行隨機資料的單例選擇,那麼任何數量的叢集都無濟於事。對於需要返回大量相關資料的應用程式,叢集將有所幫助,但是有一個操作開銷,因為資料需要按特定順序儲存,並且維護此順序需要付出努力。

叢集是一種透過將常用的資料放在同一個塊中來組織資料的技術。到目前為止,資料庫操作中最大的單個開銷是物理 I/O。透過將頻繁訪問的在一起的資料組織成叢集,可以一次塊獲取訪問大量相關資料。叢集資料的一種方法是透過索引。資料可以透過以下方式進行叢集


CTAS/CTAL。


在 Oracle 中,使用 ORDER BY 子句的 Create Table As Select (CTAS) 將執行全表掃描。在 DB2 中,您可以使用 Create Table As Select 或 Create Table As LIKE。當所有行都被收集後,它們將在臨時表空間(Oracle 的 PSATEMP 和 DB2 的 TEMPSPACE1)中排序,然後再填充新表。資料根據 ORDER BY 子句中指定的列的值進行組織。這需要您手動重新組織表,以便相關的錶行儲存在相鄰塊中。

這種技術最適合大多數 SQL 查詢遍歷非叢集一對多資料的資料庫。這方面的一個好例子是 BOM(物料清單)結構,它反映了客戶的所有訂單,訂單的所有行專案,甚至賬單週期內信用卡對賬單的所有費用。在這種情況下,訂單上的行專案(例如)被重新排序到相鄰資料塊中。

行重新排序可以透過以下方式提供幫助

將相關的行聚集在一起到同一個資料塊中,將資料組織起來以避免檢索後進行磁碟排序。將相鄰行打包到單個數據塊中以減少索引行掃描的塊獲取。

行重新排序對執行全表掃描或索引唯一掃描的查詢沒有幫助。這意味著,對於大多數表來說,物理重新排序行並不會對 SQL 響應時間產生顯著影響,因此瞭解將要對資料執行的查詢型別非常重要。


索引叢集表


重新排序表資料的另一種機制是使用索引。表叢集是一組共享公共列的表。由於它們共享公共列,因此它們也共享相同的資料塊,因此它們經常一起使用。當您建立叢集表時,每個表的行都儲存在相同的資料塊中。

索引叢集表可以是多表或單表。


單表索引叢集表


在單表索引叢集表中,Oracle 透過使用近似於塊大小的叢集因子來保證行順序。表的行根據索引列中的值按順序排列在資料塊中。因此,索引範圍掃描將始終在一個 I/O 中獲取儘可能多的行。

雖然這對於檢索資料是最佳的,但需要有一種機制來處理將新資料插入沒有目標塊空間的表中。Oracle 使用溢位區來處理這種情況,並且維護溢位區非常重要。您必須定期重新組織單表索引叢集表,以確保所有行順序都得到維護。


多表索引叢集表


在多表索引叢集中,相關的錶行被分組在一起以減少磁碟 I/O。這類似於單表索引叢集,不同之處在於現在來自多個表的相關資料一起儲存。使用上面的 BOM 示例,多表索引叢集將具有與客戶訂單相關聯的所有行專案行,這些行專案行與客戶訂單儲存在同一個塊中。這樣一來,您就不需要獲取客戶訂單,然後對與該訂單相關的行專案進行單獨獲取,而只需要進行一次塊獲取,就可以在一次操作中獲取所有所需資料。

只有當應用程式所需的大部分資料都是透過叢集索引訪問時,索引叢集才會減少 I/O。如果您使用可能在該資料上定義的任何其他索引,您將獲得隨機塊獲取。


排序雜湊叢集。


從 10g 開始,Oracle 可以使用數學索引函式(稱為雜湊函式)將相關資料放置在相鄰塊中。根據 Oracle 文件

"在排序雜湊叢集中,對應於每個雜湊函式值的行按指定的列集升序排序,這可以提高對叢集資料的後續操作的響應時間。"

用英語來說,這意味著雜湊叢集允許您檢索資料,而無需搜尋索引的開銷。雜湊的目標是為每個唯一的列值生成唯一的地址。地址的值由數學表示式生成,並且已經發現不可能保證這些地址是唯一的。這是一個微不足道的問題,它會導致衝突,即計算出一個地址,結果發現該地址已被使用。由於以這種方式訪問資料非常快,因此使用這種技術有優點。這些優勢伴隨著權衡,因為當發生衝突時,您最終可能會遇到塊溢位和連結(寫入資料的開銷),以及讀取資料的開銷,因為可能需要讀取多個塊才能獲取所需的資料。因此,排序雜湊叢集最適合在處理非常大的資料集時,這些資料集相對穩定,並且主要透過對雜湊鍵進行等值查詢來訪問。您還需要真正瞭解您的資料,因為您必須預先指定雜湊鍵的數量和每個鍵的儲存量,並且必須具有唯一且均勻分佈的叢集鍵值。

排序雜湊叢集非常快,就像任何快速的東西一樣,您需要有特定的需求來執行它,並瞭解其後果。

叢集是資料庫效能中一個非常重要的概念,它直接影響資料在資料塊中的佈局。

華夏公益教科書