Wstawka wielorzędowa a wiele wstawek jednorzędowych

9

W mojej aplikacji robię wstawki z wieloma wierszami, gdy tylko mogę, tylko dlatego, że zmniejsza to liczbę podróży w obie strony między db a aplikacją.

Byłem jednak ciekawy, czy są jakieś inne zalety? Na przykład, jeśli wstawianych jest wiele wierszy jednocześnie:

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

przeciw:

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

a tabela ma indeks, czy indeks jest obliczany raz w pierwszym przypadku i dwa razy w drugim przypadku? Czy zawsze jest to raz na wkładkę? Załóżmy, że oba zapytania dotyczą tej samej transakcji.

Używam PostgreSQL.

cdmckay
źródło
2
Myślę, że indeks jest aktualizowany raz na instrukcję , a nie raz na wiersz . Tak więc pojedyncza instrukcja powinna być bardziej wydajna niż dwie instrukcje. Ale nie jestem pewien (stąd brak odpowiedzi, tylko komentarz)
a_horse_with_no_name
1
Myślę, że właściwym pytaniem jest, czy jest on zawarty w tej samej transakcji. Z żołądka, jeśli oba są w transakcji, nie będzie różnicy.
user1363989,
@ user1363989, zaktualizowałem moje pytanie, aby wskazać, że oba zapytania byłyby w tej samej transakcji
cdmckay

Odpowiedzi:

5

Wydaje mi się, że @a_konia_nazwa_nazwa ma rację, że indeks jest aktualizowany raz na instrukcję, ponieważ jeśli instrukcja nie zakończy się jej wykonanie, dane nie będą widoczne, ponieważ jest w transakcji. A definicja instrukcji obejmuje wiele wartości

I zgodnie z dokumentami tutaj tworzenie / aktualizacja indeksów działa wydajniej z partiami niż pojedynczymi instrukcjami.

Jest też fajny artykuł Petera Manisa na temat wydajności różnych metod Insert, które mogę polecić.

Inną rzeczą, o której należy pamiętać, jest FILLFACTORindeks, ponieważ ma on wpływ na wydajność, jak opisuje to tutaj Fabien Coelho .

Benzoes
źródło
Jeśli zapytania są grupowane w transakcji, czy aktualizacja indeksu nastąpi raz na wyciąg? Czy wystąpi różnica w wydajności wynikająca z czegoś innego? Nie mogę uzyskać dostępu do żadnego z artykułów: czy możesz ponownie połączyć?
batbrat
1

Nie wierzę, że istnieją obecnie jakiekolwiek różnice optymalizacyjne w obszarze utrzymania indeksu w tym zakresie.

Oprócz narzutu sieciowego inne zalety instrukcji wielowartościowej polegają na analizowaniu, blokowaniu itp. (Mimo że blokada tabeli tbljest włączona przez pierwszą instrukcję wstawiania, a następnie utrzymywana przez resztę transakcji, każda wstawka instrukcja wciąż musi zweryfikować, czy blokada jest utrzymywana, a ta weryfikacja nie jest darmowa)

jjanes
źródło