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.
postgresql
index
optimization
cdmckay
źródło
źródło
Odpowiedzi:
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
FILLFACTOR
indeks, ponieważ ma on wpływ na wydajność, jak opisuje to tutaj Fabien Coelho .źródło
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
tbl
jest 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)źródło