如果 text、ntext 或 image 字符串的长度比 text in row 选项的限制或行中的可用空间长,则本应存储在指针树根节点中的指针集将存储在行中。下列情况下,将指针存储在行中:
存储指针所需的空间量比 text in row 选项限制指定的少。
数据行中有足够的可用空间容纳指针。 当指针从根节点移至行本身时,SQL Server 无须使用根节点。这可在读取或写入字符串时消除页访问,从而加快处理速度。
当使用根节点时,它们被存储为 text、ntext 或 image 页中的一个字符串片段,并且可最多容纳五个内部指针。SQL Server 的行需要 72 字节的空间存储行内字符串的五个指针。如果当 text in row 选项打开时行中没有足够的空间容纳指针,SQL Server 必须分配一个 8-K 页容纳它们。不应将 text in row 限制设置为小于 72 字节,除非确定存储在列中的所有字符串都较短或超过 3 MB。
当 text、ntext 或 image 字符串存储在行中时,它们的存储类似于长度可变的字符串。例如,如果 text in row 选项的限制为 500 字节,则在行中存储一个 200 字节的字符串时,SQL Server 将只使用存储该字符串所需的字节数。如果插入的字符串比 500 字节长,因而指针存储在行中,则 SQL Server 只使用足够容纳指针的空间,而不是全部 500 字节。
如果某个表有多个 text、ntext 或 image 列,则当尝试插入多个 text、ntext 或 image 字符串时,SQL Server 将按基于列 ID 的顺序给这些字符串逐个分配空间。例如,假设有一个包含四个 text 列的表,并且将 text in row 选项的限制设置为 1000。然后插入某行,而该行中每个 text 列都为 900 字节的字符串,并且有足够的数据用于表中的所有其它列,因此在行中只有 3,000 字节的可用空间容纳 text 字符串。前三个 text 列的字符串存储在行中,使用 3,000 可用字节中的 2,700 字节。第四个 text 列的字符串不存储在行中,但根节点的指针存储在行中。
启用和禁用 text in row 选项 可使用 sp_tableoption 为表启用 text in row 选项:
sp_tableoption N 'MyTable ', 'text in row ', 'ON '