2012-02-08 12 views
2

私は毎時挿入/更新する必要がある非正規化テーブルを作成しました。プロセスはむしろデータの観点から関与しているので、ユーザーを混乱させることなくテーブルを更新するための推奨方法を探しています。あるテーブルから別のテーブルにテーブル行を移動する最も効率的な方法

私のプロセスが挿入/更新したテーブルとは別のテーブルを作成していたら、その変更を私の実稼働テーブルにプッシュする方法が必要です。

どのような助けが素晴らしいでしょう!

+0

SQL Serverのどのバージョン/エディションですか? –

+0

SQL Server 2008 – Marco

+0

2008または2008 R2?どのエディション?標準、データセンター、Web、開発者などを意味する –

答えて

4

別の解決策は、複数のスキーマを使用して、スイッチ・カンガルーを再生することです。私は仕事でこのトリックをやっていたので、このメソッドを好むだけでした。オブジェクトの名前を変更すること(抑制することはできません)に関する警告メッセージは、履歴ログをいっぱいにしていました。基本的には、2つの追加スキーマが必要です(テーブルのコピーを一時的に保持するスキーマと、キャッシュされたコピーを保持するスキーマ)。今

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の新しいコピーを検索することができますが、私が言ったように、これはalmosです瞬間的なので、並行性に違いがあると私は驚いています。

ここでもcache.tableを任意で切り捨てることができますが、データの変更を比較したり、何か問題が発生した場合にトラブルシューティングを行うために、常に値を保持しています。ステップ1の所要時間に応じて、最初から再投入するよりも逆に転送を実行するほうが速い場合があります。

名前を変更すると、実際のテーブルに移動すると統計情報が失われたり、名前に固執したりしないなど、このプロセスから厄介なことが起こる可能性があります。リネームのように、これをテストしたいと思うでしょう。レポート表にアクセスするためのRCSI。

2

あなたが言及したそのテンポラリテーブルでそれを行い、それをプロダクションテーブル名に変更するだけです(ただし、プロダクションテーブルの名前を変更する)。その後、元の生産テーブルを削除することができます。もちろん、トランザクション内でそのすべてを実行する必要があります。

だから、それは次のようになります。

-- Fill tmpTable 
-- 

-- Do renaming 
begin tran t1; 
execute sp_rename 'productionTable', 'productionTableBackup'; 
execute sp_rename 'tmpTable', 'productionTable'; 
commit tran t1; 
関連する問題