Udostępnij za pomocą


STÓŁ OBCIĘĆ (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Magazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric

Usuwa wszystkie wiersze z tabeli lub określonych partycji tabeli bez rejestrowania pojedynczych operacji usuwania wierszy. TRUNCATE TABLE jest podobna do instrukcji DELETE bez klauzuli WHERE; jednak TRUNCATE TABLE jest szybsza i używa mniejszej liczby zasobów dziennika systemu i transakcji.

Transact-SQL konwencje składni

Syntax

Składnia dla programu SQL Server, usługi Azure SQL Database, bazy danych SQL fabric

TRUNCATE TABLE
    { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }
    [ , ...n ] ) ) ]
[ ; ]

<range> ::=
<partition_number_expression> TO <partition_number_expression>

Składnia usług Microsoft Fabric, Azure Synapse Analytics i Parallel Data Warehouse.

TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }
[ ; ]

Arguments

database_name

Nazwa bazy danych.

schema_name

Nazwa schematu, do którego należy tabela.

table_name

Nazwa tabeli do obcinania lub usuwania wszystkich wierszy. table_name musi być literałem. table_name nie może być funkcją OBJECT_ID() ani zmienną.

WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ... n ] ) )

Dotyczy: SQL Server 2016 (13.x) i nowszych wersjach.

Określa partycje, które mają zostać obcięte lub z których wszystkie wiersze są usuwane. Jeśli tabela nie jest partycjonowana, argument WITH PARTITIONS generuje błąd. Jeśli nie podano klauzuli WITH PARTITIONS, cała tabela zostanie obcięta.

<partition_number_expression> można określić w następujący sposób:

  • Podaj liczbę partycji, na przykład: WITH (PARTITIONS (2))

  • Podaj numery partycji dla kilku pojedynczych partycji rozdzielonych przecinkami, na przykład: WITH (PARTITIONS (1, 5))

  • Podaj zarówno zakresy, jak i poszczególne partycje, na przykład: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <range> można określić jako numery partycji oddzielone wyrazem TO, na przykład: WITH (PARTITIONS (6 TO 8))

Aby obcinać tabelę partycjonowaną, należy wyrównać tabelę i indeksy (partycjonowane w tej samej funkcji partycji).

Remarks

