在SQL Server数据库中存储大字符串的最佳方法是什么?

9
我正在使用SQL Server 2005和2008 R2数据库,并且需要存储可能包含超过50,000个字符的大字符串。目前,我正在使用数据类型nvarchar(max)来存储更大的字符串。
我的问题是nvarchar(max)在数据库中占用更多的存储空间。我已经测试了100,000条记录,它需要约10 GB的内存来存储100,000条记录。
其中一个好处是,我不会将该列用于SQL Where查询目的,因此我已决定将数据存储为BLOB数据类型-nvarbinary(max)。通过这种方式,存储空间减少了50%,也就是说,需要约5 GB的内存来存储100,000条记录。
所以我的问题是,由于我不打算将此字符串数据用于SQL Where查询目的,我想以任何其他更好的方式存储它,以便数据库大小将减小到5 GB以下。
希望有人能提供更好的建议!

2
如果您不用那些数据进行查询,为什么要存储它们呢?更准确地说,您使用那些数据的目的是什么?是否真的有必要将其存储在数据库中(您可以将其存储在文件中并仅存储文件路径吗?) - Pred
好问题,我们的产品使用数据库而不是我的项目。该产品将仅由客户安装。因此,客户总是要求我们仅在数据库中存储数据,不要创建任何文件,以便他们可以轻松地维护数据库历史记录。 - Kevin M
我不仅会在SQL Where子句中使用Only,而且在需要时也会在Select子句中使用它。 - Kevin M
4
如果您要存储的是文本数据,请不要将其存储为Varbinary,这样会过于繁琐。如果以varbinary存储可以将存储空间减少50%,我假设这是非Unicode文本,并且很容易适应varchar(max)nvarchar是一个Unicode字符串,每个字符使用2个字节的存储空间。如果您使用varchar,每个字符只使用1个字节的存储空间(但您将无法在此列中存储阿拉伯语、希伯来语、中文、日语、韩语等文本)。 - marc_s
感谢您的帮助,Marc_s。 - Kevin M
1个回答

6
在 SQL Server 2008 中,您可以选择使用 FILESTREAM 存储大型二进制数据。在这种情况下,数据将在查询中可用,但实际上存储在文件系统中。
微软发布了一篇 SQL Server 技术文章,其中包含有关如何和何时使用 FILESTREAM 的有用信息。在第8页的比较图表中,显示出 如果存储的数据大于1MB,则 FILESTREAM 优势更大,相对于存储在数据库中的 BLOBs。 注意:FILESTREAM 在 SQL Server 2005 中不可用!(而Microsoft 不再支持 SQL Server 2005 - 除了扩展支持) 阅读更多文章

您可以在SQLSkills博客上看到一些关于其性能的比较图表。

此外,微软研究院发表了一篇技术文章:使用文件流还是不使用二进制大对象(BLOB),介绍关于文件流和BLOBS的内容。

您可以尝试一下,但通常需要运行一些特定环境的测试来确保此解决方案是否有效。如果这是市场上的产品,则最好将FILESTREAM支持实现为可选的功能。

仅供参考

NVARCHARVARBINARY大两倍,因为SQL Server在Unicode(NCHARNVARCHAR等)列中每个字符都使用两个字节进行存储。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接