Inserção de várias linhas vs várias inserções de linha única

9

No meu aplicativo, insiro várias linhas quando posso, apenas porque reduz o número de viagens de ida e volta entre o banco de dados e o aplicativo.

No entanto, fiquei curioso, existem outras vantagens? Por exemplo, se várias linhas forem inseridas ao mesmo tempo assim:

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

versus:

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

e a tabela possui um índice, o índice é calculado uma vez no primeiro caso e duas vezes no segundo caso? Ou é sempre uma vez por inserção? Suponha que ambas as consultas estejam na mesma transação.

Estou usando o PostgreSQL.

cdmckay
fonte
2
Eu acho que o índice é atualizado é uma vez por instrução , não uma vez por linha . Portanto, a declaração única deve ser mais eficiente que as duas. Mas eu não tenho certeza (daí nenhuma resposta, apenas um comentário)
a_horse_with_no_name
11
Acho que a pergunta certa é: está encapsulado na mesma transação. Fora do estômago, se houver os dois em uma transação, não haverá diferença.
user1363989
@ user1363989, eu atualizei a minha pergunta para indicar que ambas as consultas seria na mesma transação
cdmckay

Respostas:

5

Acho que @a_horse_with_no_name está certo quanto ao fato de o índice ser atualizado uma vez por instrução, porque se a instrução não concluir sua execução, os dados não estarão visíveis, pois estão em transação. E a definição de uma declaração inclui ter vários valores

E, de acordo com os documentos aqui, a criação / atualização de índice funciona mais eficiente com lotes do que com instruções únicas.

Há também um bom artigo de Peter Manis sobre o desempenho de vários métodos de inserção que posso recomendar.

Outra coisa a ter em mente é o FILLFACTORíndice, pois tem um impacto no desempenho, como Fabien Coelho descreve aqui .

Benjamin
fonte
Se as consultas forem agrupadas em lote em uma transação, a atualização do índice ocorrerá uma vez por instrução? Haverá uma diferença de desempenho devido a mais alguma coisa? Não consigo acessar nenhum dos artigos: você poderia vincular novamente?
batbrat
1

Não acredito que atualmente haja diferenças de otimização na área de manutenção de índice a esse respeito.

Além da sobrecarga de rede, as outras vantagens da instrução de vários valores estão na análise, bloqueio, etc. (Embora o bloqueio da tabela tblseja assumido pela primeira instrução de inserção e depois mantido durante o restante da transação, cada inserção A instrução ainda precisa verificar se o bloqueio está retido e essa verificação não é gratuita)

jjanes
fonte