SQL DELETE table – mazání + rozdíl DELETE vs TRUNCATE

Rozeznáváme 2 typy příkazu, které slouží k mazání datSQL příkazy DELETE a TRUNCATE (viz článek SQL TRUNCATE). Každý je jiny a hodí se pro jinou situaci. Je dobré znát oba a podle potřeby si vybrat.

Syntaxe (první varianta je optional):

DELETE FROM dbo.Tabulka
WHERE Podminka;

nebo

DELETE dbo.Tabulka
WHERE Podminka;

Na velké množství záznamů opatrně

Pomocí příkazu můžeme s tabulky vymazat záznamy a na rozdíl od TRUNCATE zde můžeme stanovit podmínku. Pokud podmínku nestanovíme, je smazána celá tabulka. Pokud příkaz nad tabulkou pustíme, je celý průběh zaznamenávám v transakčním logu. Proto je v tomto případě lepší použít TRUNCATE, protože je transakční log zatížen jen minimálně a průběh je daleko ryychlejší

U mazání velkého počtu záznamů se nám tím pádem může tato operace dost protáhnout. Navíc nám transakční log během operace dost nabobtná. Mazáním většího počtu záznamů může také dojít k locku celé tabulky. Pokud se chcete těmto problémům vyhnout, tak při použití v tomto příkazu nad velkým množstvím záznamů iterujte po předem daném množství mazaných záznamů, viz. cyklus:

Syntaxe pro velké množství záznamů:

WHILE 1 = 1
   BEGIN
   DELETE TOP (1000) FROM dbo.Tabulka
   WHERE Podminka
IF @@rowcount < 1000 BREAK;
END

Syntaxe na základě JOIN:

DELETE FROM dbo.Tabulka
FROM dbo.Tabulka AS A
INNER JOIN dbo.Tabulka_2 AS B
ON A.ID = B.ID
WHERE B.Podminka;

Skript bude mazat po 1000 záznamech a cyklus přeruší pokud  bude počet vymazaných záznamů nižší než 1000 = došlo k poslední iteraci.

Rozdíl DELETE vs TRUNCATE

Oba dva příkazy mažou z tabulky záznamy, existuje však mezi nimi řada rozdílů

  • Transakční log – zapisuje každý vymazaný záznam do transakčního logu a zpomaluje se tak celá operace
  • Indexované View – DELETE statement na rozdíl od TRUNCATE můžeme aplikovat na indexované view
  • Podmínka – u mazání můžeme stanovit podmínku, použít JOINY a table expression

Reagovat na příspěvek