FILESTREAM の概要

データの多くは、テキスト ドキュメント、イメージ、ビデオなどの非構造化データです。こうした非構造化データは、多くの場合、構造化データとは別にデータベースの外部に格納されます。この分離は、データ管理の複雑化の原因になります。また、データを構造化ストレージに関連付ける場合は、ファイル ストリーミングの機能やパフォーマンスが制限されることがあります。

FILESTREAM は、varbinary(max) BLOB (バイナリ ラージ オブジェクト) データをファイル システム上のファイルとして格納することにより、SQL Server データベース エンジンと NTFS ファイル システムを統合します。これにより、Transact-SQL ステートメントによる FILESTREAM データの挿入、更新、クエリ、検索、およびバックアップや、Win32 ファイル システム インターフェイスによるデータへのストリーミング アクセスが可能になります。

FILESTREAM では、NT システム キャッシュを使用してファイル データをキャッシュします。これにより、FILESTREAM データがデータベース エンジンのパフォーマンスに与える影響を軽減できます。SQL Server のバッファー プールは使用されないため、そのメモリはクエリの処理に使用できます。

注意

FILESTREAM データは、透過的なデータ暗号化が有効になっている場合でも暗号化されません。

FILESTREAM の使用方法を示すチュートリアルについては、「FILESTREAM ストレージの概要」を参照してください。

FILESTREAM を使用する場合

SQL Server では BLOB を、データをテーブルに格納する標準の varbinary(max) データとして使用することも、データをファイル システムに格納する FILESTREAM varbinary(max) オブジェクトとして使用することもできます。データベース ストレージとファイル システム ストレージのどちらを使用するかは、データのサイズと用途によって決まります。次の条件が true の場合は、FILESTREAM を使用することを検討する必要があります。

  • 格納するオブジェクトの平均的なサイズが 1 MB より大きい。

  • 高速な読み取りアクセスが重要とされる。

  • アプリケーション ロジックに中間層を使用するアプリケーションを開発している。

比較的小さなオブジェクトの場合は、varbinary(max) BLOB をデータベースに格納する方が一般に高いストリーミング パフォーマンスが得られます。

FILESTREAM ストレージ

FILESTREAM ストレージは、データを BLOB としてファイル システムに格納する varbinary(max) 列として実装されます。BLOB のサイズはファイル システムのボリューム サイズによってのみ制限されます。ファイル システムに格納される BLOB には、標準の varbinary(max) の制限 (ファイル サイズ 2 GB) は適用されません。

列のデータをファイル システムに格納するように指定するには、varbinary(max) 列で FILESTREAM 属性を指定します。これにより、その列のすべてのデータがファイル システム (データベース ファイル以外の場所) に格納されるようになります。

FILESTREAM データは FILESTREAM ファイル グループに格納する必要があります。FILESTREAM ファイル グループは特殊なファイル グループで、ファイルそのものではなくファイル システム ディレクトリが含まれます。これらのファイル システム ディレクトリは、データ コンテナーと呼ばれます。データ コンテナーは、データベース エンジン ストレージとファイル システム ストレージの間のインターフェイスです。 

FILESTREAM ストレージを使用する際は、以下の点を考慮してください。

  • テーブルに FILESTREAM 列が含まれている場合には、各行に NULL でない一意の行 ID が必要です。

  • FILESTREAM データ コンテナーを入れ子にすることはできません。

  • フェールオーバー クラスタリングを使用している場合は、FILESTREAM ファイル グループが共有ディスク リソース上に存在する必要があります。

  • FILESTREAM ファイル グループは、圧縮されたボリューム上にあってもかまいません。

セキュリティの統合

SQL Server の FILESTREAM データは、その他のデータと同じように、テーブルまたは列のレベルで権限を与えることによってセキュリティで保護されます。テーブルの FILESTREAM 列に対する権限を持つユーザーは、関連付けられているファイルを開くことができます。

注意

FILESTREAM データでは暗号化はサポートされていません。

FILESTREAM コンテナーへの NTFS アクセス許可が与えられるのは、SQL Server サービス アカウントが実行されているアカウントだけです。その他のアカウントにはデータ コンテナーに対するアクセス許可を与えないようにすることをお勧めします。

管理の統合

FILESTREAM は varbinary(max) 列として実装され、直接データベース エンジンに統合されているため、SQL Server の管理ツールや関数のほとんどを FILESTREAM データで使用できます。FILESTREAM データに変更を加える必要もありません。たとえば、すべてのバックアップ モデルと復旧モデルを FILESTREAM データで使用できるため、FILESTREAM データをデータベースの構造化データと共にバックアップできます。FILESTREAM データをリレーショナル データと共にバックアップしない場合は、部分バックアップを使用して FILESTREAM ファイル グループを除外できます。

BLOB データにアクセスするための 2 つのプログラミング モデル

