もう 1 つの解決策は、複数のスキーマを使用してスイッチ ア ルーをプレイすることです。私がこの方法を好むのは、仕事でこのトリックを使用したことがあり、オブジェクトの名前変更に関する警告メッセージ (抑制できない) が履歴ログをいっぱいにしていたからです。基本的に、2 つの追加スキーマが必要です (1 つはテーブルのコピーを一時的に保持するため、もう 1 つはキャッシュされたコピーを保持するためです)。
CREATE SCHEMA cache AUTHORIZATION dbo; CREATE SCHEMA hold AUTHORIZATION dbo;
プレ>次に、キャッシュ スキーマにテーブルの模倣を作成します。
SELECT * INTO cache.table FROM dbo.table WHERE 1 = 0; -- then create any indexes etc.
プレ>データを更新する時が来たら:
-- step 1: TRUNCATE TABLE cache.table; -- (if you need to maintain FKs you may need to delete) INSERT INTO cache.table SELECT ... -- step 2: -- this transaction will be almost instantaneous, -- since it is a metadata operation only: BEGIN TRANSACTION; ALTER SCHEMA hold TRANSFER dbo.table; ALTER SCHEMA dbo TRANSFER cache.table; ALTER SCHEMA cache TRANSFER hold.table; COMMIT TRANSACTION;
プレ>理論的には、ユーザーができるため、最後の送金をトランザクションから外すことができます。 2 回目の転送後に dbo.table の新しいコピーのクエリを開始しますが、前述したように、これはほぼ瞬時に実行されるため、同時実行性に違いが見られる場合は驚くでしょう。
オプションで
cache.table
を切り詰めることもできます 繰り返しになりますが、データの変更を比較したり、問題が発生した場合にトラブルシューティングしたりできるように、常にデータを入力し続けました。ステップ 1 にかかる時間によっては、転送を逆方向に実行する方が、最初から再入力するよりも速い場合があります。名前の変更と同様に、このプロセスから、実際のテーブルと一緒に移動するときに統計が失われ、名前に固執しないなど、奇妙なことが発生する可能性があります。名前の変更と同様に、これをテストして、分離レベルをいじってみたいと思うかもしれません。レポート テーブルにアクセスするための RCSI。