Różnica między tabelą upuszczania a tabelą obcinania?


80

Mam kilka tabel, które tworzę w ramach pakietu zbiorczego raportów. W ogóle ich potem nie potrzebuję. Ktoś wspomniał, że ma je skracać, ponieważ byłoby to szybsze.


2
możesz uzyskać odpowiedź ze stackoverflow.com/questions/2012974/…
php

W przypadku obcięcia tabeli MySQL nie zwalnia miejsca na dysku twardym. Jeśli chcesz odzyskać pamięć, powinieneś upuścić tabelę bez jej obcinania.
Emilio Nicolás

Odpowiedzi:


102

Usunięcie rekordów z tabeli rejestruje każde usunięcie i wykonuje wyzwalacze usuwania dla usuniętych rekordów. Truncate to potężniejsze polecenie, które opróżnia tabelę bez rejestrowania każdego wiersza. SQL Server zapobiega obcięciu tabeli z odwołującymi się do niej kluczami obcymi ze względu na konieczność sprawdzenia kluczy obcych w każdym wierszu.

Obcinanie jest zwykle ultraszybkie, idealne do czyszczenia danych z tabeli tymczasowej. Zachowuje strukturę tabeli do wykorzystania w przyszłości.

Jeśli rzeczywiście chcesz usunąć definicje tabel, a także dane, po prostu usuń tabele.

Zobacz ten artykuł MSDN, aby uzyskać więcej informacji


4
Ponadto obcięcie tabeli powoduje zresetowanie materiału siewnego tożsamości. Może to być pomocne w testowaniu, ponieważ możesz skrócić tabelę i wstawić dane oraz wiedzieć, jakie będą wartości tożsamości za każdym razem. Możesz to zrobić, jeśli właśnie usunąłeś wszystkie dane w tabeli.
Jim,


87

DROP TABLE usuwa tabelę.

TRUNCATE TABLE opróżnia go, ale pozostawia jego strukturę dla przyszłych danych.


4
Człowieku, jest w tym o wiele więcej niż to, co wiesz;)
David Aldridge

21
To jest kluczowa różnica.
ceejayoz

26

DROP i TRUNC robią różne rzeczy:

TABELA PRAWIDŁOWA

Usuwa wszystkie wiersze z tabeli bez rejestrowania usunięcia poszczególnych wierszy. TRUNCATE TABLE jest podobna do instrukcji DELETE bez klauzuli WHERE; jednak TRUNCATE TABLE jest szybszy i zużywa mniej zasobów systemowych i dzienników transakcji.

DROP TABLE

Usuwa jedną lub więcej definicji tabel oraz wszystkie dane, indeksy, wyzwalacze, ograniczenia i specyfikacje uprawnień dla tych tabel.

Jeśli chodzi o prędkość, różnica powinna być niewielka. Zresztą, jeśli w ogóle nie potrzebujesz struktury tabeli, z pewnością użyj DROP.


20

Myślę, że masz na myśli różnicę między DELETE TABLE a TRUNCATE TABLE.

DROP TABLE

usunąć tabelę z bazy danych.

USUŃ TABELĘ

bez warunku usuń wszystkie wiersze. Jeśli istnieją wyzwalacze i odwołania, będzie to przetwarzane dla każdego wiersza. Indeks również zostanie zmodyfikowany, jeśli taki istnieje.

TABELA PRAWIDŁOWA

ustaw liczbę wierszy na zero i bez rejestrowania każdego wiersza. Że jest o wiele szybszy od obu.


4
set the row count zerow rzeczywistości ustawia wartość tożsamości z powrotem na początkową wartość tożsamości.
Filip De Vos

10

Żadna z tych odpowiedzi nie wskazuje na istotną różnicę w tych dwóch operacjach. Drop table to operacja, którą można cofnąć. Nie można jednak cofnąć operacji obcinania [„TRUNCATE TABLE” może być również wycofana]. W ten sposób upuszczenie bardzo dużej tabeli może być bardzo kosztowne, jeśli jest wiele wierszy, ponieważ wszystkie muszą być zapisane w tymczasowym miejscu na wypadek, gdybyś zdecydował się ją wycofać.

