上週通過**sql server如何執行乙個查詢奠定了基礎。我也在那裡提到頁是8kb的快取。今天我們對頁進行進一步集中**,從效能調優角度挖掘出更多的細節。
頁是sql server的基礎,在sql server裡一切都與頁有關。當我們想提高查詢效能時,我們可以減少sql server指定查詢所需頁的讀取。在第二個月當我們討論索引時,我們發現其實索引的結構也是由頁組成的。當你不知道頁是什麼的時候,你就不能對sql server進行調優和故障排除。
在sql server中頁的大小始終是8kb的大小,頁有不同的型別:資料頁,索引頁,系統頁等等。今天我們對在sql server儲存我們表資料的資料頁進行更多細節的學習。乙個資料頁總是由三個部分組成:
頁頭(page header)
資料區(payload)
行偏移陣列(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對於這樣乙個表定義我們很容易計算出在一頁裡我們可以存放幾條記錄。這裡記錄的大小是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允許變長列存放在不同的頁。create
table
customers2(
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
notnull
,8 modifieddate datetime
notnull,9
)10go
如果你想知道在你資料庫設計後,每頁有多少空間浪費掉,你可以通過下列動態管理檢視(dmv)查詢下緩衝池:sys.dm_os_buffer_descriptors 從這個動態管理檢視(dmv)顯示的每條記錄都代表當前在快取池裡儲存的每一頁,當你在有大記憶體的機器上查詢這個動態管理檢視時要注意了,這個操作很耗記憶體。free_space_in_bytes 列告訴你當前頁有多少空間是空閒的。下面這個查詢可以告訴你在sql server裡每個資料庫有多少空間被浪費:
1這個是我在系統裡經常執行的查詢(例如在做sql serve健康檢查時),為了找出哪個資料庫有糟糕的表設計。select
2db_name
(database_id),
3sum(free_space_in_bytes) /
1024as'
free_kb'4
from
sys.dm_os_buffer_descriptors
5where database_id <>
32767
6group
bydatabase_id
7order
bysum(free_space_in_bytes) desc
8go
我希望這次效能調優培訓可以幫你更好的理解sql serve中的資料頁,而且它們對效能調優是多麼重要。你也看到,專注於表設計與否將直接影響多少資料頁給乙個表使用。
SQL Server中資料的儲存
參考 檔案說明 主要主要資料檔案包含資料庫的啟動資訊,並指向資料庫中的其他檔案。使用者資料和物件可儲存在此檔案中,也可以儲存在次要資料檔案中。每個資料庫有乙個主要資料檔案。主要資料檔案的建議副檔名是 mdf。次要次要資料檔案是可選的,由使用者定義並儲存使用者資料。通過將每個檔案放在不同的磁碟驅動器上...
SQL Server儲存 7 8 理解BCM頁
今天我們來討論下批量更改對映 bulk changed map bcm 頁,還有大容量日誌恢復模式 bulk logged recovery model 如何運作的。批量更改對映 bulk changed map bcm sql server使用bcm頁來跟蹤自上次完全備份後,被大容量日誌操作修改的...
SQL Server儲存 6 8 理解DCM頁
差異變更頁 differential change map dcm sql server使用差異變更頁來跟蹤自上次完全備份後修改過的區。dcm頁在資料檔案裡是第6頁。dcm頁用來跟蹤完全備份後修改過的區。dcm為每個跟蹤的區使用每一位來記錄。如果這個位是設定為1,那麼自上一次完全備份後,這個區是被修...