【发布时间】:2015-11-23 14:56:42
【问题描述】:
我一直在读这样的东西:
在 SQL 的未来版本中将删除 text in row 选项 服务器。避免在新的开发工作中使用此选项,并计划 修改当前在行中使用文本的应用程序。我们建议 使用 varchar(max)、nvarchar(max) 或 varbinary(max) 数据类型。控制行内和行外行为 在这些数据类型中,请使用大值类型 out of row 选项。
如果我们有一个 varchar(max) 字段,我们希望限制为 16 个字符,我们该怎么办?
谢谢!
编辑。当我说“行内”时,我的意思是 VARCHAR/TEXT 字符串直接存储在数据行中,而不是作为指针(字符串数据存储在其他地方)。如果移出行的数据不是“where”子句的一部分,则行外数据将提高表扫描性能。
编辑。我引用的文字是这样说的:
控制行内和行外行为 在这些数据类型中,请使用大值类型 out of row 选项。
果然:
https://msdn.microsoft.com/en-us/library/ms173530.aspx
但是在那个页面上是这样写的:
在未来版本的 SQL 中将删除行中文本功能 服务器。要存储大值数据,我们建议您使用 varchar(max)、nvarchar(max) 和 varbinary(max) 数据类型。
所以问题仍然存在。
编辑。看来我们仍然可以使用此表选项:
大值类型超出行数。值 1 表示 varbinary(max), xml 和表中的大型用户定义类型 (UDT) 列被存储出来 行,带有指向根的 16 字节指针。值为 0 表示 varchar(max)、nvarchar(max)、varbinary(max)、xml 和大 UDT 值 直接存储在数据行中,最大为 8000 字节,并且 只要该值可以放入记录中。如果值不合适 在记录中,指针存储在行内,其余的存储在行外 LOB 存储空间中的行数。 0 是默认值。
但是,当数据较小时,我们似乎失去了将数据保留在行中的选项。要么全进要么全出。有没有其他方法可以做到这一点?
【问题讨论】:
-
"in row" 是指存储在行中的字节数。如果数据大于 16,那么它将被存储在行外。
-
好吧,就我个人而言,我从不使用 VARCHAR(MAX),因为它不能作为索引等等。为什么不使用 VARCHAR(8000)?
-
1) 该字段永远不会被索引。 2)我想保持行大小尽可能小。此文本数据很少被查询。 varchar(8000) 会将所有文本保持在行中。较大的行 = 较慢的正常查询。
-
@johnnycrash 我认为您误解了问题中包含的文档。在这两个选项中,一个始终是行外的,另一个模拟以前的行为。它并不像你想象的那样总是在或总是在外面。
-
什么选项可以让我们设置字符数限制。超过该计数,数据存储在行外。低于或等于该计数的数据存储在行中。
标签: tsql varcharmax