Czy tworzenie indeksu jest skuteczniejsze po zakończeniu ładowania danych lub przed, czy też nie ma znaczenia?Najbardziej efektywny sposób tworzenia indeksu w Postgresie
Załóżmy na przykład, że mam 500 plików do załadowania do bazy danych Postgres 8.4 DB. Oto dwa scenariusze tworzenia indeksów, których mogłem użyć:
- Utwórz indeks po utworzeniu tabeli, a następnie wczytaj każdy plik do tabeli; lub
- Utwórz indeks po wczytaniu wszystkich plików do tabeli.
Dane samej tabeli mają około 45 gigabajtów. Indeks ma około 12 gigabajtów. Używam standardowego indeksu. Został utworzony w następujący sposób:
CREATE INDEX idx_name ON table_name (column_name);
Ładowanie danych używa COPY FROM.
Po wczytaniu wszystkich plików, żadne uaktualnienia, usunięcia ani dodatkowe obciążenia nie będą występować w tabeli (jest to dzienna wartość danych, która nie ulegnie zmianie). Więc chciałem zapytać, który scenariusz byłby najbardziej wydajny? Wstępne testy wydają się wskazywać, że ładowanie wszystkich plików, a następnie tworzenie indeksu (scenariusz 2) jest szybsze, ale nie dokonałem żadnego naukowego porównania tych dwóch podejść.
Cóż, gdy stół jest zablokowany, nikt nie może czytać ani pisać, co może być bardzo denerwujące, nawet w nocy. Lepiej używać CREATE INDEX CONCURRENTLY – mvp
@BradTilley: Myślałem, że to nowa funkcja, ale PostgreSQL 8.4 [obsługuje ją] (http://www.postgresql.org/docs/8.4/static/sql-createindex.html). – mvp
"* gdy stół jest zablokowany, nikt nie może czytać ani pisać *" - Nie sądzę, że to prawda. Kiedy uruchomiony jest "CREATE INDEX", tablica nadal może być czytana, ale nie aktualizowana, jeśli się nie mylę. –