所以一个专栏会保留一些文字,事先我不知道这个字符串的长度是多长。实际上,95%的时间,它可能在100-500个字符之间,但可能有一个案例,它将10000个字符长。我无法控制此字符串的大小,也从不对用户进行控制。除了varchar(max)之外,你们发现了哪些其他策略有用?还有什么varchar(max)的缺点?
答案 0 :(得分:6)
我在sqlserver 2005中使用Varchar(max)。
SqlServer奇怪地处理大字符串字段,因为如果指定“text”或大varchar而不是max,它会将部分位存储在记录中,其余部分存储在外部。
据我所知,使用varchar(max)它会将整个内容存储在记录之外,这使得它比小文本输入效率低。但它比“文本”字段更有效,因为它不需要通过获取内联部分来查找该信息2次,其余部分来自指针。
答案 1 :(得分:2)
一种不优雅但有效的方法是在表中有两列,一个是足以覆盖大多数情况的varchar,另一个是CLOB / TEXT类型,用于存储特别大的列。插入/更新时,您可以获取字符串的大小,并将其存储在相应的列中。
就像我说的那样,并不漂亮,但它可以为大多数情况提供varchar的性能,而不会在你有更大的值时破坏。
答案 2 :(得分:1)
您是否考虑过使用BLOB类型?
另外,出于好奇,你是不是控制字符串的大小,用户也不控制谁?
答案 3 :(得分:1)
nvarchar(max)绝对是你最好的选择 - 因为我确定你知道它只会分配你每行实际存储数据所需的空间,而不是每行数据类型的实际最大值。
唯一可以看到的是,如果你不断更新一行并且它从少于8000个字节切换到>通常在8000字节的情况下,SQL会将存储更改为LOB,并在超过8000字节时存储指向数据的指针。在这种情况下来回改变会很昂贵,但在这种情况下我没有任何其他选择,我可以看到 - 所以这是一个没有实际意义的点。