FILESTREAM のベスト プラクティス
ここでは、FILESTREAM の使用に関して推奨されるベスト プラクティスについて説明します。
物理的な構成と保守
FILESTREAM ストレージ ボリュームを設定する場合は、次のガイドラインを考慮してください。
FILESTREAM コンピュータ システム上で短いファイル名を無効にします。短いファイル名の作成には、長い時間がかかります。短いファイル名を無効にするには、Windows fsutil ユーティリティを使用します。
FILESTREAM コンピュータ システムを定期的に最適化します。
64 KB の NTFS クラスタを使用します。圧縮されたボリュームは、4 KB の NTFS クラスタに設定する必要があります。
FILESTREAM ボリューム上のインデックスの作成を無効にし、disablelastaccess を設定します。disablelastaccess を設定するには、Windows fsutil ユーティリティを使用します。
必要でない場合は、FILESTREAM ボリューム上でのウイルス スキャンを無効にします。ウイルス スキャンが必要な場合は、問題のあるファイルを自動的に削除するポリシーを設定しないようにします。
RAID レベルを設定および調整して、フォールト トレランスとアプリケーションで求められるパフォーマンスを実現します。
RAID レベル |
書き込みパフォーマンス |
読み取りパフォーマンス |
フォールト トレランス |
解説 |
RAID 5 |
普通 |
普通 |
非常に良い |
パフォーマンスは、1 台のディスクまたは JBOD よりも高く、RAID 0 またはストライピング機能を備えた RAID 5 よりも低くなります。 |
RAID 0 |
非常に良い |
非常に良い |
なし |
|
RAID 5 + ストライピング |
非常に良い |
非常に良い |
非常に良い |
最も高価なオプションです。 |
物理的なデータベース設計
FILESTREAM データベースを設計するときは、次のガイドラインを考慮してください。
FILESTREAM 列には対応する uniqueidentifier ROWGUID 列が存在する必要があります。また、この種のテーブルには、一意なインデックスが存在する必要があります。通常、このインデックスは、クラスタ化インデックスではありません。データベースのビジネス ロジックでクラスタ化インデックスが求められる場合は、インデックスに格納されている値がランダムでないことを確認する必要があります。格納されている値がランダムである場合、テーブルの行が追加または削除されるたびにインデックスの並べ替えが発生します。
パフォーマンス上の理由から、FILESTREAM ファイル グループおよびコンテナは、オペレーティング システム、SQL Server データベース、SQL Server ログ、tempdb、ページング ファイル以外のボリュームに配置する必要があります。
領域管理とポリシーは、FILESTREAM では直接サポートされません。ただし、それぞれの FILESTREAM ファイル グループを別個のボリュームに割り当て、ボリュームの管理機能を使用することで、領域の管理とポリシーの適用を行うことができます。
アプリケーションの設計と実装
FILESTREAM を使用するアプリケーションの設計と実装を行う場合は、次のガイドラインを考慮してください。
初期化されていない FILESTREAM 列を表すには、0x の代わりに NULL を使用します。0x 値を使用するとファイルが作成されますが、NULL の場合はファイルが作成されません。
null でない FILESTREAM 列を含むテーブルでは、挿入操作と削除操作をしないでください。挿入操作および削除操作を行うと、ガベージ コレクション用の FILESTREAM テーブルが変更される場合があります。その結果、アプリケーション パフォーマンスが時間と共に低下する可能性があります。
レプリケーションを使用するアプリケーションでは、NEWID() の代わりに NEWSEQUENTIALID() を使用します。このようなアプリケーションでは、GUID の生成に関して NEWID() よりも NEWSEQUENTIALID() の方が高いパフォーマンスを発揮します。
FILESTREAM API は、データへの Win32 ストリーミング アクセス向けに設計されています。Transact-SQL を使用して 2 MB を超える FILESTREAM バイナリ ラージ オブジェクト (BLOB) の読み取り/書き込みを行わないでください。Transact-SQL から BLOB データの読み取り/書き込みを行う必要がある場合は、Win32 から FILESTREAM BLOB を開く前にすべての BLOB データを必ず使用してください。すべての Transact-SQL データが使用されていない場合、後続の FILESTREAM を開く操作または閉じる操作が失敗しることがあります。
FILESTREAM BLOB の更新や FILESTREAM BLOB の後または前にデータを追加する Transact-SQL ステートメントは使用しないようにします。そのような操作を行うと、BLOB データが tempdb データベースにスプールされ、新しい物理的ファイルに戻される可能性があります。
小さな BLOB 更新を FILESTREAM BLOB に追加しないようにします。追加操作ごとに、基になる FILESTREAM ファイルがコピーされます。アプリケーションで小さな BLOB を書き込む必要がある場合は、BLOB を varbinary(max) 列に書き込んでおき、BLOB の数があらかじめ設定された制限に達したときに FILESTREAM BLOB に対して 1 回の書き込み操作を行います。
アプリケーションで大量の BLOB ファイルのデータ長を取得しないようにします。サイズは SQL Server データベース エンジンに格納されないため、この操作を実行するには多くの時間が必要になります。BLOB ファイルの長さを調べる必要がある場合は、Transact-SQL DATALENGTH() 関数を使用して BLOB のサイズを調べます (BLOB が閉じている場合)。DATALENGTH() でサイズを取得する際には、BLOB ファイルは開かれません。
アプリケーションで Message Block1 (SMB1) プロトコルを使用する場合、60 KB 単位で FILESTREAM BLOB データを読み取ると、パフォーマンスが最適化されます。