sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server:DELETE vs TRUNCATE

T-SQL tillhandahåller två nyckelord som låter dig radera data från en tabell. De är RADERA och TRUNCATE . Dessa är lika i vad de gör, men de använder väldigt olika metoder. I den här artikeln diskuterar vi de underliggande mekanismerna för dessa sökord.

En skillnad mellan TRUNCATE och DELETE

TRUNCATE:

  1. TRUNCATE är ett DDL-kommando.
  2. TRUNCATE TABLE låser alltid tabellen och sidan. Den låser dock inte varje rad.
  3. WHERE-villkoret kan inte användas.
  4. Kommandot tar bort all data.
  5. TRUNCATE TABLE kan inte aktivera en utlösare eftersom operationen inte loggar borttagningar av enskilda rader.
  6. Snabbare i prestanda, eftersom det inte sparar loggar.
  7. Återställning är möjlig.

RADERA:

  1. DELETE är ett DML-kommando.
  2. DELETE-satsen använder ett radlås under exekvering. Varje rad i tabellen är låst för radering.
  3. Du kan ange filter i WHERE-satsen.
  4. Kommandot raderar specificerad data om WHERE-villkoret existerar.
  5. DELETE aktiverar en utlösare eftersom operationerna loggas individuellt.
  6. DELETE är långsammare än TRUNCATE eftersom det sparar loggar.
  7. Återställning är möjlig.

Hur tar man bort data med hjälp av TRUNCATE?

Följande exempel tar bort all data från tabellen Person. VÄLJ satser inkluderas före och efter TRUNCATE TABLE uttalande för att jämföra resultat.

USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM Person.Person;
GO
TRUNCATE TABLE Person.Person;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM Person.Person;
GO

Låt oss lyfta fram några fördelar.

TRUNCATE TABLE kommandot tar bort alla rader från en tabell genom att deallokera datasidorna som används för att lagra tabelldata. När operationen är klar innehåller tabellen noll sidor. Det gör ingen loggning för de enskilda radraderingarna. Kommandot registrerar sidavallokering till transaktionsloggen. TRUNCATE kommandot använder mindre loggutrymme. Färre lås används vanligtvis. Kommandot tar bort alla rader från en tabell, men tabellstrukturen och dess kolumner, begränsningar, index och så vidare finns kvar. För att ta bort bordet. du måste använda DROP TABLE .

Om en tabell innehåller en identitetskolumn, återställs räknaren för den kolumnen till det frövärde som definierats för kolumnen. Om inget frö har definierats används standardvärdet 1. Använd DELETE för att behålla identitetsräknaren istället.

Ta bort alla rader genom att använda DELETE

Följande exempel tar bort alla rader från tabellen Person:

DELETE FROM Person.Person;
GO

RADERA tar bort rader en i taget. Kommandot lägger till den nya posten i transaktionsloggen för varje raderad rad. RADERA använder ett radlås under exekvering, vilket innebär att varje rad i tabellen är låst för radering. En gång RADERA exekveras, kan en tabell fortfarande innehålla tomma datasidor. Till exempel kan tomma sidor i högen inte deallokeras utan åtminstone ett exklusivt (LCK_M_X) tabelllås. RADERA och TRUNCATE båda kan rullas tillbaka när de används med TRANSACTION .

Läs också

Skillnaden mellan DELETE och TRUNCATE Tabell i SQL Server


  1. Escape-funktion för reguljära uttryck eller LIKE-mönster

  2. Vad är effekten av att placera commit efter DML i proceduren?

  3. Blackout med EMCLI

  4. PIVOT i sql 2005