请赐教有关 FILESTREAM 和 BLOB 文件的信息

Rac*_*SQL 5 sql-server sql-server-2008-r2 filestream blob varbinary

这对我来说真的是一个令人困惑的话题。

我可以理解 BLOB 是什么,我可以轻松使用它。我能理解 FILESTREAM 是什么。我可以轻松地在数据库中实现,我可以备份数据库并使用为存储这些文件而创建的文件夹来恢复它。像这样的事情,我想,我能理解。

我不明白的是:

  1. .PDF仅使用数据库中的 VARBINARY(MAX) 列插入(例如)与将其存储.PDF在 FILESTREAM 数据库中有什么区别。我知道 BLOB varbinary(max).PDF是在数据库内部。如果我物理删除.PDF,我仍然可以使用存储在 varbinary(MAX) 列中的值来恢复它吗?

  2. 当我在.PDF文件流中插入这个文件时,我可以在文件夹中看到它(为文件组创建的那个),如果我插入 100 个文件,我可以在文件流文件夹中看到 100 个文件,但是当我运行DELETE FROM并删除 100 行时数据库,我仍然可以在文件流文件夹中看到这些文件。为什么会发生这种情况?我认为,为了保持一致性,这些文件也会被删除。

  3. 对于这两种情况,在.PDFBLOBVARBINARY(MAX)或 FILESTREAM 中插入文件后,我还需要原始文件吗?因为它在数据库中,所以我可以很容易地恢复它。

我以 .PDF 为例

我可以使用和实施这两种方法,但我仍然不清楚它们会发生什么。对我来说,它是一样的,但是一个存储在数据库之外,另一个存储在数据库内。

Kin*_*hah 4

基于Paul Randal 撰写的白皮书-

\n\n
    \n
  • 小于 256 KB(例如小部件图标)的 BLOB 最好存储在数据库中。
  • \n
  • 大于 1 兆字节 (MB) 的 BLOB 最好存储在数据库外部
  • \n
  • 对于大小在 256 KB 到 1 MB 之间的数据,更高效的存储解决方案取决于数据的读写比率以及 \xe2\x80\x9coverwrite\xe2\x80\x9d 的速率。仅在数据库中存储 BLOB 数据(例如,使用 varbinary (max) 数据类型)每个 BLOB 的大小限制为 2 GB。
  • \n
\n\n

回答您的问题:

\n\n
\n

仅使用数据库中的 VARBINARY(MAX) 列插入 .PDF(例如)与将此 .PDF 存储在 FILESTREAM 数据库中之间有什么区别。我知道 BLOB varbinary(max) .PDF 位于数据库内部。如果我物理删除 .PDF,我仍然可以使用 varbinary(MAX) 列中存储的值来恢复它吗?

\n
\n\n

将 pdf 作为 插入数据库后SINGLE_BLOB,您就不需要原始.pdf文件了。以后需要的话可以导出来。

\n\n
\n

当我在文件流中插入这个 .PDF 文件时,我可以在文件夹(为文件组创建的文件夹)中看到它,如果我插入 100 个文件,我可以在文件流文件夹中看到 100 个文件,但是当我运行 DELETE FROM 和删除数据库中的 100 行,我仍然可以在 filestream 文件夹中看到这些文件。为什么会出现这种情况?我认为,为了保持一致性,这些文件也将被删除。

\n
\n\n

文件流使用垃圾收集过程来清理不再需要的文件。系统任务会定期(约 10 秒左右)唤醒并检查文件流垃圾收集需求。阅读“为什么没有收集所有文件?”

\n\n
\n

危险:直接从文件流容器中删除文件会被视为数据库损坏,并且 dbcc checkdb 将报告损坏错误。这些文件以事务方式链接到数据库,删除文件与数据库中损坏的页面相同。

\n
\n\n

-

\n\n
\n

对于这两种情况,在 BLOB VARBINARY(MAX) 或 FILESTREAM 中插入 .PDF 文件后,我是否仍然需要原始文件?

\n
\n\n

对于BLOB Varbinary(max) --> 可以删除原文件。对于 Filestream,请勿从 filestream 文件夹中删除文件。如果原始文件与文件流文件夹不在同一文件夹中,则可以将其删除。

\n\n

参考 :

\n\n\n