8
votes

Plusieurs lignes avec un seul insert dans SQLServer 2008

Je teste la vitesse d'insertion de plusieurs lignes avec une seule instruction insertion.

Par exemple: Insérez des valeurs [MyTable] (5, 'Dog'), (6, 'Cat'), (3, 'Poisson)

Ceci est très rapide jusqu'à ce que je passe 50 lignes sur une seule déclaration, la vitesse tombe de manière significative.

L'insertion de 10000 lignes avec des lots de 50 prises 0,9 seconde. L'insertion de 10000 lignes avec des lots de 51 prend 5,7 secondes.

Ma question a deux parties:

  1. Pourquoi existe-t-il une telle perte de performance à 50?
  2. Puis-je compter sur ce comportement et le code mon application pour ne jamais envoyer de lots supérieurs à 50?

    Mes tests ont été effectués en C ++ et ADO.

    EDIT: Il apparaît que le point de dépôt n'est pas de 50 rangées, mais 1000 colonnes. Je reçois des résultats similaires avec 50 lignes de 20 colonnes ou 100 rangées de 10 colonnes.


2 commentaires

J'ai l'impression que cela s'aggrave en raison de l'analyse de l'intrant.


Devinière complète et totale sauvage: moins de 50 lignes sont mises en cache dans la RAM par SQL Server, mais des inserts plus importants sont considérés comme plus «importants» et sont écrits immédiatement sur le disque? Honnêtement, pas sûr (par conséquent, commenter plutôt que de répondre)


6 Réponses :



0
votes

Le ralentissement est probablement l'analyse des valeurs de chaîne: valeurs (5, «chien»), (6, 'chat'), (3, 'poisson) et non un problème d'insertion.

Essayez quelque chose comme ceci, qui insérera une ligne pour chaque ligne renvoyée par la requête: xxx

et voir ce qui se passe


0 commentaires


0
votes

Pensées aléatoires:

  • est-il complètement cohérent lors de la course à plusieurs reprises?
  • Vous recherchez des doublons dans les 1er rangées 10K pour la 2e insertion 10K?
  • Avez-vous essayé la taille du lot de 51 d'abord?
  • Avez-vous vide la table entre tests?

2 commentaires

Oui c'est très cohérent. Et je vidai la table entre chaque test.


@Todd: intéressant. Bonne question. Et je n'ai aucune autre idée cependant :-)



2
votes

Cela pourrait également être lié à la taille de la ligne. La table que vous utilisez comme exemple semble avoir seulement 2 colonnes. Et si cela a 25 colonnes? La performance diminue-t-elle également à 50 rangées?


2 commentaires

Intéressant. Le tableau ci-dessus n'était qu'un exemple, ma table réelle compte 20 colonnes. Je coupe jusqu'à 10 ans et j'ai essayé à nouveau. Maintenant, je reçois la coupe à 100. Les lots de 100 prennent environ 0,6 seconde. Les lots de 101 prennent environ 3,25 secondes. Il apparaît que la limite n'est pas de 50 rangées, mais 1000 champs mis à jour individuels?


On dirait que la coupure ressemble davantage à des données totales en mémoire. Si une table est petite, vous pouvez peut-être que vous puissiez installer 100 rangées dans un «bloc», quel que soit un bloc. Mais de grandes tables, avec de nombreuses colonnes ou avec quelques grandes colonnes (par exemple, Varchar (1200)) limiteraient le nombre de lignes que vous pourriez correspondre à un bloc.