sql >> データベース >  >> RDS >> Sqlserver

テーブル行をあるテーブルから別のテーブルに移動する最も効率的な方法

    もう 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。



    1. Androidルーム+ウィンドウ関数

    2. ストアド プロシージャのパラメーター名を検索する

    3. vb6のDatagridの他の列に基づいてアクセスから対応するレコードを表示する方法

    4. MySQLに接続すると、エラーが発生しますデータソース名が見つからず、デフォルトのドライバが指定されていません