FILESTREAM 列にデータを格納した後、それらのファイルにアクセスするには、Transact-SQL トランザクションか Win32 API を使用します。

Transact-SQL アクセス

Transact-SQL を使用して、FILESTREAM データの挿入、更新、および削除を行うことができます。 

  • 挿入操作を使用すると、null 値、空の値、または比較的短いインライン データを FILESTREAM フィールドに事前設定することができます。ただし、大量のデータをファイルにストリーミングする場合は、Win32 インターフェイスを使用する方が効率的です。

  • FILESTREAM フィールドを更新すると、その基となるファイル システムの BLOB データが変更されます。FILESTREAM フィールドを NULL に設定すると、フィールドに関連付けられている BLOB データが削除されます。UPDATE**.**Write() として実装されている Transact-SQL の大量の更新を使用してデータの部分更新を実行することはできません。

  • FILESTREAM データを含む行を削除したり、FILESTREAM データを含むテーブルを削除したり切り捨てたりすると、その基となるファイル システムの BLOB データが削除されます。

ファイル システム ストリーミング アクセス

Win32 のストリーミング サポートを SQL Server トランザクションのコンテキストで使用できます。トランザクション内で、まず、FILESTREAM 関数を使用してファイルの論理 UNC ファイル システム パスを取得します。次に、OpenSqlFilestream API を使用してファイル ハンドルを取得します。そのハンドルを Win32 ファイル ストリーミング インターフェイス (ReadFile()WriteFile() など) で使用することにより、ファイル システム経由でファイルにアクセスしてファイルを更新できます。 

ファイル操作はトランザクション処理なので、ファイル システムを通じて FILESTREAM ファイルを削除したりその名前を変更したりすることはできません。

ステートメント モデル

FILESTREAM のファイル システム アクセスは、ファイルのオープンとクローズを使用して Transact-SQL ステートメントを実現しています。ファイル ハンドルを開くとステートメントが開始され、ハンドルを閉じると終了します。たとえば、書き込みハンドルを閉じると、UPDATE ステートメントが完了したときのように、テーブルに登録されている AFTER トリガーが起動します。

ストレージの名前空間

FILESTREAM では、データベース エンジンが BLOB の物理ファイル システムの名前空間を制御します。新しい組み込み関数の PathName を使用すると、テーブルの各 FILESTREAM セルに対応する BLOB の論理 UNC パスを取得できます。アプリケーションでは、この論理パスを使用して Win32 ハンドルを取得し、標準の Win32 ファイル システム インターフェイスを使用して BLOB データを操作します。この関数は、FILESTREAM 列の値が NULL の場合は NULL を返します。

ファイル システム アクセスのトランザクション処理

新しい組み込み関数の GET_FILESTREAM_TRANSACTION_CONTEXT() を使用すると、セッションが関連付けられている現在のトランザクションを表すトークンを取得できます。このトランザクションは、既に開始され、まだ中止もコミットもされていないトランザクションである必要があります。アプリケーションでは、トークンを取得することにより、FILESTREAM のファイル システム ストリーミング操作を、既に開始されているトランザクションにバインドできます。この関数は、明示的に開始されたトランザクションがない場合は NULL を返します。

トランザクションをコミットしたり中止したりする前にすべてのファイル ハンドルを閉じる必要があります。トランザクションのスコープを超えてもハンドルが開いたままになっていると、そのハンドルに対するその後の読み取りが失敗します。そのハンドルに対するその後の書き込みは成功しますが、ディスクに実際のデータが書き込まれません。同様に、データベース エンジンのデータベースやインスタンスがシャットダウンすると、開いているハンドルはすべて無効になります。

トランザクションの持続性

FILESTREAM では、トランザクションのコミット時に、ファイル システム ストリーミング アクセスから変更された FILESTREAM BLOB データのトランザクションの持続性がデータベース エンジンによって確保されます。

リモート クライアントからのライトスルー

FILESTREAM データへのリモート ファイル システム アクセスは、サーバー メッセージ ブロック (SMB) プロトコルによって実現されます。クライアントがリモート クライアントの場合は、書き込み操作がクライアント側でキャッシュされず、常にサーバーに送信されます。サーバー側でデータをキャッシュできます。リモート クライアントで実行されるアプリケーションでは、小さな書き込み操作を統合して、大きなデータ サイズを使用して書き込み操作を減らすことをお勧めします。

FILESTREAM ハンドルを使用してメモリ マップ表示 (メモリ マップ I/O) を作成することはできません。FILESTREAM データに対してメモリ マッピングを使用すると、データベース エンジンでデータの一貫性および持続性やデータベースの整合性を保証できなくなります。

Windows ロゴ認証

FILESTREAM RsFx ドライバーは、Windows Server 2008 R2 での動作が保証されています。詳細情報およびカタログ ファイルのダウンロードについては、Microsoft ダウンロード センターの「SQL Server 2008 R2 FILESTREAM ドライバーの Windows ロゴ認証」を参照してください。