第3/24周 區_SQL Server中管理空間的基本單位


哇哦,SQL Server性能調優培訓已經進入第3周了!同時你已經對SQL Server內核運行機制有了很好的認識。今天我會講下SQL Server中的區管理,因為這是個很重要的話題,我們會在第23周探討TempDb。在最高級別來講,區就是一組8張8k大小的頁。因此一個區始終是64k的塊(連續頁)。SQL Server內部施行2類區:

  • 混合區
  • 統一區

混合區和統一區

在混合區的8個頁可以屬於像表和索引的不同數據庫對象。這也是說混合區可以指向不同的數據庫對象。在另外一方面,在統一區里所有的8個頁面是屬於同個數據庫對象現在的問題是,為什么SQL Server做出這樣的區別?這個基本上是個與歷史有關的問題。我們來解釋下。

在上一世紀存儲是非常,非常貴的。那是的目標就是盡可能有效的使用存儲。因為新表和索引的第1個8頁總是分配在混合區。這也意味着你的表或索引剛開始創建時總在8k的塊(混合區)里。這樣的話小表保持很小的存儲占用。你正在盡可能有效的使用存儲。當你的數據庫對象需要分配第9個頁時,SQL Server會分配整個統一區給那個數據庫對象。它的大小從8kb 變成了72kb,到第17個頁它的增長從72kb 變成了136kb,然后按此規律繼續增長。現在你會對那個事實表示搖頭,但在上個世紀,這曾是非常重要的設計選擇。下面的圖片會展示了一個區看起來是什么樣(在一個非常簡化的方式下)。

區管理

現在的問題是SQL Server如何管理這些區?想象下你有一個1TB大小的數據庫,這會給你巨大數量的區。SQL Server這里使用2個特殊的頁來管理,同樣它們也是8kb 的大小。

  • 全局分配映射表(GAM: Global Allocation Map Pages)
  • 共享全局分配映射表(SGAM: Shared Global Allocation Map Pages)

統一區始終由GAM頁管理。SQL Server使用8000 bytes 的GAM頁,它給你64000位。(8000 * 8)。在那個巨大的掩碼位圖里,每個位代表一個統一區。如果那個位標記為1,表示那個統一區是空的,如果標記為0,表示那個統一區已被使用。這也意味着你4G區間的數據里只能有一個GAM頁來管理(64000 * 64 / 1024 /1024)。因此每隔4G的數據文件都會有一個GAM頁。這些對SGAM頁也是對的。一個SGAM頁也只能管理4GB的數據,因為你只有64000位可用。

當你在表里插入一條新記錄,SQL Server會通過SGAM頁找至少有一頁空閑的混合區來插入數據。如果你的表/索引大於64kb,SQL Server會通過GAM頁直接找空閑的統一區來插入數據。很簡單,是不是?

在第23周,當我們探討TempDb時,在我們同時在TempDb里嘗試創建巨大數量的臨時數據時,這個會引起嚴重的性能問題。到時我們會提到通過修改TempDb數據的一些設置來克服這個問題。

小結

在這周的性能調優培訓里我們探討了SQL Server中的區和區管理。到現在應該已經有很好並結實的SQL Server內部構造理解。

如果你想學習更多的區管理知識,我推薦下列文章:

在接下來的培訓中,這些知識會作為性能調優和故障排除的先決條件。希望今天的培訓你有所享受,下星期我回來的時候,我們會學習數據頁的一些限制,還有我們如何和它們作戰。請繼續關注!

圍觀PPT:

0504_03區_SQL_Server中管理空間的基本單位.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM