3

私たちのデータベースは挿入集約型(1泊あたり200〜500k)ですが、更新ライト(おそらく1日あたり数百)です。

挿入された行自体へのすべての変更の履歴を無期限に保存する必要があります(実際の挿入ではありません)。Change Data Captureを使用したいのですが、これをサポートするために必要な容量が利用できません。次のいずれかを実行することができれば、私の生活ははるかに楽になります。

1)変更データの追跡をUPDATESとDELETESのみに制限します。2)CDCテーブルからのINSERTSのみを定期的にクリーンアップします。

以前は、トリガーを使用していました(まだテーブルから外れていません!)。

4

2 に答える 2

3

トリガーを使用して、更新と削除をキャプチャします。

CDCにどのDMLに注意を払うべきかを伝えることはできないと思います。また、CDCにこれらの挿入をすべて記録させて、後で削除するだけにするのは非常に無駄だと思います。それ自体は高価であり、それが引き起こす断片化は、キャプチャテーブルに対して実行するクエリ(ほとんど空のページがたくさんある)の問題を引き起こすだけでなく、作業統計が常に行う必要があります統計を最新の状態に保ちます。

キャプチャテーブルに挿入トリガーの代わりにトリガーを配置することもできますが、それは何もしませんが、許可されているかどうかを確認するためにこれを実行しようとはしていません。また、それがどのような影響を与えるかはわかりません。 CDC機能。調査する価値があるかもしれませんが、このハックが機能したとしても、私の元の答えはまだ有効です。トリガーを使用するだけです。

于 2012-09-11T22:01:53.243 に答える
1

スペースを考慮する場合は、CDCテーブルをいつでも割り当てて、別のサーバーに存在する可能性のある別のファイルグループで作業することができます。あなたはこのようにそれをするでしょう:

 ALTER DATABASE YourDatabase
 ADD FILEGROUP [cdc_ChangeTables];
 go

 --this step requires going on to somewhere on your hard drive and creating a folder
 ALTER DATABASE YourDatabase
 ADD FILE ( NAME = N'cdc_ChangeTables',
            FILENAME = N'E:\NameOfFolderYouSetUp\YourDatabase_cdc_ChangeTables.mdf',
            SIZE = 1048576KB,
            FILEGROWTH = 102400KB )
 TO FILEGROUP [cdc_ChangeTables];
 GO

次に、CDCテーブルを設定する場合は、代わりにそのファイルグループに向けます。

EXEC sys.sp_cdc_enable_table
    @source_schema = N'dbo',
    @source_name = N'TableYouWantToCapture',
    @role_name = N'cdc_admin',
    @filegroup_name = N'cdc_ChangeTables', --this is where you name the filegroup from previous step
    @supports_net_changes = 1,  
    @capture_instance = N'dbo_TableYouWantToCapture',
    @captured_column_list = 'ColumnName1, ColumnName2'; --comma-delimited list of column names
GO

更新/削除のみを照会する場合は、次のようなシステム関数を使用できます。

SELECT * 
FROM cdc.fn_cdc_get_all_changes_dbo_TableYouWantToCapture(@from_lsn, @to_lsn, N'all update old')
WHERE __$operation IN (1,3,4)
于 2017-03-31T00:48:56.183 に答える