2013-08-01 95 views
0

我試圖計算sql_variant用來存儲固定長度數據類型的存儲空間。計算SQL Server sql_variant數據類型用於存儲固定長度數據類型的存儲空間

對於我的測試我創建的表有兩列:

 
    Key int identitiy(1,1) primary key 
    Value sql_variant 

我添加一行與值1 int類型的,並且我用DBCC PAGE來檢查該行的大小,即原來是21字節。

使用Estimate the Size of a Clustered Index我:

 
    Null_bitmap = 3 
    Fixed_Data_Size = 4 (Key column int) 
    Variable_Data_Size = 2 + 2 + 4 (Value column with an int)
Row_Size = 4 + 8 + 3 + 4 = 19 bytes

爲什麼該行採取21個字節?我在計算中缺少什麼?

我使用int列,而不是由DBCC頁報告的SQL_VARIANT和使用的字節數試圖用一臺同樣的分析爲15,符合我的計算,其中:

 
    Null_bitmap = 3 
    Fixed_Data_Size = 8 (Key column int, Value column int) 
    Variable_Data_Size = 0
Row_Size = 4 + 8 + 3 = 15 bytes

回答

1

額外的空間是sql_variant元數據信息。從BOL:

http://msdn.microsoft.com/en-us/library/ms173829.aspx

*一個SQL_VARIANT列的每個實例都記錄數據值和元數據信息。這包括基本數據類型,最大大小,比例,精度和排序規則。

爲了與其他數據類型兼容,報告sql_variant對象的長度的目錄對象(如DATALENGTH函數)報告數據的長度。包含在sql_variant對象中的元數據的長度不會被返回。*

+0

謝謝@Jonathan,我認爲您要引用的正確鏈接是http://msdn.microsoft.com/en-us/library/ms181071(v=sql.105).aspx(我用google搜索引用:)) – marcob

+0

這是否意味着對於每個sql_variant列,我應該考慮爲元數據增加2個字節? – marcob

1

你錯過了第7部分

7。計算每頁的行(每頁8096個免費字節)的數量:

Rows_Per_Page = 8096 /(Row_Size + 2)

因爲行不跨頁,每頁行數應該是 捨去到最近的整行。公式中的值2爲 ,表示該行在頁面的插槽數組中的條目。

+0

嗨,羅伯特,我很關心行數據使用的空間。這一點是關於頁面所使用的空間,特別是存在於每個數據頁面底部的插槽陣列(http://www.sqlskills.com/blogs/paul/inside-the-storage-engine- /對的一頁解剖)。我編輯了這篇文章,並添加了我使用固定長度列進行的測試,而不是sql_variant和計算工作,所以我明顯錯過了一些東西,但我無法弄清楚。 – marcob