W porównaniu z instrukcją DELETETRUNCATE TABLE ma następujące zalety:

  • Jest używana mniejsza ilość miejsca w dzienniku transakcji.

    Instrukcja DELETE usuwa wiersze pojedynczo i rejestruje wpis w dzienniku transakcji dla każdego usuniętego wiersza. TRUNCATE TABLE Usuwa dane przez cofnięcie przydziału stron danych używanych do przechowywania danych tabeli i indeksu oraz rejestruje tylko przydziały strony w dzienniku transakcji.

  • Zwykle jest używana mniejsza liczba blokad.

    Po wykonaniu instrukcji DELETE przy użyciu blokady wiersza każdy wiersz w tabeli jest zablokowany do usunięcia. TRUNCATE TABLE zawsze blokuje tabelę (w tym schemat (SCH-M) i stronę, ale nie każdy wiersz.

  • Bez wyjątku strony zerowe pozostają w tabeli lub jej indeksach.

    Po wykonaniu instrukcji DELETE tabela może nadal zawierać puste strony. Na przykład nie można cofnąć przydziału pustych stron w stercie bez co najmniej wyłącznego (LCK_M_X) blokady tabeli. Jeśli operacja usuwania nie używa blokady tabeli, tabela (sterta) może zawierać wiele pustych stron. W przypadku indeksów DELETE instrukcja może pozostawić puste strony. Następnie proces oczyszczania w tle cofa przydział tych stron.

TRUNCATE TABLE usuwa wszystkie wiersze z tabeli, ale struktura tabeli i jej kolumny, ograniczenia, indeksy itd. pozostają. Aby usunąć definicję tabeli oprócz jej danych, użyj instrukcji DROP TABLE.

Jeśli tabela zawiera kolumnę tożsamości, licznik dla tej kolumny zostanie zresetowany do wartości inicjatora zdefiniowanej dla kolumny. Jeśli nie zdefiniowano inicjatora, zostanie użyta wartość domyślna 1. Aby zachować licznik tożsamości, użyj DELETE zamiast tego.

Operację TRUNCATE TABLE można wycofać w ramach transakcji.

W bazie danych SQL sieci szkieletowej obcinanie tabeli powoduje usunięcie wszystkich zdublowanych danych z usługi Fabric OneLake dla tej tabeli.

Odroczona delokacja

Gdy tabela, która używa co najmniej 128 zakresów, zostanie obcięta, aparat bazy danych wyzywając rzeczywiste przydziały strony i skojarzone z nimi blokady do momentu zatwierdzenia transakcji. Obcięcie odbywa się w dwóch oddzielnych fazach: logicznych i fizycznych. W fazie logicznej istniejące jednostki alokacji używane przez tabelę i jej indeksy są oznaczone do cofnięcia przydziału i zablokowane do momentu zatwierdzenia transakcji. W fazie fizycznej proces w tle usuwa strony oznaczone do cofnięcia przydziału. Oznacza to, że przestrzeń zwolniona przez TRUNCATE TABLE program może nie być natychmiast dostępna dla nowych alokacji.

Jeśli przyspieszone odzyskiwanie bazy danych jest włączone, obcięcie używa oddzielnych faz logicznych i fizycznych niezależnie od liczby zakresów.

Limitations

Nie można używać TRUNCATE TABLE w tabelach, które:

  • Są przywoływane przez ograniczenie FOREIGN KEY. Możesz obcinać tabelę z kluczem obcym, który się odwołuje.

  • Weź udział w widoku indeksowanym.

  • Są publikowane przy użyciu replikacji transakcyjnej lub replikacji scalania.

  • Są czasowo wersjonowane przez system.

  • Są przywoływane przez ograniczenie EDGE.

W przypadku tabel z co najmniej jedną z tych cech należy użyć instrukcji DELETE.

TRUNCATE TABLE nie można aktywować wyzwalacza, ponieważ operacja nie rejestruje pojedynczych usunięć wierszy. Aby uzyskać więcej informacji, zobacz CREATE TRIGGER (Transact-SQL).

W usłudze Azure Synapse Analytics and Analytics Platform System (PDW):

  • TRUNCATE TABLE nie jest dozwolone w instrukcji EXPLAIN.

  • TRUNCATE TABLE Nie można wykonać wewnątrz transakcji.

Permissions

Minimalne wymagane uprawnienia są ALTER w table_name. TRUNCATE TABLE uprawnienia domyślne dla właściciela tabeli, członków stałej sysadmin roli serwera i db_ownerdb_ddladmin stałych ról bazy danych i nie są przenoszone. Można jednak dołączyć instrukcję TRUNCATE TABLE w module, taką jak procedura składowana, i udzielić odpowiednich uprawnień do modułu przy użyciu klauzuli EXECUTE AS.

Examples

A. Obcinanie tabeli

Poniższy przykład usuwa wszystkie dane z tabeli JobCandidate. SELECT instrukcje są uwzględniane przed i po instrukcji TRUNCATE TABLE w celu porównania wyników.

USE AdventureWorks2022;

SELECT COUNT(*) AS BeforeTruncateCount
FROM HumanResources.JobCandidate;

TRUNCATE TABLE HumanResources.JobCandidate;

SELECT COUNT(*) AS AfterTruncateCount
FROM HumanResources.JobCandidate;

B. Obcinanie partycji tabeli

Dotyczy: SQL Server 2016 (13.x) i nowszych wersjach.

Poniższy przykład obcina określone partycje tabeli partycjonowanej. Składnia WITH (PARTITIONS (2, 4, 6 TO 8)) powoduje obcięcie liczb partycji 2, 4, 6, 7 i 8.

TRUNCATE TABLE PartitionTable1
WITH (PARTITIONS (2, 4, 6 TO 8));
GO

C. Wycofywanie operacji obcinania

W poniższym przykładzie pokazano, że można wycofać operację TRUNCATE TABLE wewnątrz transakcji.

  1. Utwórz tabelę testową z trzema wierszami.

    USE [tempdb];
    
    CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL);
    GO
    INSERT INTO TruncateTest DEFAULT VALUES;
    GO 3
    
  2. Sprawdź dane przed obcięciem.

    SELECT ID FROM TruncateTest;
    
  3. Obcinanie tabeli w ramach transakcji i sprawdzanie liczby wierszy.

    BEGIN TRANSACTION;
    
    TRUNCATE TABLE TruncateTest;
    
    SELECT ID FROM TruncateTest;
    

    Zobaczysz, że tabela jest pusta.

  4. Wycofaj transakcję i sprawdź dane.

    ROLLBACK TRANSACTION;
    
    SELECT ID FROM TruncateTest;
    

    Zostaną wyświetlone wszystkie trzy wiersze.

  5. Wyczyść tabelę.

    DROP TABLE TruncateTest;