同資料列資料(In-Row Data)
資料表中每一筆資料(Row)最多只能8K,因此當我們在表中有varchar(max)、nvarchar(max)、varbinary(max) 以及 xml 這一種大資料量欄位時SQL是如何儲存資料呢?其實有兩個參數是關於這方面的設定text in row 及 large value types out of row 。簡單的說就是當資料大於8K時,該大型欄位SQL會放在一個LOB 儲存體空間中而不是放在資料列中。這樣能降低資料掃瞄時的IO量。
除非將 text in row 選項設為 ON,或是設為特定的同資料列限制,否則 text、ntext 或 image 字串都是儲存在資料列之外的大型字元或二進位字串 (可高達 2GB)。資料列僅包含 16 位元組的文字指標,指向由內部指標所組成之樹狀結構的根節點。這些指標會對應用來儲存字串片段的分頁。
同樣地,除非 large value types out of row 選項設為 ON,否則 varchar(max)、nvarchar(max)、varbinary(max) 以及 xml 資料行都會儲存在資料列中 (在可能的情況下)。若是如此,SQL Server Database Engine 會盡量配合特定值,否則就會將該值發送到非資料列。若 large value types out of row 設為 ON,就會以非資料列方式來儲存值,而且只有 16 位元組的文字指標會儲存在記錄中。
PS.當 large value types out of row 設為 OFF,varchar(max)、nvarchar(max)、varbinary(max) 以及 xml 資料行的同資料列限制就會設為 8,000 位元組。只有 16 位元組根指標會以同資料列儲存,且該值會儲存在 LOB 儲存體空間中。若資料表中的大部分陳述式不會參考大數值類型資料行,建議將此選項設為 ON。以資料列外方式來儲存這些資料行,就表示每一頁可容納的資料列更多,因此可降低掃描資料表時所需的 I/O 作業數量。
參考資料來源:http://technet.microsoft.com/zh-tw/library/ms189087(v=sql.105).aspx
同資料列資料(In-Row Data)Part 2
我是ROCK
rockchang@mails.fju.edu.tw