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