我知道,当使用VARCHAR(MAX)/NVARCHAR(MAX)列时,数据被存储为out of the row --数据行将有一个指针指向存储“大值”的另一个位置。
我有以下问题:
out of the row还是只存储max字段?clustered index读取整个记录,那么存储在行之外的字段也会读取吗?VARCHAR(MAX)或NVARCHAR(MAX)被认为是“大值类型”。大型值类型通常存储在“行外”。这意味着..。
发布于 2015-01-02 14:53:24
我知道当使用
VARCHAR(MAX)/NVARCHAR(MAX)列时,数据存储在行之外.
实际上,这取决于large value types out of row选项的设置,该选项可以使用sp_tableoption设置。来自文档:

默认情况下,MAX值将存储在行中,最多可存储8000字节(如果合适的话)。除非您已经使用sp_tableoption来更改默认设置,否则您的MAX数据很可能存储在行中。
尽管如此,对于不会超过8000字节的值使用MAX数据类型是很糟糕的做法--使用非最大类型代替。除了其他之外,在处理MAX类型时,性能通常要差得多,因为Server必须准备好处理可能高达2GB大小的数据。
每个字段是存储在行之外的还是仅存储在最大的字段中?
只有MAX的。此外,如果将先前在行中的MAX列移出行,则仅影响该行中的该列。它在行中被指向off行LOB结构的指针替换.在某些情况下,可以将非最大列移出行。
如果使用表的聚集索引来读取整个记录,那么存储在行之外的字段也会读取吗?
扫描聚集索引只遍历行内数据.如果查询需要行外数据,则使用行内指针查找数据。
发布于 2015-01-02 14:57:59
大型对象存储的此行为可以通过表设置来控制:
exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>
Server 2012文档中的引用位于:http://msdn.microsoft.com/en-us/library/ms173530.aspx
因此,您可以控制使用空间的位置、行内空间或存储在行外的空间。
https://dba.stackexchange.com/questions/87435
复制相似问题