Plusy i minusy TRUNCATE vs DELETE FROM

Czy ktoś mógłby mi dać szybki przegląd zalet i wad używania następujących dwóch stwierdzeń:

TRUNCATE TABLE dbo.MyTable

Vs

DELETE FROM dbo.MyTable
Wydaje się, że oboje robią to samo, gdy wszystko jest powiedziane i zrobione; ale czy muszą być różnice między tymi dwoma.
Author: Lukasz Szozda, 2010-07-15

11 answers

TRUNCATE nie generuje żadnych danych wycofywania, co sprawia, że jest szybki jak błyskawica. Po prostu dealokuje strony danych używane przez tabelę.

Jeśli jednak jesteś w transakcji i chcesz mieć możliwość "cofnięcia" tego usunięcia, musisz użyć DELETE FROM, który daje możliwość cofnięcia.

EDIT: Zauważ, że powyższe jest nieprawidłowe dla SQL Server (ale ma zastosowanie do Oracle). W SQL Server możliwe jest cofnięcie operacji okrojenia, jeśli jesteś wewnątrz transakcji i transakcja nie została zrealizowana. Z punktu widzenia SQL Server jedną z kluczowych różnic między DELETE FROM I TRUNCATE jest to : "Polecenie DELETE usuwa wiersze pojedynczo i rejestruje wpis w dzienniku transakcji dla każdego usuniętego wiersza. Tabela TRUNCATE usuwa dane poprzez dealokację stron danych używanych do przechowywania danych tabeli i zapisuje tylko dealokacje stron w dzienniku transakcji."

Innymi słowy, jest mniej rejestrowania podczas obcinania, ponieważ tylko dealokacje stron są rejestrowane w dzienniku transakcji, podczas gdy z usunięciem z każdego wiersza jest rejestrowane usuwanie. To jeden z powodów, dla których TRUNCATE jest szybki jak błyskawica.

Zauważ również, że z tego łącza MSDN nie można obcinać tabel, do których odwołują się ograniczenia klucza obcego, uczestniczyć w widoku indeksowanym lub publikować za pomocą replikacji transakcyjnej lub replikacji merge.

EDIT 2: Innym kluczowym punktem jest to, że TRUNCATE TABLE zresetuje twoją tożsamość do initial seed, podczas gdy DELETE FROM będzie kontynuować inkrementację od miejsca, w którym została przerwana. Odniesienie: odpowiedź Bena Robinsona.

 88
Author: dcp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 12:53:52

Innym kluczowym punktem nie wspomnianym w innych odpowiedziach jest to, że TRUNCATE TABLE zresetuje Twoją tożsamość do początkowego ziarna, podczas gdy DELETE FROM będzie kontynuował zwiększanie od miejsca, w którym zostało przerwane.

 47
Author: Ben Robinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 09:16:26

Inną różnicą z punktu widzenia bezpieczeństwa jest to, że TRUNCATE wymaga uprawnień do zmiany w tabeli, podczas gdy DELETE wymaga jedynie (Werble) uprawnień do usunięcia w tej tabeli.

 8
Author: Kyle Hale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-03 15:35:44

TRUNCATE TABLE nie rejestruje transakcji. Oznacza to, że jest błyskawiczny dla dużych stołów. Minusem jest to, że nie można cofnąć operacji.

DELETE FROM rejestruje każdy wiersz, który jest usuwany w dziennikach transakcji, więc operacja trwa chwilę i powoduje dramatyczny wzrost dzienników transakcji. Plusem jest to, że w razie potrzeby możesz cofnąć operację.

 4
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 14:07:48

Zarys Delete Vs Truncate w SQL server

Dla pełnego artykułu weź po tym połączeniu: Delete Vs Truncate in SQL Server

Tutaj wpisz opis obrazka

/*Truncate - Syntax*/
TRUNCATE TABLE table_name

/*Delete - Syntax*/
DELETE FROM table_name
WHERE some_condition
 3
Author: Rahul Modi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 10:08:54

