Sql server 2008 varchar(max)无处不在?

Sql server 2008 varchar(max)无处不在?,sql-server-2008,varchar,Sql Server 2008,Varchar,将所有Sql Server 2008字符串列设置为varchar(max)是否有任何问题?我允许的字符串大小由应用程序管理。数据库应该只保留我给它的内容。在Sql Server 2008中,无论实际输入的数据大小如何,我都会将所有字符串列声明为varchar(max)类型,这会影响性能吗?Simon Sabin不久前曾就此写过一篇文章。我现在没有时间抓取它,但是你应该搜索它,因为他得出结论,默认情况下你不应该使用varchar(max) 编辑:Simon有一些关于varchar(max)的帖子。

将所有Sql Server 2008字符串列设置为varchar(max)是否有任何问题?我允许的字符串大小由应用程序管理。数据库应该只保留我给它的内容。在Sql Server 2008中,无论实际输入的数据大小如何,我都会将所有字符串列声明为varchar(max)类型,这会影响性能吗?

Simon Sabin不久前曾就此写过一篇文章。我现在没有时间抓取它,但是你应该搜索它,因为他得出结论,默认情况下你不应该使用varchar(max)


编辑:Simon有一些关于varchar(max)的帖子。下面评论中的链接很好地说明了这一点。我认为最重要的是,它讨论了varchar(max)对计划缓存的影响。总的原则是要小心。如果你不需要它是max,那么就不要使用max-如果你需要超过8000个字符,那么一定要。。。去做吧。

西蒙·萨宾(Simon Sabin)不久前曾就此写过一篇文章。我现在没有时间抓取它,但是你应该搜索它,因为他得出结论,默认情况下你不应该使用varchar(max)


编辑:Simon有一些关于varchar(max)的帖子。下面评论中的链接很好地说明了这一点。我认为最重要的是,它讨论了varchar(max)对计划缓存的影响。总的原则是要小心。如果你不需要它是max,那么就不要使用max-如果你需要超过8000个字符,那么一定要。。。去做吧。

理想情况下,你应该只允许你需要的东西。这意味着如果您确定某个特定列(比如用户名列)的长度永远不会超过20个字符,那么使用VARCHAR(20)和VARCHAR(MAX)可以让数据库优化查询和数据结构

从MSDN:


对于这些列,您真的会接近2^31-1字节吗?

理想情况下,您应该只允许您需要的内容。这意味着如果您确定某个特定列(比如用户名列)的长度永远不会超过20个字符,那么使用VARCHAR(20)和VARCHAR(MAX)可以让数据库优化查询和数据结构

从MSDN:


对于这些列,您真的会接近2^31-1字节吗?

对于一个列,索引的宽度不能超过900字节。因此,您可能永远无法创建索引。如果数据少于900字节,请使用varchar(900)

这是一个缺点:因为它会

  • 搜索性能非常差
  • 没有唯一的约束

一个索引的宽度不能超过900字节。因此,您可能永远无法创建索引。如果数据少于900字节,请使用varchar(900)

这是一个缺点:因为它会

  • 搜索性能非常差
  • 没有唯一的约束
通过使用
VARCHAR(MAX)
您基本上是在告诉SQL Server“在该字段中存储您认为最好的值”,然后SQL Server将选择是将值存储为常规
VARCHAR
还是LOB(大对象)通常,如果存储的值小于8000字节,SQL Server会将值视为常规
VARCHAR
类型。

如果存储的值太大,则允许列从页面溢出到LOB页面,与其他LOB类型(
text
ntext
image
)的情况完全相同-如果发生这种情况,则需要额外的页面读取来读取存储在额外页面中的数据(即,存在性能缺陷),但是,只有当存储的值太大时才会发生这种情况

事实上,在SQL Server 2008或更高版本下,即使使用固定长度的数据类型(例如
VARCHAR(3000)
),数据也可能溢出到其他页面上,但是这些页面称为行溢出数据页面,处理方式略有不同

简短版本:从存储的角度来看,对某些
N
使用
VARCHAR(MAX)
而不是
VARCHAR(N)
没有缺点

(请注意,这也适用于其他可变长度字段类型
NVARCHAR
VARBINARY

仅供参考-通过使用
VARCHAR(MAX)
您基本上是在告诉SQL Server“在该字段中存储您认为最好的值”,然后SQL Server将选择是将值存储为常规
VARCHAR
还是LOB(大对象)通常,如果存储的值小于8000字节,SQL Server会将值视为常规
VARCHAR
类型。

如果存储的值太大,则允许列从页面溢出到LOB页面,与其他LOB类型(
text
ntext
image
)的情况完全相同-如果发生这种情况,则需要额外的页面读取来读取存储在额外页面中的数据(即,存在性能缺陷),但是,只有当存储的值太大时才会发生这种情况

事实上,在SQL Server 2008或更高版本下,即使使用固定长度的数据类型(例如
VARCHAR(3000)
),数据也可能溢出到其他页面上,但是这些页面称为行溢出数据页面,处理方式略有不同

简短版本:从存储的角度来看,对某些
N
使用
VARCHAR(MAX)
而不是
VARCHAR(N)
没有缺点

(请注意,这也适用于其他可变长度字段类型
NVARCHAR
VARBINARY


仅供参考-您

我之前问过类似的问题。收到了一些有趣的回复。过来看 有一个网站有一个人谈论使用宽列的危害,但是如果你的数据在应用程序中受到限制,我的测试证明了这一点。 您不能在列上创建索引这一事实意味着我不会一直使用它们(我个人不会)
Variable-length, non-Unicode character data. n can be a value from 1 through 8,000. max indicates that the maximum storage size is 2^31-1 bytes.