Próbuję lepiej zrozumieć różnice między poleceniami DELETE
i TRUNCATE
. Moje rozumienie elementów wewnętrznych przebiega w następujący sposób:
DELETE
-> aparat bazy danych znajduje i usuwa wiersz z odpowiednich stron danych i wszystkich stron indeksu, w których wiersz jest wprowadzony. Im więcej indeksów, tym dłużej trwa usuwanie.
TRUNCATE
-> po prostu masowo usuwa wszystkie strony danych tabeli, dzięki czemu jest to bardziej wydajna opcja usuwania zawartości tabeli.
Zakładając, że powyższe jest poprawne (popraw mnie, jeśli nie):
- Jak różne tryby odzyskiwania wpływają na każdą instrukcję? Jeśli w ogóle jest jakikolwiek efekt
- Czy podczas usuwania skanowane są wszystkie indeksy, czy tylko te, w których znajduje się wiersz? Zakładam, że wszystkie indeksy są skanowane (a nie wyszukiwane?)
- Jak replikowane są polecenia? Czy polecenie SQL jest wysyłane i przetwarzane dla każdego subskrybenta? A może MSSQL jest nieco bardziej inteligentny?
sql-server
database-internals
Stuart Blackler
źródło
źródło
DELETE
iTRUNCATE
w odpowiedziach na to pytanie na temat użytecznościTRUNCATE
-ing bezpośrednio przedDROP
. Możesz także samodzielnie przekopać się w dzienniku, aby zbadać efekty obu poleceń, korzystając z techniki opisanej w tej odpowiedzi .TRUNCATE
można przywrócić. Nick opisuje to w swojej odpowiedzi na pytanie, które podał .Odpowiedzi:
Tak, choć są tutaj dwie opcje. Wiersze mogą być usuwane z indeksów nieklastrowanych wiersz po rzędzie przez tego samego operatora, który wykonuje usuwanie tabeli podstawowej. Jest to znane jako wąski (lub na wiersz) plan aktualizacji:
Lub skasowanie indeksu nieklastrowanego może być wykonane przez oddzielnych operatorów, po jednym na indeks nieklastrowany. W takim przypadku (zwany planem aktualizacji szerokim lub według indeksu) pełny zestaw akcji jest przechowywany w tabeli roboczej (chętny bufor) przed odtworzeniem raz na indeks, często jawnie posortowany według poszczególnych kluczy indeksu nieklastrowanego, aby zachęcić do sekwencyjnego wzór dostępu.
Tak.
TRUNCATE TABLE
jest bardziej wydajny z wielu powodów:Usunięcie jest zawsze w pełni rejestrowane (każdy usunięty wiersz jest zapisywany w dzienniku transakcji). Istnieją niewielkie różnice w zawartości rekordów dziennika, jeśli model odzyskiwania jest inny niż
FULL
, ale nadal jest to technicznie pełne rejestrowanie.Usunięcie wiersza w indeksie (przy użyciu wcześniej przedstawionych wąskich lub szerokich planów aktualizacji) jest zawsze kluczem (wyszukiwanie). Skanowanie całego indeksu dla każdego usuniętego wiersza byłoby strasznie nieefektywne. Spójrzmy jeszcze raz na plan aktualizacji dla indeksu pokazany wcześniej:
Plany wykonania są potokami zależnymi od zapotrzebowania: operatorzy nadrzędni (po lewej) napędzają operatorów podrzędnych do wykonania pracy, żądając od nich pojedynczych wierszy. Operatory sortowania blokują (muszą zużyć całe dane wejściowe przed utworzeniem pierwszego posortowanego wiersza), ale nadal są sterowane przez swojego rodzica (usuwanie indeksu) żądającego pierwszego wiersza. Usuwanie indeksu wyciąga wiersz po zakończeniu sortowania, aktualizując docelowy indeks nieklastrowany dla każdego wiersza.
W szerokim planie aktualizacji często zobaczysz kolumny dodawane do strumienia wierszy przez operatora aktualizacji tabeli podstawowej. W takim przypadku Clustered Index Delete dodaje do strumienia nieklastrowane kolumny kluczy indeksu. Te dane są wymagane przez silnik pamięci masowej do zlokalizowania wiersza do usunięcia z indeksu nieklastrowanego:
Obcinanie nie jest dozwolone w tabeli publikowanej przy użyciu replikacji transakcyjnej lub scalającej. Sposób replikacji usunięć zależy od typu replikacji i sposobu jej konfiguracji. Na przykład replikacja migawki po prostu replikuje widok tabeli punkt w czasie przy użyciu metod zbiorczych - zmiany przyrostowe nie są śledzone ani stosowane. Replikacja transakcyjna działa poprzez odczytywanie rekordów dziennika i generowanie odpowiednich transakcji w celu zastosowania zmian u subskrybentów. Scalanie replikacji śledzi zmiany za pomocą wyzwalaczy i tabel metadanych.
Literatura pokrewna: Optymalizacja zapytań T-SQL, które zmieniają dane
źródło