Uważam, że Delete i Truncate można wycofać tylko wtedy, gdy operacja została wykonana w transakcji jawnej. W przeciwnym razie musisz wykonać przywracanie, aby odzyskać usunięte DANE

 2
Author: CNkatcher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-24 15:44:33

Zasadnicza różnica polega na sposobie ich rejestrowania. DELETE i TRUNCATE są rejestrowane inaczej, ale oba mogą być wycofane w dokładnie taki sam sposób. Wszystkie operacje, które zmieniają dane są rejestrowane. W SQL Server nie ma czegoś takiego jak operacja niezalogowana.

 1
Author: nvogel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-29 11:28:10

Jedna rzecz, która jest bardzo ważna(imo) i nie wspominana w innych odpowiedziach, to to, że TRUNCATE wymaga blokady stabilności schematu, Sch-S, podczas gdy DELETE używa blokady wiersza. Pozwala sprawdzić co następuje:

BEGIN TRANSACTION;

BEGIN TRY
    -- Truncate below will take LCK_M_SCH_S lock for TABLE_A
    TRUNCATE TABLE TABLE_A

    -- Lets say the query below takes 5 hours to execute
    INSERT INTO
        TABLE_A
    SELECT
        *
    FROM
        GIANT_TABLE (NOLOCK)
END TRY
BEGIN CATCH
    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    THROW
END CATCH

IF @@TRANCOUNT > 0
    COMMIT TRANSACTION;

Załóżmy teraz, że po 1-2 minutach od rozpoczęcia tego zapytania, powiedzmy, że próbowaliśmy wykonać następujące polecenie:

SELECT COUNT(*) FROM TABLE_A (NOLOCK)

Zauważ, że użyłem NOLOCK klauzuli. Jak myślisz, co się teraz stanie? To zapytanie będzie czekać 5 godzin. Dlaczego? Ponieważ NOLOCK klauzula wymaga Sch-S blokady TABLE_A ale to TRUNCATE klauzula ma Sch-S już na niej. Ponieważ nie zatwierdziliśmy jeszcze transakcji, blokada jest nadal włączona nawet po tej klauzuli TRUNCATE. Sch-S Blokada tabeli w zasadzie oznacza, że albo TABLE_A jest zmieniana przez dodawanie / usuwanie kolumn itp. albo jest okrojona. Nawet nie można wykonać czegoś takiego jak poniżej:

SELECT object_id('TABLE_A')
To też potrwa 5 godzin. Jeśli jednak zamienisz TRUNCATE na DELETE FROM, zobaczysz, że nie będzie Sch-S blokady na tabeli i zapytania powyżej nie otrzymają stucked.
 0
Author: sotn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 07:28:30

Kolejną różnicą między DELETE a TRUNCATE jest zachowanie, gdy tabela jest uszkodzona.

Na przykład:

DELETE FROM table_name;

Zakończy się błędem:

Msg 3314, Poziom 21, Stan 3, Linia 1

Podczas cofania zalogowanej operacji w bazie danych"...', wystąpił błąd w Log record ID (). Zazwyczaj określona awaria jest wcześniej rejestrowana jako błąd w usłudze dziennika zdarzeń systemu Windows. Przywróć bazę danych lub Plik z kopii zapasowej lub napraw bazę danych.

Msg 0, Poziom 20, Stan 0, Linia 0

Wystąpił poważny błąd w bieżącym poleceniu. Ewentualne wyniki należy odrzucić.

While TRUNCATE będzie działać:

TRUNCATE TABLE table_name;
-- Command(s) completed successfully.
 0
Author: Lukasz Szozda,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Plus wszystkie odpowiedzi, kolejny punkt do rozważenia, że Truncate nie wywoła delete trigger tabeli, ale delete wywoła delete trigger tabeli dla każdego wiersza.

 0
Author: Melad Basilius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-11 10:43:21

Truncate nie robi żadnego logowania, delete robi, więc jeśli masz mnóstwo rekordów, Twój trans log jest ogromny

 -2
Author: ScaleOvenStove,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 14:02:43