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!
si ce changement est une fois, Quel est le gros problème avec cela prenant 15-20 minutes? –
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