DBCC je zkratka pro database console commands, kdy jsou příkazy prováděné nad určitou databází. Sada DBCC příkazů umožňuje vykonávat určité administrační operace nebo dotazy nad databázemi formou skriptování místo používání grafického rozhraní management studia. Pro exekuci těchto příkazů musíte mít většinou velmi silnou roli (sysadmin, serveradmin, db_owner, atp).
Příkazy se dělí do několika skupin:
- Údržba (maintenance) – skupina příkazů vykonávajících operace provádějící údržbu nad tabulkami, indexy nebo soubory
- Informační – po spuštění těchto příkazů se zobrazí nějaká informace o dané databázi
- Validační – příkazy, které ověřují konzistenci objektů
- Ostatní – zapínání a vypínání nějaké funkcionality
Obecně se nedoporučuje většinu příkazů vůbec pouštět pokud nemáte silné znalosti administrace SQL Server. Níže uvedu příklady zajímavých příkazů. Červeně jsou označeny příkazy, které mohou mít dočasně dramatický dopad na výkon.
Maintenance pomocí příkazů DBCC
DBCC DBREINDEX – provede REBUILD indexu pro danou tabulku
DBCC DROPCLEANBUFFERS – pokud je nějaký dotaz pouštěn opakovaně, tak SQL Server ukládá výsledek do buffer poolu aby dokázal výsledek rychleji načíst. Tento příkaz se používá pokud chceme třeba testovat dotazy s čistým buffer poolem
(!) DBCC FREEPROCACHE – Provede vyčištění cache a exekučních plánů. Může vést ke značnému zpomalení pravidelně opakujících se dotazů – než se znovu vytvoří plány tak to nějakou dobu trvá. Někdy se tento DBCC command používá pokud chceme záměrně plány vyčistit např. proto, že jsou nad databázi provedeny takové změny, pro které jsou staré exekuční plány neefektivní a chceme je načíst znovu.
(!) DBCC SHRINKDATABASE – provede shrink datových (.mdf, .ndf) a logovacích (.ldf) souborů. Používá se pokud máme u databáze mnoho nealokovaného prostoru (např. db 100 GB a unallocated space 50GB. Po provedení shrinku se velikost datového souborů změnší na 50GB. Pozor shrink trvá velmi dlouho. Tento příkaz nemaže data z databáze. To znamená, že kapacitu uvolňuje pouze z nevyužitého prostoru na databázovém souboru. Po provedení shrinku se dramaticky zvýší fragmentace indexů a je tedy potřeba provést údržbu indexů (REBUILD nebo REORGANIZE). Během shrinku dojde k exkluzivnímu locku nad objekty a k snížení použitelnosti DB. Je proto vhodné shrink používat co možná nejméně a mimo business hours.
(!) DBCC SHRINKFILE – funguje podobně jako shrinkdatabase s tím rozdílem, že SHRINKFILE provádí shrink pouze nad 1 souborem kdežto SHRINKDATABASE nad všemi soubory, které jsou přiřazeny k dané databázi.
Příklad na SHRINKDATABASE
Mějme volně dostupnou sample databázi Microsoftu AdventureworksDW2016CTP3, která má 2 soubory:
- primární AdventureworksDW2016CTP3_Data.mdf (5334 MB)
- logovací AdventureworksDW2016CTP3_Log.ldf (147 MB)
Zjištění seznam u objektů v SQL databázi
Pomocí skriptu na zjištění velikostí objěktů v databázi (viz. článek SQL Počet řádků a velikost tabulek v databázi + skript) si nechám zobrazit seznam objektů a jejich velikostí a jeden z nich vymažu. Rozhodl jsem se vymazat objekt FactResellerSalesXL_PageCompressed a tím uvolnit 2508 MB.
Zjistím aktuální velikost SQL databáze pomocí sp_spaceused
Přes vlastnosti databáze nebo systémovou proceduru sp_spaceused zjistím aktuální velikost databáze a vidím že velikost datového souboru se nezměnila, ale zvýšil se nevyužitý prostor přesně o kapacitu vymazaného objektu z předchozího kroku.
Vyčištění nevyužitého prostoru v databízi pomocí SHRINKDATABASE
Pokud chci takto nevyužitý prostor fyzicky uvolnit, musím provést SHRINKDATABASE. Musím počítat s tím, že příkaz pojede delší dobu. Doba trvání nad 5GB databází byla 13 minut
Informační DBCC příkazy
Informační příkazy nejsou rizikové, nic nedělají a pouze zobrazují informace:
- DBCC INPUTBUFFER – užitečný příkaz, zobrazí text posledního spuštěného SQL příkazu v rámci nějaké session. (Syntaxe je DBCC INPUTBUFFER (cislo session))
- DBCC OPENTRAN – zobrazí informace o naposledy otevřených transakcích
- DBCC SHOW_STATISTICS – zobrazí seznam statistik nad určitou tabulkou
- DBCC SHOWCONTIG – zobrazí informace o fragmentaci určitého objektu
Validation DBCC – kontrolní (check) skripty
V této skupině příkazů najdeme ty, které vykonávají nějaké kontrolní operace (mají prefix CHECK). Uvedu pouze 1 nejduležitější příkaz.
DBCC CHECKDB – kontrola konzistence SQL databáze
Jednou za čas by měl pravidelně pouštět každý db admin. Provede kontrolu konzistence databáze (fyzické i logické konzistence). Provádí kontrolu všech objektů v dané databázi.
Ostatní příkazy na validaci databáze
Kategorie validation obsahuji i jiné (CHECKALLOC, CHECKCATALOG, CHECKCONSTRAINTS, atp), ale příkaz CHECKDB pokryje všechny z nich, proto je tu neuvádím.
Více informací o DBCC příkazech najdete na webu Microsoft, v kategorii About DBCC a dalších podstránek dokumentace