T-SQL biedt twee trefwoorden waarmee u gegevens uit een tabel kunt verwijderen. Ze zijn VERWIJDEREN en TRUNCATE . Deze zijn gelijk in wat ze doen, maar ze gebruiken enorm verschillende methoden. In dit artikel bespreken we de onderliggende mechanismen voor deze zoekwoorden.
Een verschil tussen TRUNCATE en DELETE
AFKNOP:
- TRUNCATE is een DDL-commando.
- TRUNCATE TABLE vergrendelt altijd de tabel en pagina. Het vergrendelt echter niet elke rij.
- De WHERE-voorwaarde kan niet worden gebruikt.
- De opdracht verwijdert alle gegevens.
- TRUNCATE TABLE kan geen trigger activeren omdat de bewerking geen afzonderlijke rijverwijderingen registreert.
- Sneller in prestaties, omdat het geen logboeken bijhoudt.
- Terugdraaien is mogelijk.
VERWIJDEREN:
- VERWIJDEREN is een DML-opdracht.
- Delete-instructie gebruikt een rijvergrendeling tijdens het uitvoeren. Elke rij in de tabel is vergrendeld voor verwijdering.
- U kunt filters opgeven in de WHERE-component.
- De opdracht verwijdert gespecificeerde gegevens als de WHERE-voorwaarde bestaat.
- VERWIJDEREN activeert een trigger omdat de bewerkingen afzonderlijk worden vastgelegd.
- DELETE is langzamer dan TRUNCATE omdat het logs bijhoudt.
- Terugdraaien is mogelijk.
Hoe gegevens verwijderen met behulp van TRUNCATE?
In het volgende voorbeeld worden alle gegevens uit de tabel Persoon verwijderd. SELECTEER uitspraken zijn opgenomen voor en na de TRUNCATE TABLE verklaring om resultaten te vergelijken.
USE AdventureWorks2012;
GO
SELECT COUNT(*) AS BeforeTruncateCount
FROM Person.Person;
GO
TRUNCATE TABLE Person.Person;
GO
SELECT COUNT(*) AS AfterTruncateCount
FROM Person.Person;
GO
Laten we enkele voordelen uitlichten.
De TRUNCATE TABLE opdracht verwijdert alle rijen uit een tabel door de toewijzing van de gegevenspagina's die worden gebruikt om de tabelgegevens op te slaan, ongedaan te maken. Zodra de bewerking is voltooid, bevat de tabel nul pagina's. Het houdt geen logboek bij voor het verwijderen van afzonderlijke rijen. De opdracht legt de toewijzing van pagina's vast in het transactielogboek. De TRUNCATE opdracht gebruikt minder logboekruimte. Er worden doorgaans minder sloten gebruikt. De opdracht verwijdert alle rijen uit een tabel, maar de tabelstructuur en de kolommen, beperkingen, indexen, enzovoort blijven behouden. Om de tafel te verwijderen. je moet DROP TABLE . gebruiken .
Als een tabel een identiteitskolom bevat, wordt de teller voor die kolom teruggezet op de beginwaarde die voor de kolom is gedefinieerd. Als er geen seed is gedefinieerd, wordt de standaardwaarde 1 gebruikt. Gebruik DELETE . om de identiteitsteller te behouden in plaats daarvan.
Alle rijen verwijderen met DELETE
In het volgende voorbeeld worden alle rijen uit de tabel Persoon verwijderd:
DELETE FROM Person.Person;
GO
VERWIJDEREN verwijdert rijen één voor één. De opdracht voegt de nieuwe record toe aan het transactielogboek voor elke verwijderde rij. VERWIJDEREN gebruikt een rijvergrendeling tijdens het uitvoeren, wat betekent dat elke rij in de tabel is vergrendeld voor verwijdering. Eenmaal VERWIJDEREN wordt uitgevoerd, kan een tabel nog lege gegevenspagina's bevatten. Lege pagina's in de heap kunnen bijvoorbeeld niet ongedaan worden gemaakt zonder ten minste een exclusieve (LCK_M_X) tabelvergrendeling. VERWIJDEREN en TRUNCATE beide kunnen worden teruggedraaid bij gebruik met TRANSACTIE .
Lees ook
Verschil tussen DELETE- en TRUNCATE-tabel in SQL Server