標籤:頁 資料頁 區
寫在前面的廢話:索引問題已經是老生常談的問題,雖然被經常說起,但作為我來說,至今沒有用過索引(很可怕吧),我作為MS-BI實施工程師居然沒用過索引,說話自然沒底氣。之前對索引的瞭解停留在“知道”的地步上,隨著時間的流逝感覺不真正將索引應用起來簡直是渣渣!廢話到此為止,開始索引專題,為了徹徹底底(我不是DBA,能將索引理解達到熟練使用即可,所以並不徹底)搞懂索引,從資料頁學習吧!本篇主要來源MS的聯機文檔!
頁和區系統結構
頁:SQL Server中資料存放區的基本單元便是頁。為資料庫中的資料檔案分配的磁碟空間可以從邏輯上劃分成頁(從0到N連續編號)。磁碟的I/O操作在頁層級執行。也就是說SQLSERVER讀取或寫入所有資料頁。
怎樣理解呢?作為儲存單位,這裡給個不恰當的比喻:一個養豬場,有很多豬圈,每個豬圈看作儲存資料的頁。作為飼養員的我,假設我對養豬場的豬進行買賣,我的操作對象是豬沒錯,但是,其實我們也是在豬圈的基礎上進行買賣,首先,我會對豬圈進行編號,然後,去買賣不同編號裡的豬。所以可以理解為:我把豬(資料)養在不同編號(磁碟空間從邏輯上劃分成0到N連續編號)的豬圈(頁)裡面,我買賣(I/O操作)這些豬,都是來自各個豬圈的。
頁的大小為8K。每頁的開頭是96位元組的標題,用於儲存有關頁的資訊。此資訊包括:頁碼,頁類型,頁的可用空間以及擁有該頁的對象的配置單位ID。
這句話好理解:每個豬圈能養幾頭豬(8k),每個豬圈有個豬圈牌,豬圈牌上寫點啥呢?當然要寫:幾號豬圈,是公豬圈、母豬圈、還是豬崽圈,已經養了幾頭豬以及這個豬圈的負責人連絡方式。
下面列出MSSQL中資料頁的種類(公豬圈、母豬圈、還是豬崽圈):
頁類型 |
內容 |
Data |
當 text in row 設定為 ON 時,包含除 text、 ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 資料之外的所有資料的資料行。 |
Index |
索引條目。 |
Text/Image |
大型物件資料類型: · text、 ntext、image、nvarchar(max)、varchar(max)、varbinary(max) 和 xml 資料。 資料行超過 8 KB 時為可變長度資料類型列: · varchar、nvarchar、varbinary 和 sql_variant |
Global Allocation Map、Shared Global Allocation Map |
有關區是否分配的資訊。 |
Page Free Space |
有關頁分配和頁的可用空間的資訊。 |
Index Allocation Map |
有關每個配置單位中表或索引所使用的區的資訊。 |
Bulk Changed Map |
有關每個配置單位中自最後一條 BACKUP LOG 語句之後的大容量操作所修改的區的資訊。 |
Differential Changed Map |
有關每個配置單位中自最後一條 BACKUP DATABASE 語句之後更改的區的資訊。 |
在下來看看豬圈的樣子吧:
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/71/87/wKioL1XTT5GC9sFSAABnicuNgrs645.jpg" title="豬圈圖.png" alt="wKioL1XTT5GC9sFSAABnicuNgrs645.jpg" />
上面是一個頁的樣本圖:注意,在資料頁上,資料行緊接著標題按順序放置,頁的末尾是行位移表,對於頁中的每一行,每個行位移表都包含一個條目,每個條目記錄對應行的第一個位元組與頁首的距離(行位移量之前一直不理解,現在我理解的就是,假設每頭豬不會動的按照行排列在豬圈中,每頭豬距離豬圈門口的距離就是位移量,當然這個距離-行位移量也像豬圈牌一樣是記錄在另一個“牌子”上的,只不過它不按照123的順序記錄,是倒敘的)。行位移表中的條目的順序與頁中行的順序相反(至於為什麼是相反的順序,我猜是從資料結構等等高深的角度考慮吧,暫且理解為寫這個行位移量豬牌的人,站在豬圈尾端,先看到了最後一頭豬,所以倒著記錄了,沒準MS就是這麼設計的,哈哈!)。
至此,MS的這個豬圈看似可以養豬了,但是,一種極端的情況呢?這頭豬,變異了,豬腿超級大,一個豬圈養不下怎麼辦!注意力,注意了,看MS怎辦了:行不能跨頁,但是行的部分可以移出行所在的頁,因此行實際可能非常大(看到一頭沒有腿的小豬,不要嫌棄它小,沒準的腿比大象的還粗!)。對了,將豬腿切下來,單獨放……下面是MS的具體做法:頁的單個行中的最大資料量和開銷是8060位元組(8K);但是不包括用Text/Image頁類型儲存的資料(為什麼不包括這些類型的頁呢?原因很簡單,有些豬圈是經過特別設計的專門存放超大豬的,是整個豬,不是一個豬腿。),包括varchar ,nvarchar,varbinary或sql_variant列的表不受此限制的約束。當表中的所有固定列和可變列的行的總大小超過限制的8k時,SQL SERVER將從最大的列開始動態將一個或者多個可變長度列移動到 ROW_OVERFLOW_DATA配置單位中的頁。(自述:將表中列移動到其他頁)。每當插入或更新操作將行的總大小增大到超過限制的 8,060 位元組時,將會執行此操作。將列移動到 ROW_OVERFLOW_DATA 配置單位中的頁後,將在 IN_ROW_DATA 配置單位中的原始頁上維護 24 位元組的指標。如果後續操作減小了行的大小,SQL Server 會動態將列移回到未經處理資料頁。
本文出自 “SeaSky” 部落格,請務必保留此出處http://seasky09.blog.51cto.com/7243998/1685740
Sql Server專題一:索引(上)