アーカイブに関する質問があります。
メインシステムから古いレコードをアーカイブするために使用される履歴DBがあり、アプリケーションはそれをクエリすることを認識しています
ただし、大きくなりすぎます。
履歴DBを再初期化したいのですが。私の考えは-一言で言えば:
このDBを閉じて、
読み取り専用にします。
名前を* oldに変更します
同様の履歴DB(同じ構造/テーブル)を作成します。
ビュー/シノニムの助けを借りて、アプリケーションはコードを変更せずに両方のDBのデータをクエリできるようになります。
私の質問は最後の部分についてです
それは機能しますか?
実際の元のテーブル名ではなく、デフォルトの移動先オブジェクト名となるビュー/シノニム(ビューはUNION ALLを使用して両方のテーブルDBを照会します)を作成できますか?
私たちの主な問題はバックアップです。アーカイブは毎日行われるため、このDBもバックアップする必要があります。また、巨大なDBであるため、時間とリソースが無駄になります。
ありがとう、ロニ。
読み取り専用データを使用するVLDBのバックアップサイズを削減する組み込みの方法は、大きなテーブルを分割し、古いパーティションを読み取り専用ファイルグループに配置してから、読み取り専用ファイルグループ(またはデータベース全体)のバックアップを頻繁に行わないようにすることです。読み取り/書き込みファイルグループの定期的なバックアップを使用します。次に、 Piecemeal Restore を実行できます。
[複数のデータベースでUNIONALLビューを使用する]は機能しますか?
はい。通常、アプリケーションが異常なことをしない限り、アプリケーションを変更せずにテーブルをビューに置き換えることができます。複数のデータベースにわたるUNIONALLビューは実際には同じように実行されないため、リスクはパフォーマンスにあります。
アーカイブデータベースの大きなテーブルで 列ストア圧縮 を使用してみてください。
実際の元のテーブル名ではなく、デフォルトの移動先オブジェクト名となるビュー/シノニム(ビューはUNION ALLを使用して両方のテーブルDBを照会します)を作成できますか?
はい、クロスデータベースクエリのビュー/シノニムを作成できます。
これを実装するときに頭に浮かぶいくつかの副作用は次のとおりです。
2つのデータベースの2つのテーブル間の制約/関係は機能しません。これにより、主キーが重複したり、外部キー参照が機能しなくなったりする可能性があります。
.。
2つのデータベース内の2つのテーブルのビューの例
CREATE VIEW [dbo].[maintable]
AS
SELECT id,val FROM [dbo].[maintable_v2] --new table
UNION ALL
SELECT id,val FROM [my_test_old].[dbo].[maintable_old]; --old table
新しいデータベースでこの新しく作成されたビューをクエリする
SELECT id,val
FROM [dbo].[maintable]
ORDER BY id;
結果
id val
1 oldvalue --old table
2 NewValue --new table
代替
最良の選択肢は David Browne-Microsoft の答えです。
それが選択肢ではない場合、これは最適ではない解決策です:
Read_writeファイルグループをバックアップするには:
BACKUP DATABASE DatabaseName READ_WRITE_FILEGROUPS
TO DISK = N'C:\SQLBackups\DatabaseBackup.bak';
これにより、Standard Editionで非履歴データベースを最初に復元し、履歴データベースの復元中にクエリでアクセスできるようにする場合に、複数のデータベースに分割する唯一の本当の利点が得られます。