管理範圍配置與可用空間

管理範圍配置與追蹤可用空間的 SQL Server 資料結構相當簡單。其優點如下:

  • 可用空間的資訊是緊密壓縮的,因此只有少數的分頁包含此資訊。

    如此可降低擷取配置資訊時所需的磁碟讀取量,進而提升速度。此外,還可以增加配置頁保存於記憶體中的機會,而不需額外的讀取。

  • 大部分的配置資訊不會鏈結在一起。這可以簡化配置資訊的維護工作。

    每個分頁配置或取消配置都可迅速執行。這可減少配置或釋出分頁所需之並行工作間的競爭。

管理範圍配置

SQL Server 使用兩種配置對應來記錄範圍的配置:

  • 整體配置對應 (GAM)

    GAM 分頁可記錄已配置哪些範圍。每個 GAM 可涵蓋 64,000 個範圍,或接近 4 GB 的資料。GAM 以一個位元來表示所涵蓋期間的每個範圍。若位元為 1,代表範圍可用;若位元為 0,代表範圍已配置。

  • 共用的整體配置對應 (SGAM)

    SGAM 分頁可記錄哪些範圍目前當作混合範圍使用,並至少擁有一個未使用的分頁。每個 SGAM 可涵蓋 64,000 個範圍,或接近 4 GB 的資料。SGAM 會以一個位元來表示所涵蓋期間中的每個範圍。若位元為 1,則表示該範圍目前當作混合範圍使用,並具有可用分頁。若位元為 0,則表示該範圍不是當作混合範圍使用,或者它是混合範圍,但所有分頁都在使用中。

每個範圍都將根據其目前的用法,在 GAM 與 SGAM 中擁有下列的位元模式設定。

範圍的目前用法

GAM 位元設定

SGAM 位元設定

可用,且未使用

1

0

制式範圍,或完全混合範圍

0

0

具有可用分頁的混合範圍

0

1

如此可產生簡單的範圍管理演算法。若要配置制式範圍,Database Engine 會搜尋 GAM 的 1 位元並將其設為 0。若要尋找具有可用分頁的混合範圍,Database Engine 會搜尋 SGAM 的 1 位元。若要配置混合範圍,Database Engine 會搜尋 GAM 的 1 位元並將其設為 0,然後將 SGAM 中的對應位元也設為 1。若要取消配置範圍,Database Engine 會確定 GAM 位元已設為 1,且 SGAM 位元已設為 0。由 Database Engine 在內部使用的演算法,實際上比本主題中所說明的更為複雜,因為 Database Engine 會將資料平均散發到資料庫中。即使如此,因為實際的演算法不需有管理範圍配置資訊的鏈結,所以可加以簡化。

追蹤可用空間

「分頁可用空間 (PFS)」分頁會記錄每個分頁的配置狀態、個別分頁是否已配置,以及每個分頁的可用空間量。PFS 會為每個分頁設定一個位元,以記錄該分頁是否已配置,若已配置,則會記錄分頁是否為空白、已使用 1 至 50%、已使用 51 至 80%、已使用 81 至 95%,還是已使用 96 至 100%。

當範圍配置給物件之後,Database Engine 會使用 PFS 分頁,來記錄範圍中哪些分頁是已配置或可用的。當 Database Engine 必須配置新分頁時,就會使用此資訊。分頁中的可用空間量只會針對堆積與 Text/Image 分頁而保留。當 Database Engine 必須尋找具有可用空間的分頁來存放新插入的資料列時,就會用到它。因為插入新資料列的點由索引鍵值所設定,所以使用索引時不需追蹤分頁可用空間。

PFS 分頁是資料檔中檔案標頭分頁之後的第一個分頁 (頁碼為 1)。其後依序為 GAM 分頁 (頁碼為 2) 與 SGAM 分頁 (頁碼為 3)。在第一個 PFS 分頁之後,根據大小,大約每 8,000 個分頁就會有一個 PFS 分頁。在第 2 頁的第一個 GAM 分頁之後,每 64,000 個範圍之後會有另一個 GAM 分頁。在第 3 頁的第一個 SGAM 分頁之後,每 64,000 個範圍會有另一個 SGAM 分頁。下圖顯示 Database Engine 用來配置及管理範圍的分頁順序。

用來配置和管理範圍的頁面