6

GUID 主キーを持つ 1000 万から 2000 万行の 2 つのテーブルと、少なくとも 12 のテーブルが外部キーを介して関連付けられています。ベース テーブルには、それぞれ 10 ~ 20 のインデックスがあります。

GUID から BigInt プライマリ キーに移行しています。誰かがアプローチに関する提案を持っているかどうか疑問に思っています。今考えている方法は次のとおりです。

  1. 関連するすべてのテーブルのすべてのインデックスと fkey を削除します。
  2. 各テーブルに「NewPrimaryKey」列を追加します
  3. 2 つのベース テーブルでキー ID を作成する
  4. データ変更のスクリプトを作成する "テーブル x を更新し、NewPrimaryKey = y を設定します。ここで、OldPrimaryKey = z
  5. 元の主キーの名前を「oldprimarykey」に変更します
  6. 「NewPrimaryKey」列の名前を「PrimaryKey」に変更します
  7. すべてのインデックスと fkey をスクリプトで戻す

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

TD: 追加情報ごとに編集。GUID がプライマリである場合のアプローチに対処するこのブログ投稿を参照して ください。 /Default.aspx

4

3 に答える 3

3

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

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

int、bigint、smallint、tinyint

于 2010-04-28T14:29:52.200 に答える
0

この戦略は確かに機能するように思えます-制約を削除し、その下から列を変更し(型の変更、名前は同じままです)、制約を再作成することはかなりエレガントです。

最終的に GUID 列を削除することが目標ですか? その場合、テーブルがコピーまたは再構築されない限り、実際にスペースを再利用することはないため、次の調整が必要になる可能性があります。

...
4. データ変更のスクリプトを作成します。"update table x, set NewPrimaryKey = y where OldPrimaryKey = z
5.元の主キーを「oldprimarykey」にドロップ
します。 6. 「NewPrimaryKey」列の名前を「PrimaryKey」
に変更します。および fkeys (クラスター化インデックスを構築すると、テーブルが「再構築」
されます)

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

于 2010-04-28T14:36:42.143 に答える
0

私も追加します:

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

于 2010-04-28T14:45:50.023 に答える