Zwykle, jeśli chcę pozbyć się dużego stołu, obcinam go, a następnie upuszczam. W ten sposób dane zostaną usunięte bez zapisu, a tabela może zostać usunięta, a to upuszczenie będzie bardzo niedrogie, ponieważ żadne dane nie muszą być rejestrowane.

Należy jednak podkreślić, że obcięcie powoduje po prostu usunięcie danych i opuszczenie tabeli, podczas gdy drop w rzeczywistości usunie dane i samą tabelę. (zakładając, że klucze obce nie wykluczają takiej akcji)


2
Nie jest to w pełni poprawne, TRUNCATE można wycofać w sensie BEGIN TRANSACTION, TRUNCATE TABLE, ROLLBACK, ale nie w sensie „przywracanie dzienników transakcji”. Rejestruje cofnięcie alokacji stron.
Mark Sowul

1
-1 DROPto w zasadzie tylko a, TRUNCATEpo którym następuje usunięcie metadanych tabeli z tabel systemowych. Zobacz to pytanie tutaj
Martin Smith

5

DROP Table

DROP TABLE [table_name];

Polecenie DROP służy do usuwania tabeli z bazy danych. Jest to polecenie DDL. Wszystkie wiersze, indeksy i uprawnienia tabeli również zostaną usunięte. Operacji DROP nie można cofnąć.

DELETE Table

DELETE FROM [table_name]
WHERE [condition];

DELETE FROM [table_name];

Polecenie DELETE jest poleceniem DML. Można go użyć do usunięcia wszystkich wierszy lub niektórych wierszy z tabeli na podstawie warunku określonego w klauzuli WHERE. Wykonywane jest za pomocą blokady wiersza, każdy wiersz w tabeli jest zablokowany do usunięcia. Utrzymuje dziennik transakcji, więc jest wolniejszy niż TRUNCATE. Operacje DELETE można cofnąć.

Tabela TRUNCATE

TRUNCATE TABLE [table_name];

Polecenie TRUNCATE usuwa wszystkie wiersze z tabeli. Nie rejestruje usunięcia każdego wiersza, zamiast tego rejestruje cofnięcie alokacji stron danych tabeli, co czyni go szybszym niż DELETE. Jest wykonywany za pomocą blokady tabeli, a cała tabela jest zablokowana w celu usunięcia wszystkich rekordów. Jest to polecenie DDL. Operacji TRUNCATE nie można wycofać.


To nie jest poprawne. Truncate and Drop można cofnąć. CREATE TABLE dbo.TestTruncate (ID INT) INSERT INTO dbo.TestTruncate (ID) VALUES (1) INSERT INTO dbo.TestTruncate (ID) VALUES (2) INSERT INTO dbo.TestTruncate (ID) VALUES (3) BEGIN TRAN TRUNCATE TABLE .TestTruncate DROP TABLE dbo.TestTruncate ROLLBACK SELECT * FROM dbo.TestTruncate DROP TABLE dbo.TestTruncate
InbetweenWeekends

4

TRUNCATE TABLE zachowuje wszystkie stare indeksy i tak dalej. DROP TABLE oczywiście pozbyłby się stołu i wymagałby ponownego utworzenia go później.


3

Drop całkowicie pozbywa się stołu, usuwając również definicję. Obetnij opróżnia tabelę, ale nie usuwa definicji.


3

Obcięcie tabeli powoduje opróżnienie tabeli. Usunięcie tabeli powoduje jej całkowite usunięcie. Każdy z nich będzie szybki, ale upuszczenie go prawdopodobnie będzie szybsze (w zależności od silnika bazy danych).

Jeśli już go nie potrzebujesz, upuść go, aby nie zaśmiecał schematu.


3

USUNĄĆ TableA zamiast TRUNCATE TableA? Powszechnym błędem jest przekonanie, że robią to samo. Bynajmniej. W rzeczywistości istnieje wiele różnic między nimi.

DELETE to operacja rejestrowana na podstawie wiersza. Oznacza to, że usunięcie każdego wiersza jest rejestrowane i fizycznie usuwane.

Możesz USUNĄĆ dowolny wiersz, który nie będzie naruszał ograniczenia, pozostawiając klucz obcy lub inne ograniczenie na miejscu.

