Megosztás a következőn keresztül:


TRUNCATE TABLE (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)Raktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Eltávolítja az összes sort egy táblából vagy egy tábla megadott partíciójából anélkül, hogy naplózta az egyes sorok törlését. TRUNCATE TABLE hasonló a DELETE utasításhoz, WHERE záradék nélkül; azonban TRUNCATE TABLE gyorsabb, és kevesebb rendszer- és tranzakciónapló-erőforrást használ.

Transact-SQL szintaxis konvenciói

Syntax

Szintaxis az SQL Serverhez, az Azure SQL Database-hez és a Fabric SQL Database-hez

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>

Szintaxis a Microsoft Fabrichez, az Azure Synapse Analyticshez és a párhuzamos adattárházhoz.

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

Arguments

database_name

Az adatbázis neve.

schema_name

Annak a sémának a neve, amelyhez a tábla tartozik.

table_name

A csonkítandó vagy az összes sorból eltávolított tábla neve. table_name konstansnak kell lennie. table_name nem lehet OBJECT_ID() függvény vagy változó.

WITH ( PARTÍCIÓK ( { <partition_number_expression> | <tartomány> } [ , ... n ] ) )

A: SQL Server 2016 (13.x) és újabb verziókra vonatkozik.

Megadja a csonkítandó vagy az összes sor eltávolítására szolgáló partíciót. Ha a tábla nincs particionálva, a WITH PARTITIONS argumentum hibát okoz. Ha a WITH PARTITIONS záradék nincs megadva, a teljes táblázat csonkolt lesz.

<partition_number_expression> a következő módokon adhatók meg:

  • Adja meg egy partíció számát, például: WITH (PARTITIONS (2))

  • Adja meg a partíciószámokat több, vesszővel elválasztott partícióhoz, például: WITH (PARTITIONS (1, 5))

  • Adja meg a tartományokat és az egyes partíciókat, például: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <range> a TOszó által elválasztott partíciószámokként is megadható, például: WITH (PARTITIONS (6 TO 8))

Particionált tábla csonkításához a táblát és az indexeket egymáshoz kell igazítani (ugyanazon a partíciófüggvényen particionálva).

Remarks

A DELETE állításhoz képest a TRUNCATE TABLE a következő előnyökkel jár:

  • Kevesebb tranzakciónapló-terület van használatban.

    A DELETE utasítás egyenként eltávolítja a sorokat, és minden törölt sorhoz rögzíti a tranzakciónaplóban szereplő bejegyzést. TRUNCATE TABLE az adatokat úgy távolítja el, hogy felszabadítja a tábla- és indexadatok tárolásához használt adatoldalakat, és csak az oldalelosztókat rögzíti a tranzakciónaplóban.

  • Általában kevesebb zárolást használnak.

    Amikor a DELETE utasítást sorzárolással hajtja végre, a rendszer a tábla minden sorát zárolja törlésre. TRUNCATE TABLE mindig zárolja a táblázatot (beleértve a séma (SCH-M) zárolását) és az oldalt, de nem minden sort.

  • Kivétel nélkül a táblában vagy indexeiben nulla lap marad.

    A DELETE utasítás végrehajtása után a táblázat továbbra is tartalmazhat üres oldalakat. A halom üres lapjai például nem oldhatók fel legalább kizárólagos (LCK_M_X) táblazárolás nélkül. Ha a törlési művelet nem használ táblazárolást, a táblázat (halom) sok üres lapot tartalmazhat. Indexek esetén az DELETE utasítás üres lapokat hagyhat hátra. Ezután egy háttérbeli törlési folyamat felszabadítja ezeket a lapokat.

TRUNCATE TABLE eltávolítja az összes sort egy táblából, de a táblázat szerkezete és oszlopai, megkötései, indexei stb. megmaradnak. Ha az adatokon kívül el szeretné távolítani a tábladefiníciót, használja a DROP TABLE utasítást.

Ha a tábla identitásoszlopot tartalmaz, az oszlop számlálója visszaáll az oszlophoz definiált kezdőértékre. Ha nincs meghatározva mag, a rendszer az alapértelmezett 1 értéket használja. Az identitásszámláló megőrzéséhez használja inkább a DELETE.

Egy TRUNCATE TABLE művelet visszaállítható egy tranzakción belül.

