1. 程式人生 > >(翻譯內容)《Pro SQL Server Internals, 2nd edition》(pdf已傳至群檔案)的CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows一節(即P8~P14)

(翻譯內容)《Pro SQL Server Internals, 2nd edition》(pdf已傳至群檔案)的CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows一節(即P8~P14)

SQL Server中的資料儲存

 

一般來說,SQL Server儲存和與資料庫中的資料一起工作。使用基於行的經典儲存,資料被儲存在資料行中。將所有列的資料組合在一起。

SQL Server 2012引入了CurnSt店索引和基於列的儲存。這家技術商店每個列的資料而不是每行的資料。我們將在第七部分中介紹基於列的儲存。這本書。

最後,在SQL Server 2014中引入了一組記憶體技術,並進一步改進在SQL Server 2016中。即使它們在磁碟上保留冗餘資料,它們的儲存格式與基於行和列的儲存方式非常不同。我們將在記憶中討論本書第八部分的技術。

本書的這個部分主要關注基於行的儲存和經典的B-Tree索引和堆。

 

 

 

 

頁面標題檔案96位元組 資料 無空隙陣列

 

96位元組的頁頭包含關於頁的各種資訊,比如頁所屬的行數和頁上可用的空閒空間量如果頁面處於索引頁鏈中,則下一頁,等等。

 

頁頁首之後是實際資料儲存的區域。其次是自由空間。最後,有一個時隙陣列,它是由兩個位元組的條目組成的塊,指示對應的資料所處的偏移量行在頁面上開始。

槽陣列指示頁上的資料行的邏輯順序。如果頁面上的資料需要按照索引鍵的順序排序的SQL Server並不對頁面上的資料行進行物理排序,而是它基於索引排序順序填充時隙陣列。插槽0(圖1-6中最右邊)儲存偏移量頁面上具有最低鍵值的資料行;插槽1,第二最低鍵值;等等。我們將在下一章更深入地討論索引。

 

SQLServer提供了一組豐富的系統資料型別,它們可以在邏輯上分成兩種不同的型別。組:固定長度和可變長度。固定長度資料型別,如int、DATEIME、CHAR和其他型別,總是使用相同數量的儲存空間而不管它們的值,即使它是空的。例如,int列總是使用4個位元組,而nCHAR(10)列總是使用20個位元組來儲存資訊。

相比之下,可變長度資料型別,如varchar、varbinary和其他一些資料型別,使用相同的內容儲存空間需要儲存資料,加上兩個額外位元組。例如,一個NVARCHAR(4000)列只使用12個位元組來儲存一個五字元字串,在大多數情況下,使用兩個位元組來儲存一個NULL值。稍後我們將討論變長列不使用NULL值的儲存空間的情況這一章。

 

 

 

 

 

 

行的前兩個位元組,稱為狀態位A和狀態位B,是包含資訊的點陣圖。關於行,如行型別,如果該行已被邏輯刪除(重影),以及該行是否為空值、可變長度列和版本控制標籤。

 

行中的後兩個位元組用於儲存資料的固定長度部分的長度。他們其次是固定長度資料本身。

在固定長度資料部分之後,有一個空點陣圖,它包括兩個不同的資料元素。前兩個位元組元素是行中的列數。第二個是空點陣圖陣列。這個陣列對於表的每列使用一個位,而不管它是否為空。

空點陣圖總是出現在堆表或叢集索引葉子行的資料行中,即使表沒有可空列。然而,空點陣圖不存在於非葉索引行中,也不存在於當索引中沒有空列時,非聚集索引的葉級行。

在空點陣圖之後,是行的可變長度資料部分。它從兩個位元組開始。行中的可變長度列的數目,後面是列偏移陣列。SQLServer儲存兩個位元組該行中每個可變長度列的偏移值,即使值為NULL。其次是資料的實際可變長度部分。最後,在結尾有一個可選的14位元組版本標記。排成一行。此標記在需要行版本控制的操作期間使用,例如聯機索引重建,樂觀的隔離級別、觸發器和其他一些。

 

 

讓我們建立一個表,用一些資料填充它,並檢視實際的行資料。程式碼顯示在

清單1-4。Replicate函式重複作為第一個引數提供的字元10次。

 

 

 

 

有兩頁屬於該表。第一個,PageType=10,是一個特殊型別的頁面。稱為IAM分配對映。此頁跟蹤屬於特定物件的頁。不要專注於然而,現在,我們將在本章後面介紹分配圖頁。

注意,SQL Server 2012引入了另一個無文件資料管理功能(DMF),sys.dm_db_database_page_.ions,可以用作DBCC IND命令的替換。產量與DBCC IND相比,該DMF提供更多的資訊,並且可以與其他系統DMV連線和/或目錄檢視。

具有Page(1)的頁面是包含資料行的實際資料頁。PageFID和PaPIEID列顯示頁面的實際檔案和頁碼。您可以使用另一個無證檔案命令,DBCC PAGE,檢查其內容,如清單1-5所示。

 

清單1-6顯示了與第一資料行對應的DBCC PAGE的輸出。SQLServer儲存位元組中的資料交換順序。例如,兩個位元組的值0001將被儲存為0100。

 

 

 

如您所見,行以兩個狀態位開始,後面跟著兩個位元組的值0800。這就是位元組交換值0008,這是行中列數屬性的偏移量。此偏移量告訴SQLServer行的固定長度資料部分在哪裡結束。

接下來的四個位元組用於儲存固定長度的資料,在本例中是ID列。之後,有兩個位元組的值,表明資料行有四列,後面跟著一個位元組的NULL點陣圖。只有四列,點陣圖中的一個位元組就足夠了。它儲存的值為04,為00000×100。以二進位制格式。它指示行中的第三列包含空值。

接下來的兩個位元組儲存行中可變長度列的數量,該行為3(以位元組交換形式是0300)命令)。後面跟著一個偏移陣列,其中每兩個位元組儲存一個偏移量,其中列資料結束如您所見,儘管Col2是NULL,但它仍然使用偏移陣列中的插槽。最後,有來自可變長度列的實際資料。

現在,讓我們看一下第二個資料行。清單1-7顯示了DCBC頁面輸出,圖1-10顯示了行資料。

 

 

第二行中的NULL位圖表示二進位制值00001010,它顯示Col1和COL3為空。即使表有三個可變長度的列,可變長度的數目行中的列表示偏移陣列中只有兩個列/插槽。SQLServer不維護行中尾隨的NULL可變長度列的資訊。

提示可以通過以可變長度的方式建立表來減小資料行的大小通常儲存空值的列被定義為CREATE TABLE語句中的最後一個列。這是CREATE TABLE語句中列順序唯一重要的情況。

固定長度的資料和內部屬性必須適合於單個數據頁上可用的8060位元組。當情況不是這樣時,SQLServer不允許您建立表。例如,清單1-8中的程式碼產生錯誤。

 

原著:《Pro SQL Server Internals, 2nd edition》翻譯的CHAPTER 1 Data Storage Internals中的Data Pages and Data Rows一節