第2/24周 頁_SQL Server 中數據存儲的基本單位


        上周通過探討SQL Server如何執行一個查詢奠定了基礎。我也在那里提到頁是8kb的緩存。今天我們對頁進行進一步集中探討,從性能調優角度挖掘出更多的細節。

        頁是SQL Server的基礎,在SQL Server里一切都與頁有關。當我們想提高查詢性能時,我們可以減少SQL Server指定查詢所需頁的讀取。在第二個月當我們討論索引時,我們發現其實索引的結構也是由頁組成的。當你不知道頁是什么的時候,你就不能對SQL Server進行調優和故障排除。

數據頁結構

在SQL Server中頁的大小始終是8kb的大小,頁有不同的類型:數據頁,索引頁,系統頁等等。今天我們對在SQL Server存儲我們表數據的數據頁進行更多細節的學習。一個數據頁總是由三個部分組成:

  1. 頁頭(Page Header)
  2. 數據區(Payload)
  3. 行偏移數組(Row Offset Array)

在SQL Server中頁頭的始終是96 byte長(不受頁的類型約束),這里存儲着像Page ID,Object ID等頁的大體信息。數據區是頁中最有意思的部分,因為我們的記錄就存在那里。SQL Server給你8192 bytes(8kb)的空間,其中8096 bytes是給數據區的。因此計算多少條記錄剛好可以填滿一個頁是個很容易的事,直接拿8096除以記錄長度即可(這里包含至少7 bytes的內部行開銷)。當你把結果取整下,你就得到在一頁里你可以存放多少條記錄。

SQL Server中對頁操作必須是整頁讀或寫的,因此我們的目標總是希望在一頁里存放盡可能多的記錄。SQL Server不能從你存儲里讀頁的一部分,或者把頁的一部分寫入存儲。I/O操作始終最少都是在頁級別完成的。

最后在頁的底部你會看到被稱作行偏移數組的東西。行偏移數組用2 bytes存儲着每條記錄在頁里位置的偏移量。第一條記錄始終開始與96的偏移,剛好緊接着頁頭。下圖可以給你剛才介紹的數據頁結構的概況認識。

深入解析數據頁

我們來看一個簡單的表定義: 

 1 CREATE TABLE Customers
 2 (
 3    FirstName CHAR(50) NOT NULL,
 4    LastName CHAR(50) NOT NULL,
 5    Address CHAR(100) NOT NULL,
 6    ZipCode CHAR(5) NOT NULL,
 7    Rating INT NOT NULL,
 8    ModifiedDate DATETIME NOT NULL,
 9 )
10 GO

 對於這樣一個表定義我們很容易計算出在一頁里我們可以存放幾條記錄。這里記錄的大小是224 bytes長(50+50+100+5+4+8+7)。8096 / 224 = 36.14,也就是說在一頁你最多能存放36條記錄。那其他剩余的空間——在這里是32 bytes(8096-224*36)就浪費掉了,因為數據頁只能屬於一個指定的數據庫對象,且不能與其他對象共享。最壞的情況,當你的表定義了一條長度為4031bytes 的記錄時,在每一頁你都在浪費4029 bytes的空間。當你用像VARCHAR等變長類型定義字段時,情況會發生改變,因為SQL Server允許變長列存放在不同的頁。

如果你想知道在你數據庫設計后,每頁有多少空間浪費掉,你可以通過下列動態管理視圖(DMV)查詢下緩沖池:sys.dm_os_buffer_descriptors 從這個動態管理視圖(DMV)顯示的每條記錄都代表當前在緩存池里保存的每一頁,當你在有大內存的機器上查詢這個動態管理視圖時要注意了,這個操作很耗內存。free_space_in_bytes 列告訴你當前頁有多少空間是空閑的。下面這個查詢可以告訴你在SQL Server里每個數據庫有多少空間被浪費: 

1 SELECT
2    DB_NAME(database_id),
3    SUM(free_space_in_bytes) / 1024 AS 'Free_KB'
4 FROM sys.dm_os_buffer_descriptors
5 WHERE database_id <> 32767
6 GROUP BY database_id
7 ORDER BY SUM(free_space_in_bytes) DESC
8 GO

 這個是我在系統里經常執行的查詢(例如在做SQL Serve健康檢查時),為了找出哪個數據庫有糟糕的表設計。

小結 

我希望這次性能調優培訓可以幫你更好的理解SQL Serve中的數據頁,而且它們對性能調優是多么重要。你也看到,專注於表設計與否將直接影響多少數據頁給一個表使用。

如果你想知道關於數據頁的更多細節信息,看下這個文章:SQL Server:理解數據頁結構

下周我們將探討SQL Serve里的更多細節,它們同樣對我們很重要。

圍觀PPT:

0430_02頁_SQL_Server中數據存儲的基本單位.zip


免責聲明!

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



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