2012-04-02 6 views
0

FileStreamを有効にしたテーブルがあります。新しいvarbinary列を作成し、それをファイルストリームに格納するように設定しました。その後、ファイル・システムにファイル・データをプッシュするために、既存の列からすべてのものを新しい列にコピーしました。filestreamが有効なヌルレコードのクエリ

これまでのところとても良いです。

しかし、この(稼働時間SLA)を実行中にDBをオフラインにすることはできず、の後にに入った7400のうち2つのレコードがありました。現在、2つの列:FileDataFileDataOldがあります。ここで、FileDataはファイルストリームに関連付けられています。

平均ファイルサイズは2MBを少し超えています。だから、私は行かなかったレコードを見つけることは非常に単純なSELECTステートメントを実行することを決めた:私はこのクエリを実行したとき

select DocumentId, FileName 
from docslist 
where FileData is null 

、CPUは80%に急上昇し、かなり長い間そこに座っていました。最終的に2分後に選択を殺したのは、それがちょっと気違いだったからです。これは、ほぼ瞬時に返す

select DocumentId, FileName from docslist 

は、私のような何かを実行する場合。

しかし、私がFileDataまたはFileDataOldがヌルであるところでクエリを試みると、すぐに永遠の土地に飛び出します。

リソースモニターを使用しているときに 'FileData is null'というクエリを実行すると、すべての単一のドキュメントからファイルシステムのすべてのバイトが読み込まれます。これはかなり奇妙です。その情報がテーブル自体の中に保存されると思います。

FileDataOld is nullを照会すると、テーブル全体(16GB)をメモリにロードしようとしているようです。

これをどのように改善できますか?私は、更新ステートメントの後に起こった2つのレコードを取得し、それらのドキュメントを強制的に移動する必要があります。

答えて

1

はあなたが行うことはできません。MDSNオン

select DocumentId, FileName from docslist WHERE DATALENGTH(FileData)>0 

をそれは言う:ので、これら

DATALENGTHはvarchar型、varbinary型、テキスト、画像、 nvarchar型、およびntextのデータ型で特に便利ですデータ型は可変長データ を格納できます。

NULLのDATALENGTHはNULLです。

リファレンスhere

+0

これは、ファイルストリームと同じことを行います。システム上のすべてのファイルを開きます。それは古い列で非常に速く実行されたので、これは問題の半分を解決します。 – NotMe

+0

これは問題の半分を解決したので私はあなたにこれを与え、私は他の問題に長い時間前に移動しました。 – NotMe

+0

Okey。私はあなたの問題を少しでも助けてくれることを願っています。おかげで仲間:P – Arion

関連する問題