Co się stanie, gdy dodamy indeks do istniejącej tabeli z dużą ilością danych?

11

Mam tabelę, która będzie zawierać około 15 milionów rekordów. Teraz muszę dodać indeks do tabeli.

Dodanie indeksu zajmie trochę czasu, aby zaktualizować każdy wpis w tabeli.

Jestem dość zdezorientowany, czy dodanie indeksu spowoduje przestoje.

Jeśli tak, to jak mogę przezwyciężyć przestoje?

Harry Suren
źródło
2
Zobacz
Współczynniki

Odpowiedzi:

10

W przypadku zwykłego CREATE INDEXtabela zostanie zablokowana na potrzeby zapisów, ale nie odczytów.

Służy również CREATE INDEX CONCURRENTLYdo unikania blokad zapisu.

Z dokumentów PostgreSQL naCREATE INDEX :

Gdy ta opcja jest używana, PostgreSQL zbuduje indeks bez żadnych blokad, które zapobiegają równoczesnym wstawieniom, aktualizacjom lub usuwaniu tabeli; podczas gdy standardowa kompilacja indeksu blokuje zapisywanie (ale nie odczytuje) tabeli, dopóki nie zostanie wykonane. Korzystając z tej opcji, należy pamiętać o kilku zastrzeżeniach - patrz Równoległe budowanie indeksów .

A dokładniej (jak skomentował @ypercube ):

PostgreSQL obsługuje budowanie indeksów bez blokowania zapisów . Ta metoda jest wywoływana przez określenie CONCURRENTLYopcji CREATE INDEX. Gdy ta opcja jest używana, PostgreSQL musi wykonać dwa skany tabeli, a ponadto musi czekać na zakończenie wszystkich istniejących transakcji, które potencjalnie mogą korzystać z indeksu. Dlatego ta metoda wymaga więcej pracy całkowitej niż standardowa kompilacja indeksu i jej wykonanie zajmuje znacznie więcej czasu. Ponieważ jednak pozwala na kontynuowanie normalnych operacji podczas tworzenia indeksu, ta metoda jest przydatna do dodawania nowych indeksów w środowisku produkcyjnym.

Odważny nacisk moje.

Fabrizio Mazzoni
źródło