web-dev-qa-db-ja.com

FILESTREAMおよびBLOBファイルについて教えてください

これは私にとって本当に混乱するトピックです。

BLOBが理解でき、簡単に使用できます。 FILESTREAMとは何か理解できます。データベースに簡単に実装でき、データベースをバックアップして、これらのファイルを格納するために作成されたフォルダーを使用してデータベースを復元できます。このようなことはよく理解できると思います。

私が得ないものは:

  1. データベースにVARBINARY(MAX)列だけを使用して_.PDF_を挿入することと、この_.PDF_をFILESTREAMデータベースに格納することの違いは何ですか。 BLOB varbinary(max)を使用すると、_.PDF_がデータベース内にあることがわかります。 _.PDF_を物理的に削除した場合でも、varbinary(MAX)列内に格納されている値を使用して復元できますか?

  2. この_.PDF_ファイルをファイルストリームに挿入すると、フォルダー(ファイルグループ用に作成されたファイル)内に表示されます。100ファイルを挿入すると、ファイルストリームフォルダー内に100ファイルが表示されますが、実行すると_DELETE FROM_およびデータベースの100行を削除しても、filestreamフォルダーにこれらのファイルが表示されます。なぜこれが起こるのですか?一貫性を保つために、これらのファイルも削除されると思いました。

  3. どちらの場合でも、BLOB VARBINARY(MAX)またはFILESTREAM内に_.PDF_ファイルを挿入した後も、元のファイルは必要ですか?データベース内なので、簡単に復旧できます。

例として.PDFを使用しています

私は両方のアプローチを使用して実装できますが、それらがどうなるかはまだはっきりしていません。私にとっては同じですが、1つはデータベースの外部に保存され、もう1つはデータベースの内部に保存されます。

5
Racer SQL

whitepaper に基づき、Paul Randalによって書かれました-

  • 256キロバイト(KB)未満のBLOB(ウィジェットアイコンなど)は、データベース内に保存する方が適切です。
  • 1メガバイト(MB)を超えるBLOBは、データベースの外部に格納するのが最適です
  • 256 KBから1 MBのサイズの場合、より効率的なストレージソリューションは、データの読み取りと書き込みの比率、および「上書き」の速度に依存します。データベース内にのみBLOBデータを格納する(たとえば、varbinary(max)データ型を使用する)ことは、BLOBあたり2ギガバイト(GB)に制限されています。

あなたの質問に答える:

(たとえば)データベースにVARBINARY(MAX)列だけを使用して.PDFを挿入することと、この.PDFをFILESTREAMデータベースに格納することの違いは何ですか。 BLOB varbinary(max)を使用すると、.PDFがデータベース内にあることがわかります。 .PDFを物理的に削除した場合でも、varbinary(MAX)列に格納されている値を使用して復元できますか?

PDFをSINGLE_BLOBとしてデータベースに挿入すると、元の.pdfファイルは不要になります。後で必要になった場合は、エクスポートできます。

この.PDFファイルをファイルストリームに挿入すると、フォルダー(ファイルグループ用に作成されたもの)内に表示されます。100ファイルを挿入すると、ファイルストリームフォルダー内に100ファイルが表示されますが、DELETE FROMを実行すると、データベース内の100行を削除しても、これらのファイルはfilestreamフォルダーに表示されます。なぜこれが起こるのですか?一貫性を保つために、これらのファイルも削除されると思いました。

File Streamsは ガベージコレクションプロセス を使用して、不要になったファイルをクリーンアップします。システムタスクは定期的に起動し(約10秒程度)、ファイルストリームのガベージコレクションの必要性をチェックします。 「なぜすべてのファイルが収集されないのですか?」を読んでください。

危険:ファイルストリームコンテナーから直接ファイルを削除すると、データベースの破損と見なされ、dbcc checkdbは破損エラーを報告します。これらのファイルはトランザクションの方法でデータベースにリンクされており、ファイルの削除はデータベース内の破損したページと同じです。

-

どちらの場合でも、.PDFファイルをBLOB VARBINARY(MAX)またはFILESTREAM内に挿入した後も、元のファイルが必要ですか?

BLOB Varbinary(max)の場合->元のファイルを削除できます。 Filestreamの場合、filestreamフォルダーからファイルを削除しないでください。元のファイルがfilestreamフォルダーと同じフォルダーにない場合は、削除できます。

参照:

4
Kin Shah