SQL Server 2005使用的依旧是8096bytes的page,但是与之前版本不同的是,它允许你超出8K的限制。但是对于一个特定列来说,仍然不允许超过8K的限制,除了LOB类型。比如你不能定义varchar(9000)或者nvarchar(5000)类型,有人说可以定义varchar(max)或nvarchar(max),但是很可惜,这两种新加类型是LOB类型,跟varchar,nvarchar本质不同。
我们回归正题,但是我们可以声明总和超过8096bytes的row,比如 mytable(a varchar(1000),b nvarchar(4000)),这在2005是允许的。那么2005是如何在内部处理这些过大的行的呢?其实在内部,它会先判断你实际数据的大小,如果你执行了insert into mytable select 'a','b',实际row的大小是3bytes(不包含page头信息),sql server会把这行存在IN_ROW_DATA类型的page中,这种page速度最快。如果你你执行了insert into mytable select 'a',replacate('b',4000),那么大小为8003bytes,超过了8000bytes,(96bytes为page头信息)那么列b将被重新分配到一个ROW_OVERFLOW_DATA 类型的page中,在原IN_ROW_DATA页中记录新页的地址信息。这就是为什么2005能使行大小突破8k限制的原因。
所以当行大小超过8k时,设计表结构时要注意提高数据访问的效率了,因为IN_ROW_DATA速度最快,ROW_OVERFLOW_DATA 次之,LOB_DATA 最慢(存储大类型text,image等),最好不要让row 大小超越8k以提高效率。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zbc1009/archive/2008/05/06/2404274.aspx