TRUNCATE jest również operacją zarejestrowaną, ale w inny sposób. TRUNCATE rejestruje cofnięcie przydziału stron danych, na których istnieją dane. Cofnięcie alokacji stron danych oznacza, że ​​wiersze danych nadal istnieją na stronach danych, ale zakresy zostały oznaczone jako puste do ponownego wykorzystania. To sprawia, że ​​TRUNCATE jest szybszą operacją do wykonania niż DELETE.

Nie można TRUNCATE tabeli, która ma ograniczenia klucza obcego. Będziesz musiał usunąć ograniczenia, TRUNKOWAĆ stół i ponownie zastosować ograniczenia.

TRUNCATE zresetuje wszystkie kolumny tożsamości do domyślnej wartości inicjatora.


„Usunięcie każdego wiersza jest rejestrowane i fizycznie usuwane” . Czy na pewno to prawda? MSDN Blog mówi, że nie są one natychmiast usunięte. Tak też działa Postgres.
Brad Koch

2

truncate usuwa wszystkie wiersze, ale nie samą tabelę, jest zasadniczo równoważne z usuwaniem bez klauzuli gdzie, ale zwykle jest szybsze.


Obcinanie jest szybsze, ponieważ nie rejestruje transakcji (uważam), więc nie można wycofać się z obcięcia, tak jak w przypadku usunięcia.
Steven Murawski

2

Mam poprawkę do jednego z powyższych stwierdzeń… „Nie można wycofać obcięcia”

Obcięcie można cofnąć. Istnieją przypadki, w których nie można wykonać obcinania lub usuwania tabeli, na przykład w przypadku odwołania do klucza obcego. W przypadku zadania, takiego jak miesięczne raportowanie, prawdopodobnie po prostu upuściłbym tabelę, gdy już go nie potrzebowałem. Gdybym częściej wykonywał ten zestawienie raportów, prawdopodobnie zamiast tego zachowałbym tabelę i użyłbym obcięcia.

Mam nadzieję, że to pomoże, oto kilka dodatkowych informacji, które powinny okazać się przydatne ...

Więcej informacji można znaleźć w następującym artykule: http://sqlblog.com/blogs/denis_gobo/archive/2007/06/13/1458.aspx

Więcej informacji na temat usuwania i obcięcia można znaleźć w tym artykule: http://www.sql-server-performance.com/faq/delete_truncate_difference_p1.aspx

Dzięki! Jeff


2

TRUNCATE TABLE jest funkcjonalnie identyczna z instrukcją DELETE bez klauzuli WHERE: obie usuwają wszystkie wiersze z tabeli. Ale TRUNCATE TABLE jest szybsza i zużywa mniej zasobów systemowych i dzienników transakcji niż DELETE.

Instrukcja DELETE usuwa wiersze pojedynczo i rejestruje wpis w dzienniku transakcji dla każdego usuniętego wiersza. TRUNCATE TABLE usuwa dane, zwalniając przydziały stron danych używanych do przechowywania danych tabeli, a tylko zwolnienia stron są rejestrowane w dzienniku transakcji.

TRUNCATE TABLE usuwa wszystkie wiersze z tabeli, ale struktura tabeli i jej kolumny, ograniczenia, indeksy i tak dalej pozostają. Licznik używany przez tożsamość dla nowych wierszy jest resetowany do materiału siewnego kolumny. Jeśli chcesz zachować licznik tożsamości, użyj zamiast tego DELETE. Jeśli chcesz usunąć definicję tabeli i jej dane, użyj instrukcji DROP TABLE.

Nie można użyć TRUNCATE TABLE w tabeli, do której odwołuje się ograniczenie FOREIGN KEY; zamiast tego użyj instrukcji DELETE bez klauzuli WHERE. Ponieważ TRUNCATE TABLE nie jest rejestrowany, nie może aktywować wyzwalacza.

TABELI TRUNCATE nie można używać w przypadku tabel uczestniczących w widoku indeksowanym.

Z http://msdn.microsoft.com/en-us/library/aa260621(SQL.80).aspx


2

W standardzie SQL DROP table usuwa tabelę, a schemat tabeli - TRUNCATE usuwa wszystkie wiersze.


1

