我知道VARCHAR(MAX)/NVARCHAR(MAX)
使用列时会存储数据out of the row
-数据行将具有指向另一个存储“大值”位置的指针。
我有以下问题:
- 是存储每个字段
out of the row
还是仅存储一个字段max
? - 如果您使用
clustered index
表的读取整个记录,那么是否也读取了行外存储的字段?
VARCHAR(MAX)或NVARCHAR(MAX)被视为“大值类型”。大值类型通常存储在“行外”。这意味着...
我知道VARCHAR(MAX)/NVARCHAR(MAX)
使用列时会存储数据out of the row
-数据行将具有指向另一个存储“大值”位置的指针。
我有以下问题:
out of the row
还是仅存储一个字段max
?clustered index
表的读取整个记录,那么是否也读取了行外存储的字段?VARCHAR(MAX)或NVARCHAR(MAX)被视为“大值类型”。大值类型通常存储在“行外”。这意味着...
Answers:
我知道当使用
VARCHAR(MAX)/NVARCHAR(MAX)
列时,数据存储在行外。
实际上,这取决于large value types out of row
选项的设置,可以使用进行设置sp_tableoption
。从文档中:
该默认是MAX
存储值在行,高达8000个字节,它们是否适合。除非您曾经使用sp_tableoption
过默认值,否则您的MAX
数据很可能会存储在行中。
也就是说,将MAX
数据类型用于永远不会超过8000个字节的值是不明智的做法-而是使用非MAX类型。除此之外,处理MAX
类型时的性能通常会大大降低,因为SQL Server必须准备好处理可能高达2GB的数据。
每个字段是存储在行之外还是仅存储在最大字段之外?
只有MAX
那些。此外,如果将先前在行中的MAX
列移出行,则仅影响该行中的该列。它在行中由指向行外LOB
结构的指针替换。在某些情况下,非MAX列可能会移出行。
如果您正在使用表的聚集索引读取整个记录,那么行外存储的字段也会被读取吗?
扫描聚簇索引仅遍历行内数据。如果查询需要行外数据,则使用行内指针查找。
Scanning the clustered index traverses only in-row data.
吗?例如,如果要显示NVARCHAR(MAX)
字段值,那么仅使用in-row-data
(如果值存储在行外)怎么可能?或者,当您使用聚簇索引(因为没有覆盖索引)而又不想work
使用该NVARCHAR(MAX)
字段时,SQL Server足够聪明,可以看到它并跳过对out-of-row
数据的查找?
int
和nvarchar(max)
,你是只选择int
列时,SQL-Server不浪费资源read
的out-of-row
,因为它知道你不打算使用它的数据吗?
sp_tableoption
当进行许多聚集索引查找/扫描时,使用ap 可以将表中不常用的所有东西都放到表外,以减小行的大小。
text
,ntext
和image
。当然,您也可以将大类型存储在单独的表中。
大型对象存储的这种行为可以通过表设置来控制:
exec sp_tableoption N'MyTable', 'large value types out of row', <'ON' or 'OFF'>
SQL Server 2012文档中的参考位于:http : //msdn.microsoft.com/zh-cn/library/ms173530.aspx
因此,您可以控制空间的使用,行内或行外存储位置。