SQL Server関連テーブルのGUIDからBigIntにプライマリキーを変更するためのアプローチ

StackOverflow https://stackoverflow.com/questions/2730305

質問

GUIDプライマリキーと、外部キーを介して関連する12のテーブルを備えた1,000万列の列を備えた2つのテーブルがあります。ベーステーブルには、それぞれ10〜20のインデックスがあります。

GUIDからBigintプライマリキーに移行しています。誰かがアプローチについて何か提案をしているのだろうかと思っています。今、これは私が熟考しているアプローチです:

  1. 関係するすべてのテーブルにすべてのインデックスとFKEYがドロップします。
  2. 各テーブルに「NewPrimaryKey」列を追加します
  3. 2つのベーステーブルで重要なアイデンティティを作成します
  4. スクリプトデータ変更 "テーブルxを更新、newprimarykey = yを設定するoldprimarykey = z
  5. オリジナルのプライマリキーを「oldprimarykey」に変更します
  6. 「NewPrimaryKey」列「PrimaryKey」の名前を変更します
  7. すべてのインデックスとfkeysをスクリプト化します

これは良いアプローチのように思えますか?誰かがこれに役立つツールやスクリプトを知っていますか?

TD:追加情報ごとに編集。 GUIDがプライマリである場合にアプローチに対処するこのブログ投稿を参照してください。 http://www.sqlmag.com/blogs/sql-server-questions-answered/sql-server-questions-answered/tabid/1977/entryid/12749/default.aspx

役に立ちましたか?

解決

確かにこの戦略は機能するように聞こえます - 制約をドロップし、列を下から変更します(タイプの変更、名前は同じままです)、そして制約を再現することはかなりエレガントです。

最終的にGUID列をドロップするという目標はありますか?もしそうなら、テーブルがコピーまたは再構築されない限り、実際にスペースを取り戻すことはありません。

...
4.データの変更 "テーブルxを更新、newprimarykey = yを設定しますoldprimarykey = z
5.落とす 「OldPrimaryKey」へのオリジナルのプライマリーキー
6.「NewPrimaryKey」列「PrimaryKey」を飾る
7.すべてのインデックスとfkeysをバックバックします(クラスター化されたインデックスの構築「再構築」テーブル)
8.インデックスがクラスター化されていないすべてのテーブルの場合、それらが再構築され、そのスペースが再生されることを確認するために何かをしてください(そのようなビルド、次にクラスター化されたインデックスをドロップします)

言うまでもなく、制作中に実行する前に開発ボックスでテストしてください!

他のヒント

あなたのアプローチは私がそれをする方法です。

あなたは本当にbigintが必要ですか?通常の4バイトINTは20億(2,147,483,647)になります。

int、bigint、smallint、およびtinyint

私も追加します:

開始する前に、適切な現在のバックアップがあることを確認してください。サーバーを変更してシングルユーザーモードで実行します(最初に停止期間をユーザーに通知します)。これが進行中にユーザーにデータを入力しようとしたくない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top