Maison >base de données >tutoriel mysql >INSERT unique avec plusieurs valeurs ou plusieurs insertions : quand le traitement par lots devient-il un goulot d'étranglement ?

INSERT unique avec plusieurs valeurs ou plusieurs insertions : quand le traitement par lots devient-il un goulot d'étranglement ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-15 11:50:42270parcourir

Single INSERT with Multiple Values vs. Multiple Inserts: When Does Batching Become a Bottleneck?

Insertion par lots et insertion unique de plusieurs valeurs : quand le traitement par lots devient-il un goulot d'étranglement ?

Une comparaison surprenante des performances montre que l'exécution de 1 000 instructions INSERT seule (290 millisecondes) est nettement meilleure que l'insertion de 1 000 valeurs à l'aide d'une seule instruction INSERT (2 800 millisecondes). Pour étudier ce résultat inattendu, analysons le plan d'exécution et identifions les goulots d'étranglement potentiels.

L'inspection du plan d'exécution montre que l'instruction INSERT unique utilise un processus de paramétrage automatique pour minimiser le temps d'analyse/compilation. Cependant, le temps de compilation d'une seule instruction INSERT augmente soudainement à environ 250 clauses de valeur, ce qui entraîne une diminution de la taille du plan de cache et une augmentation du temps de compilation.

Une analyse plus approfondie montre que lors de la compilation d'un plan pour une valeur littérale spécifique, SQL Server peut effectuer certaines activités qui n'évoluent pas de manière linéaire, telles que le tri. Même sans tri au moment de la compilation, l'ajout d'un index clusterisé à une table affichera une étape de tri explicite dans le plan.

Lors de la phase de compilation, la trace de pile du processus SQL Server montre que beaucoup de temps est passé à comparer les chaînes. Cela peut être lié à la phase de normalisation (liaison ou algébraisation) du traitement des requêtes, où l'arbre d'analyse d'expression est converti en arbre d'expression algébrique.

Des expériences faisant varier la longueur et le caractère unique des chaînes insérées ont montré que des chaînes plus longues et moins de doublons entraînent de moins bonnes performances au moment de la compilation. Cela indique que SQL Server passe plus de temps à comparer et à identifier les doublons lors de la compilation.

Dans certains cas, ce comportement peut être exploité pour améliorer les performances. Par exemple, dans une requête qui utilise une colonne sans doublons comme clé de tri primaire, SQL Server peut ignorer le tri par clé secondaire au moment de l'exécution et éviter les erreurs de division par zéro.

Ainsi, même si l'insertion de plusieurs valeurs à l'aide d'une seule instruction INSERT peut sembler plus rapide que plusieurs instructions INSERT, la surcharge de temps de compilation associée au traitement d'un grand nombre de valeurs différentes (en particulier les chaînes longues) peut entraîner une dégradation significative des performances dans Refus de SQL Server.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn