行内数据

所谓行内数据,最近在讲课中也提到了:SQL Server的行(Row)是不能跨页(Page)的, 准确地说,一行数据的长度最多是8060字节。那么对于那些超过大小的数据怎么办呢?按照正常的理解是,它们是单独存放在一个位置的,在行里面放置了一个指针。

那么,有没有这样一种情况,就是说,我确实是一个很大的数据类型,但是当前这一行所给我赋的值并没有那么多,例如它确实只有100Byte。是不是一定要千篇一律地放在行外面去?

这些数据类型是什么呢?以及他们都受什么选项的影响来决定如何存储数据呢?

text,ntext,image ==》这三个比较旧的数据类型受到 text in row这个选项的影响

可以按照以下方式通过使用 sp_tableoption 为表启用 text in row 选项:

sp_tableoption N'MyTable', 'text in row', 'ON'

或者,可以为能够在数据行中存储的 textntextimage 字符串长度指定从 24 到 7,000 字节的最大限制:

sp_tableoption N'MyTable', 'text in row', '1000'

如果指定的是 ON 而不是一个特定的限制,则此限制的默认值为 256 字节。该默认值使您能够从使用 text in row 选项中获得最多的性能收益。虽然通常情况下,不应使该值的设置低于 72,但也不应将其设置的过高。该设置尤其适用于其中大多数语句都不引用 textntextimage 列的表,或其中有多个 textntextimage 列的表。

如果设置了较大的 text in row 限制,且行本身存储了许多字符串,则可以显著减少存储在每页上的数据行数。如果大多数引用表的语句都不访问 textntextimage 列,则减少页中的行数会增加处理查询时必须读取的页数。减少每页上的行会增加索引和页的大小,优化器找不到可用的索引时可能必须扫描这些索引和页。text in row 限制的默认值为 256,这足以确保小型字符串和根文本指针可以存储在行中,但不会使每页上的行减少太多以至影响性能。

对于具有表数据类型的变量和用户定义函数(返回)返回的表,text in row 选项自动设置为 256。不能更改该设置。

也可以使用 sp_tableoption 指定 OFF0 选项值来禁用此选项。

sp_tableoption N'MyTable', 'text in row', 'OFF'

 

varchar(max),nvarchar(max),varbinary(max),XML==》这四种类型受到large value types out of row这个选项的影响

如果指定为 OFF,则 varchar(max)nvarchar(max)varbinary(max)xml 列的行内限制被设置为 8,000 字节。只有 16 字节的根指针存储在行内,而值存储在 LOB 存储空间中

sp_tableoption N'MyTable', 'large value types out of row', 'ON'
sp_tableoption N'MyTable', 'large value types out of row', 'OFF'
有关行内数据的更多细节,请参考下面的链接

http://technet.microsoft.com/zh-cn/library/ms189087(SQL.90).aspx

posted @ 2009-04-23 12:07  陈希章  阅读(771)  评论(0编辑  收藏  举报