使用聚集索引时是否读取“行外”字段?

got*_*tqn 10 clustered-index varchar sql-server-2012

我知道当使用VARCHAR(MAX)/NVARCHAR(MAX)列时,数据被存储out of the row- 数据行将有一个指向存储“大值”的另一个位置的指针。

我有以下问题:

  1. 是存储每个字段out of the row还是仅存储这些字段max
  2. 如果您使用clustered index表的 来读取整个记录,那么存储在行外的字段是否也被读取?

VARCHAR(MAX) 或 NVARCHAR(MAX) 被视为“大值类型”。大值类型通常存储在“行外”。这意味着...

Pau*_*ite 13

我知道当使用VARCHAR(MAX)/NVARCHAR(MAX)列时,数据存储在行外......

实际上,这取决于large value types out of row选项的设置,可以使用sp_tableoption. 从文档

BOL提取物

默认MAX存储值在行,高达8000个字节,它们是否适合。除非您曾经sp_tableoption更改过默认值,否则您的MAX数据很可能会存储在行中。

也就是说,MAX对于永远不会超过 8000 字节的值使用数据类型是一种糟糕的做法- 而是使用非 MAX 类型。除此之外,处理MAX类型时的性能通常要差很多,因为 SQL Server 必须准备好处理可能高达 2GB 的数据。

每个字段是存储在行外还是仅存储最大字段?

只有MAX那些。此外,如果先前在行中的MAX列移出行,则仅该行中的该列会受到影响。它在行内被指向行外LOB结构的指针替换。在某些情况下,非 MAX 列可能会移出行。

如果使用表的聚集索引读取整条记录,是否也读取了存储在行外的字段?

扫描聚集索引只遍历行内数据。如果查询需要行外数据,则使用行内指针进行查找。

  • @gotqn 是的。Off-row 是旧 LOB 类型 `text`、`ntext` 和 `image` 的默认设置。当然,您也可以将大型类型存储在单独的表中。 (3认同)