Usuń całą tabelę z wyjątkiem jednego wiersza
Powiedzmy, że mam bazę danych z tabelą zawierającą ponad 200 tys. Wierszy.
Ta tabela ma stałą krotkę o identyfikatorze 1800. reszta sekwencji krotek zaczyna się od 300k +.
Muszę wyczyścić tę tabelę, usunąć wszystkie rekordy bez usuwania jednego rejestru o identyfikatorze 1800. Wymyśliłem 3 rodzaje zapytań, które mogłem wykonać:
DELETE FROM table WHERE id > 1800
DELETE FROM table WHERE id <> 1800
DELETE FROM table WHERE id NOT IN (1800)
Mam wrażenie, że pierwsza jest szybsza od pozostałych, ale nie jestem pewien, ponieważ wszystkie inne dane mają identyfikatory znacznie powyżej 1800.
Który jest szybszy i dlaczego? Ponadto, jeśli istnieje szybszy sposób usuwania wpisów, z wyłączeniem tych, których nie można usunąć, daj mi znać.
Nie znaleziono powiązanych wyników
Zaproszony:
Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się
4 odpowiedzi
Anonimowy użytkownik
Potwierdzenie od:
Trzeba przyznać, że może to nie być możliwe ze względu na wyzwalacze, ograniczenia i uprawnienia. W wielu bazach danych możesz zrobić coś podobnego, modyfikując (2), aby obciąć tabelę zamiast ją upuszczać.
Jeśli chodzi o pierwotne pytanie, w zapytaniu dominuje obciążenie związane z faktycznym usuwaniem wierszy i powiązanych z nimi danych. To, jak dokonujesz porównania, nie ma znaczenia.
Przykładowy kod
Nie jestem pewien co do konwencji nazewnictwa Postgres dla tabel tymczasowych, ale taka jest idea.
Anonimowy użytkownik
Potwierdzenie od:
Istnieje niewielka szansa, że ten pierwszy użyje przeszukiwania indeksów zamiast bardziej wydajnego skanowania pełnej tabeli, ale jest to znikome.
Anonimowy użytkownik
Potwierdzenie od:
Anonimowy użytkownik
Potwierdzenie od: