sql >> Databáze >  >> RDS >> Sqlserver

SQL Server:DELETE vs TRUNCATE

T-SQL poskytuje dvě klíčová slova, která umožňují smazat data z tabulky. Jsou DELETE a ZKRÁTIT . Jsou si podobní v tom, co dělají, ale používají velmi odlišné metody. V tomto článku diskutujeme o základních mechanismech pro tato klíčová slova.

Rozdíl mezi TRUNCATE a DELETE

ZKRÁTIT:

  1. TRUNCATE je příkaz DDL.
  2. TRUNCATE TABLE vždy uzamkne tabulku a stránku. Nezamyká však každý řádek.
  3. Podmínku WHERE nelze použít.
  4. Příkaz odstraní všechna data.
  5. TRUNCATE TABLE nemůže aktivovat spouštěč, protože operace nezaznamenává smazání jednotlivých řádků.
  6. Rychlejší ve výkonu, protože neuchovává protokoly.
  7. Vrácení zpět je možné.

SMAZAT:

  1. DELETE je příkaz DML.
  2. Příkaz DELETE používá při provádění zámek řádku. Každý řádek v tabulce je uzamčen pro smazání.
  3. V klauzuli WHERE můžete zadat filtry.
  4. Příkaz smaže zadaná data, pokud existuje podmínka WHERE.
  5. DELETE aktivuje spouštěč, protože operace jsou protokolovány jednotlivě.
  6. DELETE je pomalejší než TRUNCATE, protože uchovává protokoly.
  7. Vrácení zpět je možné.

Jak smazat data pomocí TRUNCATE?

Následující příklad odstraní všechna data z tabulky Osoba. VYBRAT příkazy jsou zahrnuty před a za TRUNCATE TABLE prohlášení pro porovnání výsledků.

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

Zdůrazněme některé výhody.

ZKRÁTIT TABULKU příkaz odstraní všechny řádky z tabulky uvolněním datových stránek používaných k uložení dat tabulky. Jakmile je operace dokončena, tabulka obsahuje nula stránek. Neprovádí žádné protokolování pro odstranění jednotlivých řádků. Příkaz zaznamená dealokaci stránky do transakčního protokolu. ZKRÁTIT příkaz používá méně místa v protokolu. Obvykle se používá méně zámků. Příkaz odstraní všechny řádky z tabulky, ale struktura tabulky a její sloupce, omezení, indexy atd. zůstanou zachovány. Chcete-li odstranit stůl. musíte použít DROP TABLE .

Pokud tabulka obsahuje sloupec identity, počítadlo pro tento sloupec se resetuje na počáteční hodnotu definovanou pro sloupec. Pokud nebyl definován žádný zdroj, použije se výchozí hodnota 1. Chcete-li zachovat počítadlo identity, použijte DELETE místo toho.

Odstranění všech řádků pomocí DELETE

Následující příklad odstraní všechny řádky z tabulky Osoba:

DELETE FROM Person.Person;
GO

SMAZAT odstraní řádky jeden po druhém. Příkaz přidá nový záznam do protokolu transakcí pro každý odstraněný řádek. SMAZAT používá při provádění zámek řádku, což znamená, že každý řádek v tabulce je uzamčen pro odstranění. Jednou DELETE Pokud se provede, může tabulka stále obsahovat prázdné datové stránky. Například prázdné stránky v haldě nelze uvolnit bez alespoň exkluzivního (LCK_M_X) zámku tabulky. SMAZAT a ZKRÁTIT obojí lze vrátit zpět při použití s ​​TRANSACTION .

Přečtěte si také

Rozdíl mezi tabulkou DELETE a TRUNCATE v SQL Server


  1. Tipy pro pohovor správce databáze SQL

  2. Jak obnovit databázi SQL Server na Macu pomocí Azure Data Studio

  3. Co dělat, když při použití ovladače ODBC Easysoft Oracle verze OCI nelze otevřít soubor sdíleného objektu?

  4. Jak funguje SYS_GUID() v MariaDB