这里是我的困境。
基本上,我需要在一个表中的一列中存储未知长度的字符。但我好奇在Sql Server中,在一个列中使用VARCHAR(MAX)或NVARCHAR(MAX)会出现性能问题,比如:“这次”我只需要存储3个字符,大部分时间我只需要存储10个字符。但有很小的可能性它可以在那一列中达到几千个字符,甚至可能有一百万个字符,这是不可预测的。但我可以保证它不会超过2GB的限制。
我只是好奇是否存在任何性能问题,或者是否有更好的解决问题的方法。
这里是我的困境。
基本上,我需要在一个表中的一列中存储未知长度的字符。但我好奇在Sql Server中,在一个列中使用VARCHAR(MAX)或NVARCHAR(MAX)会出现性能问题,比如:“这次”我只需要存储3个字符,大部分时间我只需要存储10个字符。但有很小的可能性它可以在那一列中达到几千个字符,甚至可能有一百万个字符,这是不可预测的。但我可以保证它不会超过2GB的限制。
我只是好奇是否存在任何性能问题,或者是否有更好的解决问题的方法。
听起来你打算使用varchar(MAX)数据类型来实现其预期用途。
当MAX数据类型中的数据超过8 KB时,会使用溢出页。SQL Server 2005会自动为页面分配一个溢出指示器,并知道如何处理数据行,就像处理其他数据类型一样。
如需进一步阅读,请查看Books Online:char和varchar
在varchar(max)
(和nvarchar(max)
)列上无法创建索引(虽然它们可以包含在其中。但是,谁会在索引中包含一个最大可达到2GB的列呢?!)因此,如果您想要搜索这个值,每次都需要进行扫描,除非您使用全文本索引。此外,请记住,任何报表设计师或演示文稿设计师(Web或其他方式)都必须假设某人可能会将百科全书放入该列并设计环绕它。没有比听到“用户可能不会做X”更糟糕的事情了。如果用户能够做到,他们就会这样做。如果用户可以把一部著作放入某一列中,则在某个时刻,他们将会这样做。如果他们永远不应该这样做,则我认为,在某个合理的水平上限制列大小,并且如果用户试图将超过允许范围的值填入该列,这将引发一场讨论,讨论是否应该首先将该值输入该列。
我刚刚看到了this篇文章。它记录了varchar(max)列相对于varchar(n)列的一些性能差异,但这些差异可能不足以对您产生影响。但如果有影响,也许您可以使用单独的表来存储那些大文本块。您的小文本可以留在主表中,但您可以添加一个标志字段,告诉您在新表中查找大文本块。
See:
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