2009-09-17 8 views
2

Je constate une énorme baisse des performances dans notre application d'entreprise lors du changement de la collection de schémas XML d'une colonne donnée sur une grande table. Simpliste dit, nous faisons quelque chose comme ceci:xml modification de la collection de schémas - énorme succès de performance

ALTER TABLE HugeTable ALTER COLUMN CustomFields XML 

(Note: CustomFields était auparavant lié à XML (CustomFieldsSchemaCollection, mais bien sûr, nous devons modifier ce schéma XML, nous avons donc besoin de cette déclaration afin que ce schéma peut être modifié)

et puis, après avoir modifié le CustomFieldSchemaCollection, nous le faisons.

ALTER TABLE HugeTable ALTER COLUMN CustomFields XML(CustomFieldSchemaCollection) 

la première déclaration prend 8 minutes et la deuxième instruction prend 10 minutes

Nous avons trouvé que nous pourrions optimiser légèrement la première déclaration (50% de gain de performance) en utilisant les éléments suivants:

ALTER TABLE HugeTable ALTER COLUMN CustomFields nvarchar(max) 

L'effet est que la première instruction prend 4 minutes et la deuxième instruction prend 10 (donc, 14 min, en baisse de 18).

question de la ligne de fond est ... Est-il possible de le faire « schéma XML re-lier » (ou quoi que l'on appelle) d'une manière qui évite totalement le contrôle inutile et redondant de toutes les valeurs de SQL Server dans la colonne? (Remarque: oui, nous pouvons supposer que les données XML existantes dans cette table seront conformes à la nouvelle collection de schémas xml.)

Merci à tous ceux qui peuvent vous aider!

+0

si ce changement est une fois, Quel est le gros problème avec cela prenant 15-20 minutes? –

+0

KM: bonne question! cela fait partie du processus de mise à niveau. Malheureusement, même sur des bases de données semi-volumineuses, cela prend beaucoup de temps - des heures - et cela mène à des mises à niveau échouées (erreurs de dépassement de délai). En tant qu'entreprise, nous essayons de nous éloigner de la solution «juste augmenter le seuil de temporisation», car cela nous a trop mordu par le passé. – Garrett

Répondre

0

Si le temps est vraiment un gros problème (ce qui sur une mise à niveau 1 fois ne devrait pas vraiment beaucoup d'importance) pourriez-vous envisager de supprimer les données sous-jacentes, reliez-vous au nouveau schéma, toutes les questions d'insertion d'identité hors etc ...?

Ou pour un pas à pas super, écrire un script qui effectue les opérations suivantes comme lots:

  1. Alter la table et ajouter une nouvelle colonne XML avec le nouveau schéma
    liant
  2. Définissez les nouvelles données de la colonne = nouvelles anciennes données de colonne
  3. Supprimez l'ancienne colonne.
  4. Renommez la nouvelle colonne par l'ancien nom de colonne.
  5. Modifier ordinalité si nécessaire (sujet différent ... Et à moins que toutes vos requêtes de consommation sont écrits en toute sécurité en spécifiant les noms de colonnes au lieu de compter sur la
    ordinalité sous-jacente)
Questions connexes