在Sql Server中存储未指定长度的字符串的策略?
因此,一列将包含一些文本,这些文本之前我不知道该字符串的长度可以有多长。实际上,在95%的时间中,它的长度可能在100-500个字符之间,但是在一种情况下,它的长度可能是10000个字符。我无法控制此字符串的大小,用户也永远无法控制。除了varchar(max),你们发现还有哪些其他策略有用?还有varchar(max)的一些缺点?
解决方案
我使用的是sqlserver 2005中的Varchar(max)。
SqlServer怪异地处理大型字符串字段,因为如果我们指定" text"或者大型varchar(而不是max),则它将部分位存储在记录中,其余存储在外部。
据我所知,使用varchar(max)可以将所有内容存储在记录之外,这使其效率不如小文本输入。但是它比"文本"字段更有效,因为它不必通过内联获取一部分信息,而从指针获取其余信息则可以查找该信息两次。
我们是否考虑过使用BLOB类型?
另外,出于好奇,我们是否不控制字符串的大小,用户也不由谁控制?
nvarchar(max)绝对是我们最好的选择,因为我敢肯定我们知道它只会分配每行实际存储的数据所需的空间,而不是每行数据类型的实际最大值。
我唯一会看到的是,如果我们不断更新行,并且经常从少于8000个字节切换到大于8000个字节,在这种情况下,SQL将在每次访问时将存储更改为LOB并存储指向数据的指针超过8000个字节。在这种情况下,来回更改会很昂贵,但是在这种情况下,我们实际上没有任何其他选择,所以我觉得这是有争议的。
一种优雅但有效的方法是在表中包含两列,一列足够大以覆盖大多数情况的varchar,另一列为CLOB / TEXT类型以存储异常大的列。插入/更新时,我们可以获取字符串的大小,并将其存储在适当的列中。
就像我说的那样,虽然不漂亮,但是在大多数情况下,它会为我们提供varchar的性能,而在我们具有较大的值时不会中断。