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. 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.
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.
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.
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ę.
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
/*Truncate - Syntax*/
TRUNCATE TABLE table_name
/*Delete - Syntax*/
DELETE FROM table_name
WHERE some_condition
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
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.
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.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.
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.
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
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