Odpowiedzi tutaj pasują do pytania, ale odpowiem na pytanie, którego nie zadałeś. „Powinienem użyć obcinania czy usuwania?” Jeśli usuwasz wszystkie wiersze z tabeli, zazwyczaj będziesz chciał obciąć, ponieważ jest to znacznie szybsze. Dlaczego jest dużo szybszy? Przynajmniej w przypadku Oracle, resetuje znak wysokiego poziomu . Jest to po prostu wyłuskiwanie danych i pozwala db na ich ponowne wykorzystanie do czegoś innego.


1

USUŃ VS TRUNCATE

  1. DELETEOświadczenie usuwa rzędach jeden na raz i rejestruje wpis w dzienniku transakcji dla każdego usuniętego wiersza. TRUNCATE TABLEusuwa dane poprzez zwalnianie przydziałów stron danych używanych do przechowywania danych tabeli i rejestruje tylko zwolnienia stron w dzienniku transakcji
  2. Możemy użyć WHEREklauzuli in, DELETEale TRUNCATEnie możesz jej użyć
  3. Gdy DELETEinstrukcja jest wykonywana przy użyciu blokady wiersza, każdy wiersz w tabeli jest zablokowany do usunięcia. TRUNCATE TABLEzawsze blokuje tabelę i stronę, ale nie każdy wiersz
  4. Po wykonaniu DELETEinstrukcji tabela może nadal zawierać puste strony.Jeśli operacja usuwania nie używa blokady tabeli, tabela (sterta) będzie zawierała wiele pustych stron. W przypadku indeksów operacja usuwania może pozostawić puste strony, chociaż te
    strony zostaną szybko cofnięte przez proces czyszczenia w tle
  5. TRUNCATE TABLE usuwa wszystkie wiersze z tabeli, ale struktura tabeli i jej kolumny, ograniczenia, indeksy itp. pozostają
  6. DELETEoświadczenie nie RESEEDkolumnę tożsamości, ale TRUNCATEoświadczenie kolumnyRESEEDSIDENTITY
  7. Nie możesz używać TRUNCATE TABLEna stołach, które:
    1. Są przywoływane przez FOREIGN KEYograniczenie. (Możesz obciąć tabelę, która ma klucz obcy, który odwołuje się do siebie).
    2. Weź udział w widoku indeksowanym.
    3. Są publikowane przy użyciu replikacji transakcyjnej lub replikacji scalającej
  8. TRUNCATE TABLE nie można aktywować wyzwalacza, ponieważ operacja nie rejestruje usuwania pojedynczych wierszy

1

Upuść cały stół i całą jego strukturę

obcinaj usuń wszystkie wiersze z tabeli różni się od usuwania tym, że usuwa również indeksy wierszy


1

Usuń instrukcję

Instrukcja Usuń usuń wiersze tabeli i zwróć liczbę wierszy jest usuwana z tabeli. W tej instrukcji używamy klauzuli where do usunięcia danych z tabeli

  • Instrukcja Delete jest wolniejsza niż instrukcja Truncate, ponieważ usuwa rekordy jeden po drugim

Instrukcja obcinania

Instrukcja obcięcia Usunięto lub usunięto wszystkie wiersze z tabeli.

  • Jest szybszy niż instrukcja usuwania, ponieważ usuwa wszystkie rekordy z tabeli
  • Instrukcja obcięcia nie zwraca liczby wierszy są usuwane z tabeli

Instrukcja upuść

Instrukcja Drop usunęła wszystkie rekordy, a także strukturę tabeli


0

USUNĄĆ

Polecenie DELETE służy do usuwania wierszy z tabeli. Klauzuli WHERE można użyć do usunięcia tylko niektórych wierszy. Jeśli nie określono warunku WHERE, wszystkie wiersze zostaną usunięte. Po wykonaniu operacji DELETE musisz ZATWIERDZIĆ lub ROLLBACK transakcję, aby zmiana była trwała lub cofnęła.

ŚCIĘTY

TRUNCATE usuwa wszystkie wiersze z tabeli. Operacji nie można cofnąć ... W związku z tym TRUCATE jest szybsze i nie zużywa tyle miejsca na cofnięcie, co DELETE.

Od: http://www.orafaq.com/faq/difference_between_truncate_delete_and_drop_commands

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.