行内数据

请参阅:

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

请参阅:

  • text in
    row(1)
  • text in row(2)
  • text in
    row(3)

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

  • text in row(1)
  • text in
    row(2)
  • text in
    row(3)

text in row 可以指定多少字节以下的字符串存在在行中,如果 text、ntext
或 image字符串长度比 text in row
指定的长度短,且数据行中有足够的可用空间容纳字符串
,那么字符串存在在行内部,而不是存在在行外部。

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

默认情况下,text、ntext、image 字符串存储在数据行外的大型(最大
2GB)字符串或二进制字符串,而数据行存储的是 16
字节的文本指针,该指针指向一个树的根结点,而这个树存储的是实际字符串或二进制字符串所在页的指针。

存储在数据行中的字符串,读写速度快,且可像 varchar
一样使用某些字符串函数。

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

我们知道 SQL Server 中页的大小为
8KB,除去相关占用,一页的数据大小最大还不足
8KB,由于一条记录(一行数据)只能存储在一页中,所以一条记录的最大大小不可能超过
8KB,而 8KB 对于很多记录来说是不够的,比如新闻系统,于是就产生了
text、ntext、image
字段,将实际的字符串存储在行外部,而行内部只存储相关的指针,这就是为什么
text、ntext、image 类型的字段,一般不能用字符串函数的原因了。

如果 text、ntext 或 image字符串长度比 text in row
指定的长度长,或数据行中没有足够的空间容纳字符串
,那么数据行存储指针集。这与
text in row 关闭时存储的指针有区别,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'

说了这么多,我们也该引入 text in row
了,一个新闻系统,有的文章很长,有的文章很短,只有几十个字,完全可以存储在行中,而不用存储在行外部,text
in row 就是在这种情况下提出的。

不过行中最多可容纳 5 个内部指针,需要 72 个字节的空间,如果连 72
个字节的空间都没有,并且又需要 5 个指针,SQL Server 就会另外分配一个 8KB
的页来容纳它们,所以 text in row 的值不应小于 72
字节,但也不应过高,如果此值过高,那么一个数据页可能容纳不了几条记录,就造成过多的页访问,速度反而变慢。

 

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'
有关行内数据的更多细节,请参考下面的链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注