Insertion à plusieurs rangées vs insertions à une seule rangée

9

Dans mon application, je fais des insertions à plusieurs lignes lorsque je le peux simplement parce que cela réduit le nombre d'aller-retour entre la base de données et l'application.

Cependant, j'étais curieux, y a-t-il d'autres avantages? Par exemple, si plusieurs lignes sont insérées en même temps comme ceci:

insert into tbl (c1, c2) values
(v1, v2)
(v3, v4)

contre:

insert into tbl (c1, c2) values (v1, v2)
insert into tbl (c1, c2) values (v3, v4)

et la table a un indice, l'indice est-il calculé une fois dans le premier cas et deux fois dans le deuxième cas? Ou est-ce toujours une fois par insert? Supposons que les deux requêtes se trouvent dans la même transaction.

J'utilise PostgreSQL.

cdmckay
la source
2
Je pense que l'index est mis à jour c'est une fois par déclaration , pas une fois par ligne . Ainsi, la déclaration unique devrait être plus efficace que les deux déclarations. Mais je ne suis pas sûr (donc pas de réponse, juste un commentaire)
a_horse_with_no_name
1
Je pense que la bonne question est de savoir si elle est encapsulée dans la même transaction. Hors de l'estomac, s'il y a les deux dans une transaction, il n'y aura pas de différence.
user1363989
@ user1363989, j'ai mis à jour ma question pour indiquer que les deux requêtes seraient dans la même transaction
cdmckay

Réponses:

5

Je pense que @a_horse_with_no_name a raison de dire que l'index est mis à jour une fois par instruction, car si l'instruction n'a pas terminé son exécution, les données ne seront pas visibles car elles sont en transaction. Et la définition d'une déclaration comprend avoir plusieurs valeurs

Et accoriding aux docs ici la création d'index / mise à jour fonctionne plus efficace avec des lots que des déclarations simples.

Il y a aussi un bel article de Peter Manis sur les performances des différentes méthodes d'insertion que je peux recommander.

Une autre chose à garder à l'esprit est l' FILLFACTORindice, car il a un impact sur les performances, comme le décrit ici Fabien Coelho .

Benjamin
la source
Si les requêtes sont groupées dans une transaction, la mise à jour de l'index se produira-t-elle une fois par instruction? Y aura-t-il une différence de performances due à autre chose? Je ne parviens pas à accéder à l'un ou l'autre des articles: pourriez-vous s'il vous plaît vous reconnecter?
batbrat
1

Je ne pense pas qu'il existe actuellement des différences d'optimisation dans le domaine de la maintenance des index à cet égard.

En plus de la charge du réseau, les autres avantages de la déclaration de valeurs multiples sont dans l'analyse syntaxique, de verrouillage, etc. (Même si le verrou de table sur tblest prise par la première instruction d'insertion, puis maintenue dans le reste de la transaction, chaque insert doit encore vérifier que le verrou est maintenu, et cette vérification n'est pas gratuite)

jjanes
la source