SQL Server 2008 FILESTREAM

varbinary(MAX) 型のフィールドの中身を、NTFSファイルシステム上の1ファイルとして保存して管理する仕組み。WinFSのなれの果てらしい。

[フィールド名].PathName() とやって問い合わせると、UNCパスが得られる。しかしこの FILESTREAM用UNCパス をコマンドプロンプトで直接指定し、dirとやってもアクセス拒否されてしまう。

UNCパスの形式は \\[マシン名]\[SQLインスタンス名]\v1\[データベース名]\[スキーマ名]\[テーブル名]\[Guid] になっていた。

一方、データベースに対してファイルの置場を指定するのだが、実際にその下を確認してみると、2レベルのGuidフォルダを作成した後に、レコードのGuidとは*別のファイル名*でファイルが生成される。少なくともトランザクション関係で一つのGuidに対して複数のファイルを生成する必要がある関係で、レコードのGuidで直接ファイルを生成することができないのだろう。

また、共有フォルダのフォルダパスをコンピュータの管理で調べてみると、\\?\GLOBALROOT\Device\RsFx0102\<localmachine>\MSSQLSERVER となっており、ファイルアクセスについて特別なドライバを利用していることが見て取れる。

このようにWin32APIでアクセスできるとはいっても、通常のファイルと同様に扱えるわけではないのだが、.NET Framework SqlFileStream クラス 経由のアクセスをする分には普通の Stream であり、巨大なデータの扱いについて、比較的簡単に高パフォーマンスなプログラムを作成できるはず。特に Stream – Stream でのデータ転送にすれば、全データを一度に取り込む必要がなくなるところが嬉しい。

SQL Server の観点から言えば、image型とvarbinary(MAX)型のいいとこ取りといったところか。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。