Approche pour modifier la key primaire de GUID à BigInt dans les tables liées à SQL Server

J'ai deux tables avec 10-20 millions de lignes qui ont des keys primaires GUID et au less 12 tables liées via une key étrangère. Les tables de base ont 10-20 index chacune.

Nous passons du GUID aux keys primaires BigInt. Je me request si quelqu'un a des suggestions sur une approche. En ce moment, c'est l'approche que je réfléchis:

  1. Déposez tous les index et fkeys sur toutes les tables impliquées.
  2. Ajouter une colonne 'NewPrimaryKey' à chaque table
  3. Faire l'identité de la key sur les deux tables de base
  4. Script datatables changent "mettre à jour la table x, mettre NewPrimaryKey = y où OldPrimaryKey = z
  5. Renommez la key primaire d'origine en 'oldprimarykey'
  6. Renommez la colonne 'NewPrimaryKey' 'PrimaryKey'
  7. Script return tous les index et fkeys

Est-ce que cela semble être une bonne approche? Est-ce que quelqu'un connaît un outil ou un script qui pourrait aider à cela?

TD: Edité par informations supplémentaires. Voir ce billet de blog qui aborde une approche lorsque le GUID est le principal: http://www.sqlmag.com/blogs/sql-server-questions-answered/sql-server-questions-answered/tabid/1977/entryid/12749 /Default.aspx

    Il semble certainement que cette stratégie fonctionnerait – abandonner les contraintes, changer la colonne en dessous (changements de type, le nom rest le même), puis recréer les contraintes est assez élégant.

    L'objective est-il de supprimer les colonnes GUID? Si c'est le cas, vous ne récupérerez pas l'espace à less que les tables ne soient copiées ou reconstruites, donc peut-être l'ajustement suivant:


    4.Script datatables changent "mettre à jour la table x, définir NewPrimaryKey = y où OldPrimaryKey = z
    5. Déposez la key primaire d'origine sur 'oldprimarykey'
    6.Remarquez la colonne 'NewPrimaryKey' 'PrimaryKey'
    7.Script sauvegarder tous les index et fkeys (build des index clusterisés "reconstruit" des tables)
    8.Pour toutes les tables qui n'ont pas d'index clusterisés, faites quelque chose pour vous assurer qu'elles seront reconstruites et que leur espace sera récupéré (par exemple, comstackr et ensuite supprimer un index clusterisé)

    Inutile de dire, testez-le sur une boîte de dev avant de lancer la production!

    Votre approche est de savoir comment je le ferais.

    Avez-vous vraiment besoin de bigint? un int normal de 4 octets ira à 2 milliards (2 147 483 647).

    int, bigint, smallint et tinyint

    J'appendais aussi:

    Assurez-vous d'avoir une bonne sauvegarde en cours avant de commencer. Changez le server pour qu'il fonctionne en mode mono-user (notifiez d'abord les users d'une période de panne). Vous ne voulez pas que les users essaient d'entrer des données pendant que cela se passe.