ゴーストクリーンアップの設定


10

高トランザクションデータベースを実行しています(平均で17.5万トランザクション/分、1時間あたり約900万レコードが追加および削除されます)。

750万件のレコードが追加および削除されたため、最近までこれはそれほど問題ではありませんでしたが、最新の大量のデータにより、ゴーストクリーンアップはクリーンアップに追いつくことができないようです。テーブル/インデックスの未使用スペース。

数日前に、16テーブル(主に2つ)全体で53 GBの「未使用スペース」に達したため、ゴーストクリーンアッププロセスの調査が始まり、5秒ごとに実行され、10ページ以上実行されることがわかりました。

私の現在の解決策は、早朝、次のコマンドの3つのスレッドを実行していることです。

DECLARE @2hours datetime = dateadd(hour,2,getutcdate())

WHILE getutcdate() < @2hours
BEGIN
    DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH  NO_INFOMSGS
END

前日の夜のバックログに追いつくため(ほとんどの削除が行われるとき)

デフォルトの設定を5秒と10ページから毎秒と言って変更したり、20ページを超えるようにしたりする方法はあるのでしょうか。それを行う方法はありますか。それとも、複数のクリーンアップ手順をスピンアップして、データ、またはこれを支援できる他のアクションがある場合

インデックスの再作成は、影響を受けるほとんどのインデックスに対して少なくとも週1回実行されます(ほとんどは隔日です)

AlwaysOn高可用性クラスター上のSQL Server 2012 Enterprise SP3_CU8(明日はCU9にアップグレード)もレプリケーション(別のサーバーに配布)あり

回答:


4

デフォルトの設定を5秒から10ページに変更して、毎秒と言ったり、20ページを超えるようにしたりする方法はないかと思います。

いいえ、ありません。少なくとも今のところ知りません:-)

これを助けることができる他のアクションがある場合

Paul Randalのブログから -人々が時々考える1つの方法は、テーブルまたはインデックススキャンを実行してゴーストクリーンアップにすべてをクリーンアップさせることです(したがって、ゴーストクリーンアップタスクのために削除されたすべてのレコードをキューに入れます)。

select * from [your_problem_table] with (index = Index_that_has_large_Deletes)

削除する代わりに、テーブルパーティション化して古いパーティションを削除する可能性はありますか?FYI .. SQL Server 2016以降では、個々のパーティションを切り捨てることもできます。

また、(テストおよび実装) - ゴーストクリーンアップ(トレースフラグ661)rebuild index WITH ONLINE = ON無効にしてから、Enterpriseエディションを使用しているため、オプションを無効にすることができます。

レプリケーションでAlwaysON(非同期)を使用している場合は、トレースフラグ1448を必ず有効にしてください。非同期のセカンダリレプリカが変更の受信を確認していなくても、レプリケーションログリーダーを前方に移動できます。

Paul WhiteのDeletes that Split Pages and Forwarded GhostsのDeletesを必ず読んで、テーブルにトリガーとなるか、遅くなるLOB列があるかどうかを確認してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.