34

这是我的困境。

基本上,我需要表格中的一列来容纳未知长度的字符。但我很好奇在 Sql Server 中使用列中的 VARCHAR(MAX) 或 NVARCHAR(MAX) 是否会出现性能问题,例如:“这次”我只需要存储 3 个字符,而且大多数时候我只需要存储 10 个字符。但是有一个很小的机会,它可能会在该列中达到几千个字符,甚至可能是一百万个,这是不可预测的。但是,我可以保证它不会超过 2GB 的限制。

我只是好奇是否存在任何性能问题,或者可能有更好的方法来解决这个问题。

4

6 回答 6

15

在我看来,您打算将 varchar(MAX) 数据类型用于其预期目的。

当 MAX 数据类型中的数据超过 8 KB 时,将使用溢出页面。SQL Server 2005 自动为页面分配一个溢出指示符,并且知道如何像操作其他数据类型一样操作数据行。

如需进一步阅读,请查看联机丛书:char 和 varchar

于 2010-04-03T21:05:40.570 回答
10

您不能在varchar(max)( 和nvarchar(max)) 列(尽管它们可以包含在其中。但是谁会在索引中包含可能达到 2GB 的列?!)所以如果你想搜索这个值,你每次都会进行扫描,除非你使用 full-文本索引。此外,请记住,任何报表设计者或演示设计者(网络或其他)都必须假设有人可能会将百科全书放入该列并围绕它进行设计。没有什么比听到“用户可能不会做 X”更糟糕的了。如果用户可以做到,他们就会做到。如果用户可以将一本书放入一列中,那么在某些时候他们会这样做。如果他们永远不应该,那么 IMO,将列大小限制在某个合理的水平更有意义,如果用户试图在允许的列中填充更多内容,则会引发关于他们是否应该将该值输入的讨论第一列。

于 2010-04-03T21:52:12.227 回答
4

前几天刚看到这篇文章。它记录了 varchar(max) 相对于 varchar(n) 列的相当小的性能滞后。可能不足以为您带来改变。但如果是这样,也许您可​​以使用单独的表来存储这几个大文本块。您的小文本可以保留在主表中,但您可以添加一个标志字段来告诉您在新表中查找大文本。

于 2010-04-03T21:14:37.433 回答
4

我已经看到了一些问题 - 特别是标量函数(但这些通常很糟糕,无论如何)返回 varchar(MAX) 然后不重新转换。例如,假设您有一个特殊函数 CleanString(somevarcharmax) 返回 varchar(max) 并在 varchar(50) 上调用它,但不要 CAST(CleanString(varchar10col) AS varchar(10)) - 讨厌的性能问题。

但通常,当您在表中有 varchar(max) 列时,您不应该大量执行这些类型的操作,所以我会说如果您正确使用它来满足表中的数据需求,那就没问题了.

于 2010-04-03T21:57:29.663 回答
1

Crystal Reports 12(和其他版本,据我所知)不能正确处理 varchar(max) 并将其解释为 varchar(255) ,这会导致报告中的数据被截断。

因此,如果您使用的是 Crystal Reports,那是 varchar(max) 的一个缺点。准确地说,还是使用 Crystal 的缺点。

见:
http ://www.crystalreportsbook.com/Forum/forum_posts.asp?TID=5843&PID=
17503 http://michaeltbeeitprof.blogspot.com/2010/05/crystal-xi-and-varcharmax-aka-memo.html

于 2010-09-01T13:30:49.407 回答
-3

不,varchar(max) 会根据条目的大小进行自我调整,因此如果您将使用各种大小的输入,它是最有效的。

于 2010-04-03T21:09:50.780 回答