A Fabric SQL-adatbázisban a tábla csonkolásával törli az adott tábla összes tükrözött adatát a Fabric OneLake-ből.

Halasztott kiosztás

Ha egy 128-as vagy annál nagyobb mértéket használó táblázat csonkolva van, az adatbázismotor a tényleges oldalelosztókat és a hozzájuk tartozó zárolásokat a tranzakció véglegesítéséig kezeli. A csonkolás két külön fázisban történik: logikai és fizikai. A logikai fázisban a tábla és az indexei által használt meglévő foglalási egységek felosztásra vannak megjelölve, és zárolva lesznek, amíg a tranzakció véglegesítésre nem kerül. A fizikai fázisban a háttérfolyamat eltávolítja a felszabadításhoz megjelölt lapokat. Ez azt jelenti, hogy előfordulhat, hogy a felszabadított TRUNCATE TABLE terület nem lesz azonnal elérhető az új foglalásokhoz.

Ha a gyorsított adatbázis-helyreállítás engedélyezve van, a csonkolás a mértékek számától függetlenül külön logikai és fizikai fázisokat használ.

Limitations

Nem használhat TRUNCATE TABLE olyan táblákon, amelyek:

  • Egy FOREIGN KEY kényszer hivatkozik gombra. Csonkíthat egy olyan táblát, amely egy magára mutató idegen kulccsal rendelkezik.

  • Vegyen részt egy indexelt nézetben.

  • A közzététel tranzakciós replikációval vagy egyesítési replikációval történik.

  • A rendszer verziója időbeli.

  • Egy EDGE kényszer hivatkozik gombra.

Egy vagy több ilyen jellemzővel rendelkező táblák esetében használja inkább a DELETE utasítást.

TRUNCATE TABLE nem lehet aktiválni egy eseményindítót, mert a művelet nem naplózza az egyes sorok törlését. További információ: CREATE TRIGGER (Transact-SQL).

Az Azure Synapse Analytics and Analytics platformrendszerben (PDW):

  • TRUNCATE TABLE nem engedélyezett a EXPLAIN utasításban.

  • TRUNCATE TABLE tranzakción belül nem hajtható végre.

Permissions

A minimálisan szükséges engedély a ALTER. TRUNCATE TABLE a táblatulajdonos, a sysadmin rögzített kiszolgálói szerepkör tagjai, valamint a db_ownerdb_ddladmin rögzített adatbázis-szerepkörök alapértelmezett engedélyei, és nem ruházhatók át. A TRUNCATE TABLE utasítást azonban beépítheti egy modulba, például egy tárolt eljárásba, és a EXECUTE AS záradék használatával megfelelő engedélyeket adhat a modulnak.

Examples

A. Táblázat csonkálása

Az alábbi példa eltávolítja az összes adatot a JobCandidate táblából. SELECT utasítások a TRUNCATE TABLE utasítás előtt és után jelennek meg az eredmények összehasonlításához.

USE AdventureWorks2022;

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

TRUNCATE TABLE HumanResources.JobCandidate;

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

B. Táblapartíciók csonkálása

A: SQL Server 2016 (13.x) és újabb verziókra vonatkozik.

Az alábbi példa csonkolja a particionált tábla megadott partícióit. A WITH (PARTITIONS (2, 4, 6 TO 8)) szintaxis a 2, 4, 6, 7 és 8 partíciószám csonkítását okozza.

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

C. Csonkolási művelet visszaállítása

Az alábbi példa bemutatja, hogy egy tranzakción belüli TRUNCATE TABLE művelet visszaállítható.

  1. Hozzon létre egy három sorból álló teszttáblát.

    USE [tempdb];
    
    CREATE TABLE TruncateTest (ID INT IDENTITY (1, 1) NOT NULL);
    GO
    INSERT INTO TruncateTest DEFAULT VALUES;
    GO 3
    
  2. Ellenőrizze az adatokat a csonkálás előtt.

    SELECT ID FROM TruncateTest;
    
  3. Csonkítsa a táblát egy tranzakción belül, és ellenőrizze a sorok számát.

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

    Láthatja, hogy a tábla üres.

  4. A tranzakció visszaállítása és az adatok ellenőrzése.

    ROLLBACK TRANSACTION;
    
    SELECT ID FROM TruncateTest;
    

    Mindhárom sor megjelenik.

  5. Távolítsa el az asztalt.

    DROP TABLE TruncateTest;