-
Indeksy są zazwyczaj bezużyteczne w przypadku operacji na 90% wszystkich wierszy. Skanowanie sekwencyjne będzie tak czy inaczej szybsze. (Obowiązują wyjątki egzotyczne.)
-
Jeśli chcesz zezwolić na współbieżne odczyty, nie możesz zablokować tabeli na wyłączność. Więc nie możesz również usunąć żadnych indeksów w tej samej transakcji.
-
możesz upuszczaj indeksy w oddzielnych transakcjach, aby zminimalizować czas trwania blokady na wyłączność. W Postgresie 9.2 lub nowszym możesz również użyć RÓWNOCZEŚNIE OPUSZCZAJ INDEKS , który wymaga tylko minimalnych blokad. Później użyj
CREATE INDEX CONCURRENTLY
odbudować indeks w tle - i wziąć tylko bardzo krótką blokadę na wyłączność.
Jeśli masz stabilny warunek, aby zidentyfikować 10% (lub mniej) wierszy, które pozostają, sugerowałbym częściowy indeks tylko w tych wierszach, aby uzyskać najlepsze wyniki dla obu:
- Kwerendy czytające mogą szybko uzyskać dostęp do tabeli (przy użyciu indeksu częściowego) przez cały czas.
- Duży
DELETE
nie zamierza w ogóle modyfikować indeksu częściowego, ponieważ żaden z wierszy nie jest zaangażowany wDELETE
.
CREATE INDEX foo (some_id) WHERE delete_flag = FALSE;
Zakładając delete_flag
jest boolean
. Musisz uwzględnić ten sam predykat w swoich zapytaniach (nawet jeśli wydaje się to logicznie zbędne), aby upewnić się, że Postgres może wykonać częściowy indeks.