日期:2014-05-17  浏览次数:20454 次

sqlserver中大字段是如何存储的,比如varchar(max),text,image
B树结构了,堆(HEAP)结构了,都用8kb的页(page)为单位来描述

对于大字段,有如下疑问

1,大字段是如何存储的,比如varchar(max),text,image之类的,这种数据类型是如何存储的?

2,另外一个问题,比如varchar(max),算是大字段,当一个页可以容纳下的时候,比如存储了100个字符,与一个页容纳不下时,比如存储了100000个字符,存储结构是不是一样的?

3,LOB和行溢出的存储结构怎么理解?

谢谢!













.

------解决方案--------------------

1.大字段的存储,应该是在数据页中存储1个指针,也就是一个地址,指向了真正存储大字段数据的数据页

2.对于varchar(max) ,这个比较特别,也比较灵活,在数据少的时候,sql server会把数据直接存储在数据页中,如果较多,就会存储在数据页外,也就是上面的大字段存储。

3.这个lob就是上面的大字段存储,也就是large object,而行溢出是另一个概念,首先这个数据行中并没有存储lob字段,只不过超过了页8k的限制。

比如一行数据,有10个字段,都是varchar的,每个都是varchar(1000),因为一个页中还有其他的开销字节,那么就有可能超过了8K
------解决方案--------------------
英文要不要?
http://sqlserverzest.com/2013/10/14/sql-server-understanding-allocation-units-in-row-data-lob-data-row-overflow-data/
http://sqlmag.com/sql-server-2008/sql-server-2008-lob-data-types
http://www.sqlskills.com/blogs/kimberly/understanding-lob-data-20082008r2-2012/
------解决方案--------------------
varchar(max):
1)当存储字符长度<=8000时,存储机制跟常规varchar一样,实际占用空间=字符长度+2(结束标识)。
2)当存储字符长度>8000时,存储机制跟text一样。varchar(max)支持的最大长度是系统支持的最大长度,如在32位SQL Server上其最大长度为2G字节。