PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak usunąć wiele wierszy z często używanej tabeli

  1. 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.)

  2. 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.

  3. 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 w DELETE .
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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak szybko usunąć użytkownika z istniejącymi uprawnieniami

  2. Przyznanie uprawnień PostgreSQL nie jest widoczne

  3. PostgreSQL - jak ulepszyć to zapytanie/indeks

  4. Wskazówka HINT_PASS_DISTINCT_THROUGH zmniejsza liczbę jednostek zwracanych na stronę dla żądania PageRequest poniżej skonfigurowanego rozmiaru strony (PostgreSQL)

  5. Tworzenie sekwencji znaków w postgreSQL