FileStreamを有効にしたテーブルがあります。新しいvarbinary列を作成し、それをファイルストリームに格納するように設定しました。その後、ファイル・システムにファイル・データをプッシュするために、既存の列からすべてのものを新しい列にコピーしました。filestreamが有効なヌルレコードのクエリ
これまでのところとても良いです。
しかし、この(稼働時間SLA)を実行中にDBをオフラインにすることはできず、の後にに入った7400のうち2つのレコードがありました。現在、2つの列:FileData
とFileDataOld
があります。ここで、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つのレコードを取得し、それらのドキュメントを強制的に移動する必要があります。
これは、ファイルストリームと同じことを行います。システム上のすべてのファイルを開きます。それは古い列で非常に速く実行されたので、これは問題の半分を解決します。 – NotMe
これは問題の半分を解決したので私はあなたにこれを与え、私は他の問題に長い時間前に移動しました。 – NotMe
Okey。私はあなたの問題を少しでも助けてくれることを願っています。おかげで仲間:P – Arion