2009-08-20 4 views
4

J'ai une table qui a 40millions d'enregistrements.Combien de temps faut-il pour créer une colonne d'identité?

Quoi de mieux (plus rapide)? Créer une colonne directement dans cette table ou créer une autre table avec la colonne d'identité et insérer des données de la première?

Si je crée une colonne d'identité dans la table contenant 40 millions d'enregistrements, est-il possible d'estimer combien de temps faut-il pour la créer?

+0

Je dois savoir, parce que j'ai créé la colonne d'identité depuis 16 heures ... et pas encore fini ... – Zanoni

+0

22 heures et en comptant ... – Zanoni

+0

wow. Faites-nous savoir quand/si cela se termine. Je suis curieux de voir ce qui se passe ici. – user158017

Répondre

0

Si vous avez utilisé ALTER TABLE [...] ADD ... dans une fenêtre de requête, il est assez rapide, en fait, il aurait fini depuis longtemps. Si vous avez utilisé le concepteur de table Management Studio, il copie la table dans une nouvelle table, en supprimant l'ancienne, puis en renommant la nouvelle table en tant qu'ancienne table. Cela prendra du temps, surtout si vous n'avez pas pré-développé la base de données et le journal pour prendre en charge l'espace supplémentaire requis. Parce que c'est une transaction unique, il faudrait environ 16 heures supplémentaires pour revenir en arrière si vous l'arrêtez maintenant.

+0

J'ai utilisé ALTER TABLE ... ADD ... – Zanoni

+0

Est-ce que le querry bloqué ou le macking progressent? Cela semble trop long. check wait_time et wait_resource est sys.dm_exec_requests –

+0

@Remus Rusanu => La requête est toujours en cours, mais je ne sais pas où est le problème. >>> wait_time = 0, wait_resource = 31: 1: 1219931, status = SUSPENDU, commande = ALTER TABLE, wait_type = PAGEIOLATCH_EX total_elapsed_time = 86053703 – Zanoni

0

N'est-ce pas quelque chose que vous n'aurez à faire qu'une seule fois, et par conséquent, n'est-ce pas vraiment un problème combien de temps cela prend-il? (En supposant que cela ne prenne pas de jours ...)

+2

J'ai besoin de savoir, parce que j'ai créé la colonne d'identité depuis 16 heures ... et pas encore fini ... – Zanoni

+2

@Zanoni: Sonner comme un bon moment pour prendre un jour de congé . –

+0

@New en ville: ou pas ... – Zanoni

0

Ne pouvez-vous pas créer une copie de test de la base de données et créer la colonne sur cela pour voir combien de temps cela prend-il?

+0

il est déjà en cours d'exécution. il veut savoir si cela va finir, ou si quelque chose ne va pas. – geowa4

+0

J'ai répondu avant que nous le sachions tous, alors oui, nous le savons maintenant. –

+0

C'est une question difficile, on pourrait éventuellement annuler/arrêter le script et essayer une base de données de test? Ou encore, testez-le en parallèle pour voir si le test fonctionne plus rapidement, indiquant que quelque chose s'est mal passé? La base de données fonctionne-t-elle pour l'application? –

2

Ce genre de dépend. La création d'une colonne d'identité ne prendra pas tant de temps (bon ok c'est relatif à la taille de la table), en supposant que vous l'ayez ajouté à la fin de la table. Si ce n'est pas le cas, le serveur doit créer une nouvelle table avec la colonne d'identité à l'emplacement souhaité, exporter toutes les lignes vers la nouvelle table, puis modifier le nom de la table. Je suppose que c'est ce qui prend tant de temps.

+0

fait beaucoup de sens pourquoi dans mon expérience, le temps est à peu près le même. Merci pour l'explication. – user158017

0

Je pense que beaucoup dépend du matériel et du SGBD dans lequel vous vous trouvez. Dans mon environnement, créer une nouvelle table et y copier les anciennes données prendrait environ 3 ou 4 heures. Je m'attendrais à ce que l'ajout d'une colonne d'identité prenne le même laps de temps, basé uniquement sur d'autres expériences. Je suis sur Oracle avec plusieurs serveurs sur un SAN, donc les choses peuvent tourner plus vite que dans un environnement de serveur unique. Vous devrez juste vous asseoir et attendre.

+0

Il s'agit d'un serveur de test utilisant Microsoft SQL Server 2005. Processeur Intel Core 2 DUO 2,20 GHz avec 4 Go de RAM. – Zanoni

1

Je devine qu'il est bloqué - Avez-vous utilisé l'interface graphique ou une fenêtre de requête (connaissez-vous le SPID il fonctionne sous?)

Essayez ces - nous faire savoir si elles donnent des résultats et vous n'êtes pas quoi faire:

USE master 

SELECT * FROM sysprocesses WHERE blocked <> 0 

SELECT * FROM sysprocesses WHERE status = 'runnable' AND spid <> @@SPID 
+0

Les deux requêtes n'ont renvoyé rien. – Zanoni

Questions connexes