天天看點

SQL Server如何在變長列上存儲索引

這篇文章我想談下SQL Server如何在變長列上存儲索引。首先我們建立一個包含變長列的表,在上面定義主鍵,即在上面定義了聚集索引,然後往裡面插入80000條記錄:

從代碼裡我們可以看到,我在VARCHAR(255)列上建立了主鍵限制,SQL Server會強制這列為唯一聚集索引。接下來我們通過DMV sys.dm_db_index_physical_stats來擷取聚集索引的相關實體資訊: 

SQL Server如何在變長列上存儲索引

從輸出結果可以看出,在索引頁裡,min_record_size_in_bytes列的值是7,max_record_size_in_bytes列的值是28。我們據此可以得出結論:在索引記錄内部,聚集鍵是以變長列儲存的。我們建立一個幫助表來存儲DBCC IND的輸出資訊來做進一步分析。

SQL Server如何在變長列上存儲索引

我這裡的根頁是15058,我們使用DBCC PAGE指令檢視下這個根頁(記得先執行 DBCC TRACEON(3604))。

SQL Server如何在變長列上存儲索引

即如下所示的數字:

我們來分析下這些16進制值:

26 95020000 0100 0100 1b00 43757374 6f6d6572 4e616d65 31333533

26 第1個位元組代表狀态位

95020000 這4個位元組代表索引記錄指向的子頁id(child-page-id)

0100 這2個位元組代表索引記錄指向的子檔案id(child-file-id)

0100 這2個位元組代表變長列數

43757374 6f6d6572 4e616d65 31333533 聚集鍵的16進制值,即CustomerName列。