我正在使用SQL Server 2005和2008 R2数据库,我需要存储可能包含超过5万个字符的大字符串。目前我使用数据类型nvarchar(max)
来存储更大的字符串。
我对nvarchar(max)
的问题是它需要更多的数据库存储空间。我已经测试了 100000 记录,并且需要 10 GB 内存来存储 100000 记录。
这里有一个好处是,我不会将此列用于SQL Where
查询目的,因此我决定将数据存储为BLOB
数据类型 - nvarbinary(max)
。通过这种方式,存储内存减少了50%,这意味着需要 5 GB 内存来存储 100000 记录。
所以我的问题,因为我不打算将此字符串数据用于SQL Where
查询目的,我想以任何其他更好的方式存储它,以便数据库大小将减少到 5 GB 。
答案 0 :(得分:5)
在SQL Server 2008中,您可以选择使用FILESTREAM
来存储大型二进制数据。在这种情况下,数据将在查询中可用,但物理存储在文件系统中。
Microsoft发布了SQL Server Technical Article,其中包含有关如何以及何时使用FILESTREAM
的有用信息。在第8页,比较图表显示,如果存储的数据大于1MB , FILESTREAM优于存储在数据库中的BLOB。
注意 FILESTREAM在SQL Server 2005中不可用! (和SQL Server 2005 is no longer supported by Microsoft - 除了扩展支持外)
还有一些要阅读的文章
您可以在SQLSkills blog上看到有关其效果的一些比较图表。
微软研究院也发布了关于文件流和BLOBS的Technical Article: To BLOB or Not To BLOB。
您可以尝试一下,但是一如既往,您必须运行一些特定于环境的测试以确保此解决方案有效。如果这是市场上的产品,最好将FILESTREAM支持作为选择加入或选择退出功能实施。
只是旁注
NVARCHAR
是VARBINARY
的两倍,因为SQL Server将每个字符存储在unicode(NCHAR
,NVARCHAR
等)列中的2个字节上。