在表中使用VARCHAR(MAX)有缺点吗?

时间:2010-04-03 20:57:02

标签: sql-server varchar nvarchar

这是我的困境。

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

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

6 个答案:

答案 0 :(得分:15)

听起来像你计划将varchar(MAX)数据类型用于其预期目的。

当MAX数据类型的数据超过8 KB时,使用溢出页面。 SQL Server 2005自动为页面分配一个溢出指示器,并且知道如何操纵数据行的方式与操作其他数据类型的方式相同。

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

答案 1 :(得分:8)

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

答案 2 :(得分:3)

前几天我刚看到this文章。它记录了varchar(n)列上varchar(max)相当小的性能滞后。可能还不足以让你有所作为。但如果确实如此,也许您可​​以使用单独的表来存储那些少量的大文本块。您的小文本可以保留在主表中,但您可以添加一个标记字段,告诉您在新表中查找大表。

答案 3 :(得分:3)

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

但通常情况下,如果表中有varchar(max)列,则不应该一直执行这些类型的操作,所以我要说如果你正确地使用它来满足表中的数据需求,那很好。

答案 4 :(得分:0)

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

答案 5 :(得分:-2)

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

相关问题