J'ai besoin de mettre à jour 100 millions d'enregistrements dans une seule table, en effet, normalisant la table en remplaçant la valeur varchar d'une colonne par un simple ID. (Je dis «remplacer» mais j'écris vraiment l'ID dans une autre colonne.)
Ce que j'essaie de réaliser, c'est de normaliser l'ensemble de données. Les données non encore normalisées n'ont pas d'indexation. Ma pensée était que je ne construirais pas d'index sur les valeurs brutes, en attendant, au lieu d'indexer les clés étrangères qui remplaceraient les valeurs varchar par des valeurs tinyint une fois la mise à jour terminée.
UPDATE A
SET A.AutoClassID = B.AutoClassID
FROM AutoDataImportStaging.dbo.Automobile as A
JOIN AutoData.dbo.AutoClass as B on (A.AutoClassName = B.AutoClassName)
Contexte
- à l'aide de MSSQL 2008 R2 sur Server 2008 R2
- le serveur a 8 Go de RAM
- le serveur a un RAID10, 7200 RPM SATA (pas génial, je sais, en production, cela ne lira que les données et non les données; plus la récente pénurie HD a rendu cela nécessaire pour le coût)
- le serveur a un processeur Xeon quadricœur double
- la machine ne fait rien d'autre (actuellement dédiée au développement, seulement ce processus)
- la journalisation simple est activée (? - mais est-elle toujours enregistrée pour pouvoir être annulée?)
- notez que la requête fait référence à deux bases de données différentes, pour ce que cela vaut
- la "largeur" d'un enregistrement dans le tableau mis à jour est de 455 octets
Ressources pendant l'exécution
- la RAM physique est au maximum
- les E / S de disque sont au maximum
- Le CPU ne fait pratiquement rien (le point d'étranglement est les E / S)
- le temps d'exécution a été de 14 heures et ça compte!
Je soupçonne quelques choses comme j'ai besoin d'un index sur les données brutes, même si je vais supprimer la colonne (AutoClassName) après les mises à jour de normalisation. Je me demande également si je devrais simplement parcourir le tableau un enregistrement à la fois au lieu de JOIN, ce qui semblait ridicule au moment où j'ai commencé cela, mais maintenant il semble que cela aurait été plus rapide.
Comment dois-je changer ma méthodologie pour mes mises à jour de normalisation restantes (similaires à celle-ci) plus rapidement?
TOP
clause. Ce serait mon approche.