集群表與非集群表
碰巧我不得不同時使用 SQL Server 和 Oracle 很長一段時間(幸好不是同時使用)。
仍然讓我感到困惑的是將表格儲存為平衡樹的方法。在類似 Oracle 的 RDMS 中,堆是預設的,在 SQL Server(和許多其他)中,相反(集群,IOT)是正確的。每種方法的專家都聲稱他們的方法是唯一“正確”的方法,並通過一堆測試/展示來支持選擇的觀點。但是,在我看來,他們證明的唯一一點是“非預設”方法的實施很差,並且不應該在大多數情況下使用……
我很確定這兩種方法都足夠好(只是因為它們仍然存在於市場上並顯示出可比的性能)並且在下面有一些數學,但我沒有找到任何好的參考。
我意識到這個話題可能過於寬泛而無法回答,並且非常歡迎良好的連結,但我真的很想知道為什麼兩種看似有爭議的方法已經證明它們都是有效的。
當我開始作為 SQL Server DBA 的職業生涯時,我處於相同的位置,但在我的大學裡主要學習 ORACLE (10g) .. 以及 OCA 的東西……
我同意@KennethFisher 的觀點,即兩個 RDBMS 都不同,比較它們就像 - 比較 Apples 和 Oranges。
要回答您關於 - 將表格儲存為平衡樹的問題……
- Oracle 和 SQL Server 都支持B-Tree索引,它使數據保持排序並允許在對數時間內進行搜尋、順序訪問、插入和刪除。
- B-Tree 針對讀取和寫入大塊數據的系統進行了很好的優化。請注意,SQL Server 將這種結構用於非聚集索引,Oracle 使用它作為預設值在內部儲存表的儲存位置。
- Oracle 有ROWID(行 ID)和 UROWID(通用行 ID)的概念,其中鍵值和對記錄儲存位置的唯一引用包含,這表示儲存記錄在磁碟上的物理位置。
SELECT ROWID, last_name FROM employees WHERE department_id = 20; ROWID LAST_NAME ------------------ ---------- AAAAaoAATAAABrXAAA BORTINS AAAAaoAATAAABrXAAE RUGGLES AAAAaoAATAAABrXAAG CHEN AAAAaoAATAAABrXAAN BLUMBERG
擴展的 rowid 具有四部分格式,OOOOOOOFFFBBBBBBRRR:
OOOOOO:標識數據庫段的數據對象編號(範例中為 AAAAao)。同一段中的模式對象(例如表集群)具有相同的數據對象編號。
FFF:包含行的數據文件的表空間相對數據文件編號(範例中的文件 AAT)。
BBBBBB:包含行的數據塊(範例中的塊 AAABrX)。塊號是相對於它們的數據文件的,而不是表空間。因此,具有相同塊號的兩行可以駐留在同一表空間的兩個不同數據文件中。
RRR:塊中的行。
- 因此,RDBMS - ORACLE 和 SQL Server 中的概念完全不同。此外,在 Oracle 中創建的 PK 只不過是帶有 ROWID 的平衡非聚集索引,用於快速訪問,因此沒有聚集索引或非聚集索引的概念。
現在,當涉及到B+Tree索引時,這變得更加有趣和不同:
- B+Tree 結構類似於 B-Tree 結構,但表記錄(實際數據)儲存在主鍵索引的葉節點中,允許快速訪問對錶的 PK 進行精確匹配或範圍掃描搜尋。
- Oracle 使用所謂的 IOT(索引組織表),而 SQL Server 使用所謂的聚集索引。
讓我們看看聚集索引和索引組織表 (IOT) …:
來自Oracle 文件,
索引組織表是儲存在 B 樹索引結構的變體中的表。在堆組織的表中,行插入到它們適合的位置。在索引組織的表中,行儲存在表的主鍵上定義的索引中。B 樹中的每個索引條目還儲存非鍵列值。因此,索引就是數據,數據就是索引。應用程序使用 SQL 語句像處理堆組織表一樣操作索引組織表。
在 SQL Server 中,索引被組織為 B 樹。索引 B 樹中的每一頁稱為索引節點。B-Tree的頂端節點稱為根節點。索引中最底層的節點稱為葉節點。根節點和葉節點之間的任何索引級別統稱為中間級別。在聚集索引中,葉節點包含基礎表的數據頁。根和中間級節點包含保存索引行的索引頁。每個索引行包含一個鍵值和一個指向 B 樹中的中間級別頁面或索引葉級別中的數據行的指針。索引的每一級中的頁面都連結在一個雙向鍊錶中。
- IOT 的統計數據包括行的物理分散,而 SQL Server 不包括統計數據中行的物理位置,因此 SQL Server 中的聚集索引優於 HEAP - 數據按聚集鍵排序,並為數據獲得良好的估計被搜尋。
最後一些很好的參考:
- Oracle 和 SQL Server 中的統計資訊 - Jonathan Lewis 和 Grant Friitchey
- Oracle 堆表或 SQL Server 聚集索引?——喬納森·劉易斯和格蘭特·弗里奇
- 索引組織表 - 基礎- 優秀系列!
- 修復堆碎片
- 內部和刪除
當我遇到值得一提的時候,我會添加更多的點……