FILESTREAMは、2008年にMicrosoftによって導入されました。目的は、非構造化ファイルをより効果的に保存および管理することでした。 FILESTREAMが導入される前は、SQLサーバーにデータを格納するために次のアプローチが使用されていました。
- 非構造化ファイルは、SQLServerテーブルのVARBINARY列またはIMAGE列に格納できます。このアプローチは、トランザクションの一貫性を維持し、ファイル管理の複雑さを軽減するのに効果的ですが、クライアントアプリケーションがSQLテーブルからデータを読み取る場合、SQLメモリを使用するため、パフォーマンスが低下します。
- ファイル全体をSQLテーブルに格納する代わりに、非構造化ファイルの物理的な場所をSQLテーブルに格納します。このアプローチによりパフォーマンスが大幅に向上しますが、トランザクションの一貫性が保証されるわけではなく、ファイル管理も困難でした。
FILESTREAM機能は、BLOBファイルをNTファイルシステムに格納し、トランザクションの一貫性を維持できるため、非常に効果的です。クライアントアプリケーションは、SQL Serverバッファのメモリを使用する代わりに、FILESTREAMコンテナからデータを読み取るときに、パフォーマンスを向上させるNtheTシステムキャッシュを使用します。
FILESTREAMはデータ型ではありません。これは、VARBINARY(MAX)列に割り当てることができる属性です。 VARBINARY(MAX)列がFILESTREAM属性に割り当てられている場合、それはFILESTREAM列と呼ばれます。 FILESTREAM列に格納されているデータは、NTシステムにディスクファイルとして格納され、ファイルのポインタはテーブルに格納されます。 FILESTREAM属性が割り当てられたVARBINARY(max)列には、テーブルに2GBを格納するという制限はありません。したがって、巨大なファイルも保存できます。
この記事では、次のように説明します。
- FILESTREAM機能を有効にする方法。
- FILESTREAMファイルグループとFILESTREAMデータコンテナを作成および構成する方法。
- FILESTREAM対応テーブルのデータを保存してアクセスする方法。
デモ:
このデモでは、以下を使用します:
- データベースサーバー :SQL Server 2017
- ソフトウェア :SQL Server Management Studio
- データベース :FileStream_Demo
SQLServerデータベースでFILESTREAMアクセスを構成する
SQL ServerでFileStreamを構成するには、SQLServerに次の変更を加えます。
- SQLServer構成マネージャーからFILESTREAM機能を有効にします。
- SQLServerインスタンスでFILESTREAMアクセスレベルを有効にします。
- BLOBデータを格納するためのFILESTREAMファイルグループとFileStreamコンテナを作成します。
FILESTREAM機能を有効にする
任意のデータベースでFileStreamを有効にするには、最初にSQLServerインスタンスでFileStream機能を有効にします。これを行うには、SQL Server構成マネージャーを開き、[SQLインスタンス]を右クリックして、[プロパティ]を選択します。 、次の画像に示すように:
サーバーのプロパティを構成するためのダイアログボックスが開きます。 FILESTREAMに切り替えます タブ。 T-SQLアクセスでFILESTREAMを有効にするを選択します 。 I/OアクセスにFILESTREAMを有効にするを選択します 次に、[リモートクライアントによるFILESTREAMデータへのアクセスを許可する]を選択します。 。 Windows共有名 テキストボックスに、ファイルを保存するディレクトリの名前を入力します。次の画像を参照してください:
[OK]をクリックして、SQLサービスを再起動します。
SQLServerインスタンスでFILESTREAMアクセスレベルを有効にする
FILESTREAM機能を有効にしたら、FILESTREAMアクセスレベルを変更します。 FileStreamアクセスレベルを変更するには、次のクエリを実行します。
EXEC sp_configure filestream_access_level, 2 RECONFIGURE
上記のクエリでは、以下のパラメータは有効な値です:
0はを意味します SQLインスタンスのFILESTREAMサポートは無効になっています。
1はを意味します T-SQLのFILESTREAMサポートが有効になっています。
2はを意味します T-SQLおよびWin32ストリーミングアクセスのFILESTREAMサポートが有効になっています。
SQL Server Management Studioを使用して、FILESTREAMアクセスレベルを変更できます。これを行うには、SQLServer接続を右クリックして>>プロパティを選択します>> [サーバーのプロパティ]ダイアログボックスで、[FileStreamアクセスレベル]を選択します ドロップダウンボックスから、[フルアクセス有効]を選択します 、次の画像に示すように:
パラメータを変更したら、SQLServerサービスを再起動します。
FILESTREAMファイルグループとデータファイルを追加する
FILESTREAMを有効にしたら、FILESTREAMファイルグループとFILESTREAMコンテナを追加します。
これを行うには、FileStream-デモを右クリックします データベース>>プロパティを選択します>>データベースのプロパティの左側のペイン ダイアログボックスで、ファイルグループを選択します>> FILESTREAMグリッドで、ファイルグループの追加をクリックします ボタン>>ファイルグループにダミードキュメントという名前を付けます 。次の画像を参照してください:
ファイルグループが作成されたら、[データベースのプロパティ]ダイアログボックスで、[ファイル]を選択します。 [追加]ボタンをクリックします。データベースファイルグリッドが有効になります。 [論理名]列に名前を入力します–ダミー-ドキュメント 。 ファイルタイプでFILESTREAMデータを選択します ドロップダウンボックス。 ダミー-ドキュメントを選択します ファイルグループ 桁。 パス内 列に、ファイルが保存されるディレクトリの場所(E:\ Dummy-Documents)を指定します。次の画像を参照してください:
または、次のT-SQLクエリを実行して、FILESTREAMファイルグループとコンテナを追加することもできます。
USE [master] GO ALTER DATABASE [FileStream_Demo] ADD FILEGROUP [Dummy-Documents] CONTAINS FILESTREAM GO ALTER DATABASE [FileStream_Demo] ADD FILE ( NAME = N'Dummy-Documents', FILENAME = N'E:\Dummy-Documents' ) TO FILEGROUP [Dummy-Documents] GO
FileStreamコンテナが作成されたことを確認するには、Windowsエクスプローラを開き、「E:\Dummy-Document」ディレクトリに移動します。
上の画像に示されているように、$FSLOGディレクトリとfilestream.hdr ファイルが作成されました。 $ FSLOGは、SQLサーバーのT-Log、および filestream.hdrに似ています。 FILESTREAMのメタデータが含まれています。これらのファイルを変更または編集しないでください。
SQLテーブルにファイルを保存する
このデモでは、コンピューターからのさまざまなファイルを格納するためのテーブルを作成します。テーブルには次の列があります:
- 「ルートディレクトリ 」列にファイルの場所を保存します。
- 「ファイル名 」列にファイル名を保存します。
- 「FileAttribute 」列にファイル属性(Raw /Directory。 )を格納します
- 「FileCreateDate 」列にファイル作成時間を保存します。
- 「FileSize 」列にファイルのサイズを保存します。
- 「FileStreamCol 」列には、ファイルの内容をバイナリ形式で保存します。
FILESTREAM列を使用してSQLテーブルを作成する
FILESTREAMを構成したら、FILESTREAM列を使用してSQLテーブルを作成し、SQLサーバーテーブルにさまざまなファイルを格納します。上で述べたように、FILESTREAMはデータ型ではありません。これは、FILESTREAMが有効なテーブルのvarbinary(max)列に追加する属性です。 FILESTREAM対応のテーブルを作成するときは、必ず UNIQUEIDENTIFIERを追加してください。 ROWGUIDCOLがある列 および一意 属性。
次のスクリプトを実行して、FILESTREAM対応のテーブルを作成します。
Use [FileStream_Demo] go Create Table [DummyDocuments] ( ID uniqueidentifier ROWGUIDCOL unique NOT NULL, RootDirectory varchar(max), FileName varchar(max), FileAttribute varchar(150), FileCreateDate datetime, FileSize numeric(10,5), FileStreamCol varbinary (max) FILESTREAM )
テーブルにデータを挿入
WorldWide_Importors.xlsがあります コンピュータの「E:\Documents」の場所に保存されているドキュメント。 OPENROWSET(Bulk)を使用します コンテンツをディスクからVARBINARY(max)にロードします 変数。次に、変数を FileStreamColに保存します DummyDocumen の(VARBINARY(max))列 tテーブル。これを行うには、次のスクリプトを実行します。
Use [FileStream-Demo] Go DECLARE @Document AS VARBINARY(MAX) -- Load the image data SELECT @Document = CAST(bulkcolumn AS VARBINARY(MAX)) FROM OPENROWSET( BULK 'E:\Documents\WorldWide_Importors.xls', SINGLE_BLOB ) AS Doc -- Insert the data to the table INSERT INTO [DummyDocuments] (ID, RootDirectory,FileName, FileAttribute, FileCreateDate,FileSize,FileStreamCol) SELECT NEWID(), 'E:\Documents','WorldWide_Importors.xls','Raw',getdate(),10, @Document
FILESTREAMデータへのアクセス
FILESTREAMデータには、T-SQLとマネージドAPIを使用してアクセスできます。 T-SQLクエリを使用してFILESTREAM列にアクセスすると、SQLメモリを使用してデータファイルの内容を読み取り、データをクライアントアプリケーションに送信します。 Win32マネージAPIを使用してFILESTREAM列にアクセスする場合、SQLServerメモリは使用されません。 NTファイルシステムのストリーミング機能を使用して、パフォーマンスを向上させます。
T-SQLを使用してFILESTREAMデータにアクセスする
記事の冒頭で述べたように、FILESTREAMは、varbinary(max)データ型を持つテーブル列に割り当てられた属性であるため、テーブルの他の列と同じようにアクセスできます。テーブルのすべての情報とともにFILESTREAMデータを取得するには、以下のクエリを実行します
Use [FileStream-Demo] go select RootDirectory,FileName,FileAttribute,FileCreateDate,FileSize,FileStreamCol from DummyDocumentsを使用します
クエリの出力は次のとおりです。
上の画像に示されているように、「WorldWide_Importors.xls」ドキュメントは「FileStreamCol」列に格納されているBLOBに変換されています。
マネージAPIを使用してFILESTREAMデータにアクセスする
Win32 APIを使用してFILESTREAMにアクセスすると、パフォーマンスやその他の利点が得られますが、構文がT-SQL構文とは異なり、難しいため、データへのアクセスが困難になります。まず、FILESTREAMデータストアでファイルを見つけるには、FILESTREAMデータストア内のファイルを一意に識別するための論理パスを特定する必要があります。 Pathname()を使用してこれを行うことができます FILESTREAM列のメソッド。大文字と小文字が区別されます。
ファイルのパスを取得した後、アクセスするには、トランザクションの開始を使用してトランザクションコンテキストを取得する必要があります 方法。トランザクションコンテキストが取得されると、 SQLFileStreamを使用してそれにアクセスできます。 クラス。
以下のコードは、 WorldWide_Importors.xlsへのローカルパスを取得します FILESTREAMデータストア内のドキュメント。
SELECT RootDirectory, FileName, FileAttribute, FileCreateDate, FileSize, FileStreamCol.PathName() AS FilePath FROM DummyDocuments
クエリ出力:
FILESTREAMコンテナからファイルを削除する
ファイルの削除は簡単です。 FILESTREAMが有効なSQLテーブルからファイルを削除するには、削除クエリを実行する必要があります。レコードがテーブルから削除されていても、ファイルはFILSTREAMデータストアで物理的に利用可能になります。ガベージコレクタによって削除されます。ガベージコレクタプロセスは、チェックポイントイベントが発生したときに実行されます。明示的なチェックポイントを指定することで、テーブルから削除した直後にチェックポイントを削除できます。
SQLテーブルからファイルを削除するクエリ:
Use [FileStream_Demo] go delete from DummyDocuments where ID='0D640ABC-8CF1-41E0-9FA8-28171047129F'
概要
この記事では、以下について説明しました:
- FILESTREAMの紹介とそのメリットは何ですか。
- SQLサーバーインスタンスでFILESTREAM機能を有効にする方法。
- FILESTREAMデータストアとファイルグループを作成および構成します。
- FILESTREAMデータストアからファイルの挿入と削除を実行します。
今後の記事で説明します:
- FILESTREAM対応データベースをバックアップおよび復元する方法。
- FILESTREAMテーブルでのレプリケーションとテーブル分割の設定。
しばらくお待ちください!