web-dev-qa-db-fra.com

Pourquoi l'importation en bloc est plus rapide que plusieurs INSERT?

J'écris mon travail d'études supérieures sur les méthodes d'importation de données d'un fichier vers une table SQL Server. J'ai créé mon propre programme et maintenant je le compare avec certaines méthodes standard telles que bcp, BULK INSERT, INSERT ... SELECT * FROM OPENROWSET (BULK ...) etc. Mon programme lit en lignes à partir d'un fichier source, les analyse et les importe un par un en utilisant des INSERT ordinaires. Le fichier contient 1 million de lignes de 4 colonnes chacune. Et maintenant, j'ai la situation que mon programme prend 160 secondes tandis que les méthodes standard prennent 5-10 secondes.

La question est donc de savoir pourquoi les opérations BULK sont plus rapides? Utilisent-ils des moyens spéciaux ou quelque chose? Pouvez-vous s'il vous plaît l'expliquer ou me donner quelques liens utiles ou quelque chose?

8
zer_ik

BULK INSERT peut être une opération à journalisation minimale (en fonction de divers paramètres tels que les index, les contraintes sur les tables, le modèle de récupération de la base de données, etc.). Les opérations à journalisation minimale consignent uniquement les allocations et les désallocations. Dans le cas de BULK INSERT, seules les allocations d'étendue sont enregistrées au lieu des données réelles insérées. Cela fournira des performances bien meilleures que INSERT.

Comparer l'insertion en vrac et l'insertion

L'avantage réel est de réduire la quantité de données enregistrées dans le journal des transactions.
Dans le cas d'un modèle de récupération BULK LOGGED ou SIMPLE, l'avantage est significatif.

Optimisation des performances d'importation BULK

Vous devriez également envisager de lire cette réponse: Insérer dans le tableau sélectionnez * à partir du tableau par rapport à l'insertion en vrac

Soit dit en passant, il existe des facteurs qui influenceront les performances de BULK INSERT:

Si la table a des contraintes ou des déclencheurs, ou les deux.

Le modèle de récupération utilisé par la base de données.

Si la table dans laquelle les données sont copiées est vide.

Si la table a des index.

Indique si TABLOCK est spécifié.

Si les données sont copiées à partir d'un seul client ou copiées en parallèle à partir de plusieurs clients.

Indique si les données doivent être copiées entre deux ordinateurs sur lesquels SQL Server s'exécute.

11
Hybris95

Tout d'abord, l'insertion ligne par ligne n'est pas optimale. Voir cet article sur la logique d'ensemble et cet article sur le moyen le plus rapide de charger des données dans SQL Server.

Deuxièmement, l'importation BULK est optimisée pour les charges importantes. Cela a tout à voir avec le vidage de page, l'écriture dans le journal, les index et diverses autres choses dans SQL Server. Il y a un article technique sur la façon dont vous pouvez optimiser les INSERTS EN VRAC, cela met en lumière la façon dont BULK est plus rapide. Mais je ne peux pas créer de lien plus de deux fois, vous devrez donc rechercher sur Google pour "Optimiser les performances d'importation en bloc".

0
DrTrunks Bell

Je pense que vous pouvez trouver beaucoup d'articles dessus, recherchez simplement "pourquoi l'insertion en vrac est plus rapide". Par exemple, cela semble être une bonne analyse:

https://www.simple-talk.com/sql/performance/comparing-multiple-rows-insert-vs-single-row-insert-with-three-data-load-methods/

Généralement, toute base de données a beaucoup de travail pour une seule insertion: vérification des contraintes, construction d'indices, vidage sur disque. Cette opération complexe peut être optimisée par la base de données lorsque vous effectuez plusieurs opérations en une seule et sans appeler le moteur un par un.

0
Galcoholic