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.
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.
Odpowiedzi:
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
DROP TABLE usuwa tabelę.
TRUNCATE TABLE opróżnia go, ale pozostawia jego strukturę dla przyszłych danych.
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.
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.
set the row count zero
w rzeczywistości ustawia wartość tożsamości z powrotem na początkową wartość tożsamości.
Ż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)
DROP
to w zasadzie tylko a, TRUNCATE
po którym następuje usunięcie metadanych tabeli z tabel systemowych. Zobacz to pytanie tutaj
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 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ąć.
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ć.
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.
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.
truncate usuwa wszystkie wiersze, ale nie samą tabelę, jest zasadniczo równoważne z usuwaniem bez klauzuli gdzie, ale zwykle jest szybsze.
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
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
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.
DELETE
Oświadczenie usuwa rzędach jeden na raz i rejestruje wpis w dzienniku transakcji dla każdego usuniętego wiersza. TRUNCATE TABLE
usuwa dane poprzez zwalnianie przydziałów stron danych używanych do przechowywania danych tabeli i rejestruje tylko zwolnienia stron w dzienniku transakcjiWHERE
klauzuli in, DELETE
ale TRUNCATE
nie możesz jej użyćDELETE
instrukcja jest wykonywana przy użyciu blokady wiersza, każdy wiersz w tabeli jest zablokowany do usunięcia. TRUNCATE TABLE
zawsze blokuje tabelę i stronę, ale nie każdy wierszDELETE
instrukcji 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 TRUNCATE TABLE
usuwa wszystkie wiersze z tabeli, ale struktura tabeli i jej kolumny, ograniczenia, indeksy itp. pozostająDELETE
oświadczenie nie RESEED
kolumnę tożsamości, ale TRUNCATE
oświadczenie kolumnyRESEEDS
IDENTITY
TRUNCATE TABLE
na stołach, które:
FOREIGN KEY
ograniczenie. (Możesz obciąć tabelę, która ma klucz obcy, który odwołuje się do siebie).TRUNCATE TABLE
nie można aktywować wyzwalacza, ponieważ operacja nie rejestruje usuwania pojedynczych wierszyUsuń 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 obcinania
Instrukcja obcięcia Usunięto lub usunięto wszystkie wiersze z tabeli.
Instrukcja upuść
Instrukcja Drop usunęła wszystkie rekordy, a także strukturę tabeli
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