SQL Server性能優化(7)理解數據庫文件組織

1、基本單位「頁」html

    SQL Server是用8KB的頁來存儲數據。物理I/O操做也是在頁級執行。頁的種類有不少,具體參考(MSDN)。咱們關注更多的是數據頁的結構,包括三部分:頁頭(96bytes)、數據區(數據行和可用空間)以及行偏移數組(槽,最少是7bytes):算法

image

爲何數據頁的大小是8k,這有什麼優缺點,有兩篇文章解釋的很好(數據頁結構壞的一面)。總結下,sql

a. 數據區大小 =(8192 - 頁頭96bytes+偏移數組7byte) = 8053bytes,這是一個頁能分配給咱們的數據使用的最大空間。咱們的數據就一行一行的放在這寫數據內部。數據庫

b. 若是咱們一行數據包含兩個int列,那一共能夠存儲 8053%(4+4)= 999.125,最後餘7byte空間沒法存入,也就是這這個頁裏浪費了7bytes。如數組

c. 果咱們一行數據包含三列(一個int、一個char(4000)、一個char(100),共4104byte),那每一個頁只能存儲一行,浪費了3 949bytes,很明顯這不是一個好的數據庫設計。數據結構

d. 能夠利用free_space_in_bytes來查看頁面空閒狀況。數據庫設計

SELECT
   DB_NAME(database_id),
   SUM(free_space_in_bytes) / 1024 AS 'Free_KB'
FROM sys.dm_os_buffer_descriptors
WHERE database_id <> 32767
GROUP BY database_id
ORDER BY SUM(free_space_in_bytes) DESC
GO

e. 包含 varchar、nvarchar、varbinary 或 sql_variant 列的表不受此限制的約束。MSDN上有進一步解釋行溢出數據超過 8 KBspa

f. 要進一步瞭解數據頁內部的結構,參考:http://www.cnblogs.com/woodytu/p/4484328.html.net

2、頁的上層--「區」和分配映射表設計

區是管理空間的基本單位。一個區是八個物理上連續的頁(即 64 KB)。這意味着 SQL Server 數據庫中每 MB 有 16 個區。

因爲歷史緣由,SQL Serve有兩種類型的區:同一區、混合區。

混合區:區內的8個頁,能夠是不一樣的表、索引等。

統一區:區內的8個頁,是同一個表、索引。

image

新建表的時候,先在混合區插入一條記錄,當其佔用的這個混合區的表或索引增加到 8 頁時,將變成使用統一區進行後續分配,每次擴展84kb(8頁)。問題是如何管理這兩種分區?答案是GAM頁和SGAM頁。

1. 全局分配映射表(GAM: Global Allocation Map Pages)---爲統一區管理服務

    這是一個,共64000位(8000bytes)的掩碼位圖(參考位圖算法),用一個位管理一個byte管理4Gbyte。因此每隔4G的數據文件都要有一個GAM頁進行管理(64000 * 64 /1024 /1024)。

2. 共享全局分配映射表(SGAM: Shared Global Allocation Map Pages)---爲混合區管理服務

    原理同全局分配映射表。

3、可用空間管理頁面:PFS頁(Page Free Space)

該頁面用來跟蹤一個文件中每個特定的頁面的利用率狀況,是以頁爲單位的。一個文件中第個頁面(頁碼1,以下圖)就是PFS頁面,該頁面的每一個字節都記錄了相應頁面的分配狀況、頁面類型、是否IAM頁、是否包含刪除記錄、以及空間利用率信息;PFS可以管理和跟蹤8088個頁面的使用狀況,即接近64M的空間,之後每8088個頁面將再出現一次(參考)。

image

PFS每一個字節管理一個頁面,字節結構爲:

image

4、索引分配映射頁:IAM頁

主要用來標示 SQL Server 對象使用了哪些區。好比A表的非彙集索引B佔用了 六、七、八、9 這4個區。這樣,在再對此對象作更改的時候,可以快速的找到這4個區,更改文件。

當 SQL Server 數據庫引擎必須在當前頁中插入新行,而當前頁中沒有可用空間時,它將使用 IAM 和 PFS 頁查找要將該行分配到的頁,或者(對於堆或 Text/Image 頁)查找具備足夠空間容納該行的頁。分配的過程是:

1. 數據庫引擎使用 IAM 頁查找分配給分配單元的區。

2. 對於每一個區,數據庫引擎將搜索 PFS 頁,以查看是否有可用的頁。

每一個 IAM 和 PFS 頁覆蓋大量數據頁,所以一個數據庫內只有不多的 IAM 和 PFS 頁。這意味着 IAM 和 PFS 頁一般位於內存中的 SQL Server 緩衝池中,因此可以很快找到它們。對於索引,新行的插入點由索引鍵設置。在這種狀況下,不會出現上述搜索過程。

另外,一個 IAM 頁能夠映射的範圍 4 GB,與 GAM 或 SGAM 頁的範圍相同。若是分配單元包含來自多個文件的區,或者超過一個文件的 4 GB 範圍,那麼一個 IAM 鏈中將連接多個 IAM 頁。

5、已修改區域的管理(參考MSDN

SQL Server 使用兩個內部數據結構跟蹤被大容量複製操做修改的區,以及自上次完整備份後修改的區。這些數據結構極大地加快了差別備份的速度。當數據庫使用大容量日誌恢復模式時,這些數據結構也能夠加快將大容量複製操做記錄至日誌的速度。與全局分配圖 (GAM) 和共享全局分配圖 (SGAM) 頁相同,這些結構也是位圖,其中的每一位表明一個單獨的區。 包括

1. 差別更改映射表 (DCM)
2. 大容量更改映射表 (BCM)
DCM 頁和 BCM 頁的間隔與 GAM 和 SGAM 頁的間隔相同,都是 64,000 個區。在物理文件中,DCM 和 BCM 頁位於 GAM 和 SGAM 頁以後。

6、總結

經過以上介紹,咱們大致知道了SQL Server物理文件的結構:

image

有一篇更深刻的介紹http://www.cnblogs.com/woodytu/p/4495021.html

 

參考:索引概念分類:https://technet.microsoft.com/zh-cn/library/ms175049(v=sql.105).aspx

彙集索引結構:https://technet.microsoft.com/zh-cn/library/ms177443(v=sql.105).aspx

Sql Server 中 GAM、SGAM、PAM、IAM、DCM 和 BCM 的詳解與區別

SQL Server 深刻解析索引存儲(上)

SQL Server 深刻解析索引存儲(中)

SQL Server 深刻解析索引存儲(下)

相關文章
相關標籤/搜索