2012-08-01 55 views
0

有一列field1 varchar(32)SQL Server的VARCHAR內存使用

如果我只是店「ABC」在這個領域,它需要3個字節。當SQL Server訪問此列並將其緩存到內存中時,需要多少內存? 3個字節或32個字節,以及如何證明你的答案?

在此先感謝

+0

實際上,在'VARCHAR(32)'列中存儲'ABC'大約需要5-7個字節。有一些額外的開銷 - 兩個字節表示這是一個*可變長度列,至少有一兩個字節的「普通」開銷(比如'NULL'字節等)每行。 – 2012-08-01 09:36:35

+0

這至少2字節開銷是短字符串(如5個字符或更少)不應該存儲爲'varchar'的原因之一。一個'varchar(2)'列需要2-4個字節的存儲空間 - 'char(2)'總是隻有2個字節(因爲它不是可變長度) – 2012-08-01 09:38:13

回答

4

SQL Server不會緩存該列。它會緩存整個包含該值的頁面,所以它總是會緩存8192個字節。頁面的位置受in-rowrow-overflow存儲以及該列是否爲sparse等事情的影響。

現在一個更好的問題是這個值在頁面中佔多少?答案也不是直截了當的,因爲該值可以未壓縮存儲,row-compressedpage compressedcolumn-compressed。行壓縮對varchar字段沒有影響,但頁面壓縮的確如此。

現在回答的直接的方式多少存儲做了varchar(32)型值行佔據非壓縮表最好的資源是Inside the Storage Engine: Anatomy of a record。在閱讀Paul Randal的文章後,您將能夠回答這個問題,並且可以證明答案。

此外,您必須考慮將此列作爲關鍵字或包含此列的任何二級索引。

+0

謝謝,非常明確! – foman 2012-08-02 07:34:01