行数が5Mから1.5Gのテーブルがいくつかあります
各テーブルにはBLOBフィールドがあり、そのサイズは100バイトから30 Mバイトまで変化し、「行外の大きな値タイプ」= ONとして保存されます。
テーブルは異なるファイルグループに格納され、3〜4個のファイルがそれぞれ異なるディスク@異なるLUN @非常に高速なSAN
これらのテーブルは毎日、サイズが5〜100 Gbで、60万〜150万行に拡大します。
2週間から6か月まで変化する一定の時間が経過すると、行の一部が削除されるかアーカイブDBに移動されるため、6か月以上前の作業テーブルには行がありません。
サーバーの現在の構成:
- SQLサーバーエンジンは2008 R2 SP1 Enterprise @ 24コア、@ 64Gb RAM
- SQL Serverは、追加の起動フラグを使用して実行されます。
-T 3640; (ストアドプロシージャのステートメントごとにクライアントにDONE_IN_PROCメッセージを送信する必要がありません。これは、SET NOCOUNT ONのセッション設定に似ていますが、トレースフラグとして設定されると、すべてのクライアントセッションがこのように処理されます)
-T 1118;(tempDBの割り当てを一度に1pg(最初の8ページ)から1エクステントに切り替えます。)
-T 2301;(意思決定支援クエリに固有の高度な最適化を有効にします。このオプションは、大規模なデータセットの意思決定支援処理に適用されます)
-T 1117;(すべてのデータファイルを一度に成長させます。それ以外の場合は順番に進みます。)
-E; (ファイルグループ内の各ファイルに割り当てられるエクステントの数を増やします。このオプションは、インデックスまたはデータスキャンを実行するユーザーの数が限られているデータウェアハウスアプリケーションに役立ちます)
-T 834; (SQL Serverはバッファプール用に割り当てられたメモリのためのWindowsの大きなページの割り当てを使用するようにします http://msdn2.microsoft.com/en-us/library/aa366720.aspx、 http://support.microsoft。 com / kb / 920093)
- SQL Serverはラージページ拡張機能を使用します
- SQL Serverは高速ファイル初期化オプションを利用します
- AUTOSHRINKはすべてのデータベースでオフです
問題がある -サーバーの稼働時間のいくつかの点から、(数日から数ヶ月まで)を開始することをGHOST CLEANUP
プロセスが強制的にクリーンアップをうまくし、単にその通常の仕事をすることを拒否-数秒で複数のページクリーンアップ(which is seen thru Extended Events
である)、適切ではない、ので、削除されたすべての行をクリーンアップすることはできません
問題はSQL Server 2005 RTM Enterpriseの時代から続く
問題を解決しようとした方法:
- テーブルのクラスター化インデックスでSCAN操作を強制しようとしました
- テーブルのクラスター化インデックスのBLOB列のすべての内容を含むSCAN操作を強制しようとしました
- システムsp_clean_db_free_space&sp_clean_db_file_free_space
- DB内のすべてのファイルおよびページのdbcc cleanpage(@ dbid、@ fileid、@ page)を手動で
- クラスタ化インデックスの再構築と再編成
- データベースの再作成
DBCC FORCEGHOSTCLEANUP
クエリを実行すると:
select * from sys.dm_db_index_physical_stats(db_id(), object_id('ProblemTable'), 1, 0, 'detailed')
数百万および数千万のゴーストレコードが表示されますが、LOB_DATAの割り当てユニットタイプのみ
唯一のものは、それが役立ちます:
- SHUTDOWNコマンドを使用してサーバーを停止するか、ホスト全体を再起動します-再起動後、GHOST CLEANUPプロセスが数時間実行され、実際にすべてのゴーストレコードが消去されます
- EMPTYFILEオプションを指定したDBCC SHRINKFILE-すべてのデータをあるファイルから他のファイルまたは新しく作成したファイルに移動すると、このファイルのゴーストレコードのみがクリーンアップされます-問題は、シュリンク操作が本当に嫌いということです。これには1つのファイルで3〜4日かかります
質問 - サーバーのダウンタイムが許容できない場合でもコストがかかりすぎるため、サーバーのダウンタイムなしでGHOST CLEANUPを強制するプログラム(推奨)またはメンテナンスの方法はありますか-1時間あたり数千から数万ドル
私の問題は同様に気づかれました:
- http://support.microsoft.com/kb/932115
- http://www.sqlservercentral.com/Forums/Topic496244-149-1.aspx
そして同じことがここにあります: