web-dev-qa-db-ja.com

クラスター化された主キーを非クラスター化に変換し、クラスター化インデックスに別の列を使用する

クラスター化インデックスでもある主キー(GUID)を持つ大きなテーブルがあります。すでに整数列ベースのフィールドがあります。したがって、GUID=をPKのままにして、整数列をクラスター化インデックスにします。

元の制約を削除し、新しいPKと新しいクラスター化インデックスを作成する以外に、これを行う方法は考えられません。しかし、これには長い時間がかかり、収集したものからテーブルを2回再構築します。

停止できないため、テーブルの再構築(新規作成、データの移行、名前の交換)はできません。

何か案は?

バージョン:SQL Server 2008 Service Pack 2、Developer/Enterprise。

6
Rich

クラスター化インデックスをある列から別の列に移動するだけでなく、DROP_EXISTINGを使用して実行する必要のある作業量を減らすことができないため、この操作をオンラインで実行できるとは思いません。 。

ただし、作業を実行する意思がある場合は、停止を回避できます。

  1. 新しい構造で新しいテーブルを作成する
  2. 元のテーブルの名前を変更し、元の名前でビューを作成します-ビューは古いテーブルと新しいテーブルの結合になります-パフォーマンスは素晴らしいものではありませんが、オフラインにはなりません
  3. ビューにINSTEAD OFトリガーを作成して、古いテーブルまたは新しいテーブルにDMLを適用します
    • 挿入は新しいテーブルに移動する必要があります
    • アップデートは両方を試す必要があります
    • 削除は両方を試す必要があります
  4. 古いテーブルから新しいテーブルにチャンクで行をコピーします。 SET IDENTITY_INSERT ONが必要で、独自のトランザクションで各「チャンク」を実行する必要があります。
  5. 1つのトランザクションで、古いテーブルに新しいテーブルに存在しない行が含まれていない場合:
    • 古いテーブルを落とす
    • ビューをドロップ
    • 新しいテーブルの名前を変更する
10
Aaron Bertrand