Mam tabelę zawierającą około 100 milionów wierszy, które zamierzam skopiować, aby zmienić, dodając indeks. Nie interesuje mnie czas potrzebny na utworzenie nowej tabeli, ale czy utworzony indeks będzie bardziej wydajny, jeśli zmienię tabelę przed wstawieniem jakichkolwiek danych lub najpierw wstawię dane, a następnie dodam indeks?
sql
database
postgresql
indexing
Drew Stephens
źródło
źródło
Prawdopodobnie lepiej jest utworzyć indeks po dodaniu wierszy. Nie tylko będzie to szybsze, ale prawdopodobnie wyważenie drzewa będzie lepsze.
Edycja „balansowania” prawdopodobnie nie jest tutaj najlepszym wyborem terminów. W przypadku drzewa b jest to z definicji zrównoważone. Ale to nie znaczy, że b-drzewo ma optymalny układ. Rozmieszczenie węzłów potomnych w rodzicach może być nierówne (co prowadzi do wyższych kosztów w przyszłych aktualizacjach), a głębokość drzewa może być większa niż jest to konieczne, jeśli równoważenie nie jest wykonywane ostrożnie podczas aktualizacji. Jeśli indeks zostanie utworzony po dodaniu wierszy, prawdopodobnie będzie miał lepszą dystrybucję. Ponadto strony indeksowe na dysku mogą mieć mniejszą fragmentację po utworzeniu indeksu. Trochę więcej informacji tutaj
źródło
Nie ma to znaczenia w przypadku tego problemu, ponieważ:
O(n*log(N))
dłuższy (gdzien
zostaną dodane wiersze). Ponieważ czas trwania drzewa jestO(N*log(N))
wtedy, gdy podzielisz to na stare dane i nowe dane, które otrzymasz,O((X+n)*log(N))
można to po prostu przekonwertować naO(X*log(N) + n*log(N))
iw tym formacie możesz po prostu zobaczyć, na co będziesz czekać.n
nowe wiersze) dostajesz dłuższy czas wstawiania dodatkowego czasuO(log(N))
potrzebnego na zregenerowanie struktury drzewa po dodaniu do niego nowego elementu (indeks kolumna z nowego wiersza, ponieważ indeks już istnieje i nowy wiersz został dodany to indeks musi zostać zregenerowany do zrównoważenia struktura, ten kosztO(log(P))
gdzieP
jest mocą indeksu [elementy w indeksie] ). Maszn
nowe wiersze w końcu trzeban * O(log(N))
potemO(n*log(N))
Podsumowanie dodatkowego czasu.źródło
Indeksy utworzone później są w większości przypadków znacznie szybsze. Przykład: 20 milionów wierszy z pełnym tekstem na varchar (255) - (nazwa firmy) Indeks na miejscu podczas importowania wierszy - dopasowanie do 20 sekund w najgorszych przypadkach. Upuść indeks i odtwórz ponownie - dopasuj, aby za każdym razem zajmować mniej niż 1 sekundę
źródło
Nie jestem pewien, czy będzie to miało znaczenie dla wydajności indeksu, ponieważ w obu przypadkach wstawiasz nowe dane do indeksu. Serwer nie wiedziałby, jak niezrównoważony byłby indeks, dopóki nie zostałby zbudowany. Jeśli chodzi o szybkość, oczywiście wstawki bez indeksu.
źródło