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

SQL Server – Rozeberte vnitřní části sp_spaceused

Tento článek se snaží rozebrat výstup sp_spaceused uložená procedura.

Úvod

Při definování správné velikosti databáze hraje zásadní roli porozumění vnitřním stránkám používání databáze a trendům růstu. sp_spaceused je pravděpodobně nejrozšířenější systémová uložená procedura správce k nalezení místa na disku používaného databází. To pomáhá získat rychlý přehled o využití databáze. statistika. sp_spaceused se používá k zobrazení počtu řádků, velikosti dat, velikosti indexu, množství použitého místa, nevyužitého místa každým objektem a nepřidělené velikosti databáze. I když se podíváme na hodnoty dané sp_spaceused, neměli bychom myslet na zmenšování databáze nebo datového souboru nebo souboru protokolu. Mnohokrát si neuvědomujeme, co děláme. Mnohokrát nevíme, jaké by byly důsledky provádění takových operací se zdroji. Výstup sp_spaceused nám říká hodně o aktuálním výkonu databáze. Nepřiděleno sloupec a nepoužité sdělte nám volné místo, které zbývá v databázi a na úrovních tabulky.

Tento článek se zabývá:

  1. Nahlédnutí do sp_spaceused
  2. Vliv nastavení automatického růstu na sloupce, nepřidělené a nevyužité
  3. Vyhledání podrobností o využití prostoru na úrovni databáze a instance
  4. Měření událostí automatického růstu
  5. Zjištění velikosti souborů mdf a ldf
  6. Faktory určující výkon databáze
  7. A další…

Interní prvky sp_spaceused

Zachyťte podrobnosti o využití prostoru všech tabulek

V níže uvedeném T-SQL se nezdokumentovaná uložená procedura sp_MSforeachtable používá k procházení všemi tabulkami v rozsahu aktuálního databázového kontextu, aby se získaly metriky využití prostoru všech tabulek v kontextu.

Deklarujte @tbl_sp_spaceused table( název varchar(100) NULL, řádky bigint NULL, vyhrazené varchar(20) NULL, data varchar(20) NULL, index_size varchar(20) NULL, nepoužitý varchar(20) NULL)-- vložit výstup sp_spaceused do tabulky proměnná INSERT INTO @tbl_sp_spaceused ( název, řádky, rezervováno, data, velikost_indexu, nepoužito )EXEC sp_MSforeachtable @command1 ='EXEC sp_spaceused [?]'SELECT *FROM @tbl_sp_spaceusedorder by řádky desc

Zachyťte podrobnosti o využití prostoru všech databází

Nezdokumentovaná uložená procedura sp_MSforeachDB se používá k procházení celé databáze v rozsahu aktuální instance SQL a získávání informací o využití prostoru všech databází.

deklarujte tabulku @tbl_sp_spaceusedDBs( název_databáze varchar(100) NOT NULL, velikost_databáze varchar(50) NULL, nepřidělená varchar(30) NULL, vyhrazená varchar(20) NULL, data varchar(20) NULL, velikost_indexu varchar(20) NULL , unused varchar(20) NULL )INSERT INTO @tbl_sp_spaceusedDBs (název_databáze, velikost_databáze, nepřiděleno, vyhrazeno, data, velikost_indexu, nepoužívané )EXEC sp_msforeachdb @command1="použít ? exec sp_spaceused @oneresultset =1" SELECT_DATABÁZE, @tbl_DER_DATABROM database_size

Zde název_databáze je název databáze; v tomto případě PythonSample . velikost_databáze je Uallocated+Reserved+Data+Index+Unused =MDF +LDF (=848 MB v tomto případě). Nepřiděleno místo je zde 51,94 MB.

Toto je ve skutečnosti hranice disku, která byla označena pro databázi. Sp_spaceused zobrazuje nepřidělený sloupec definovaný na úrovni databáze a není vyhrazen pro žádnou tabulku a může být obsazen prvním objektem, který si nárokuje více prostoru pro růst.

Nepřiděleno prostor je volné místo v datovém souboru, takže se nemusí automaticky zvětšovat pokaždé, když zadáte dotaz; SQL Server Storage Engine obvykle spravuje automatický růst pomocí mechanismu známého jako algoritmus proporcionálního plnění. Správa rozsahů se provádí efektivně na základě počtu zápisů do souborů. A zároveň, když použitý prostor dosáhne prahové hodnoty, spustí se událost pro další automatický růst. Nastavení správné hodnoty nepřiděleného prostoru závisí na potřebách a situacích a povaze použití databáze. Nepřidělené místo je prostor, který se ještě nevyužívá a je „k dispozici“. V podstatě jsou tyto rozsahy označeny bitem 1 na stránce GAM. Pochopení konceptu automatického růstu shora, jakýkoli typ růstu může generovat další nepřidělené rozsahy.

Pomocí následujícího SQL dotazu můžeme vidět, kolikrát byla událost automatického růstu vygenerována, spolu s dobou, po kterou byla databáze pro proces pozastavena.

DECLARE @fname NVARCHAR(1000);-- Získejte název aktuálního výchozího traceSELECT @fname =CAST(hodnota AS VARCHAR(MAX))FROM ::fn_trace_getinfo(DEFAULT)WHERE traceid =1 AND vlastnost =2;SELECT ft.StartTime [Čas zahájení] ,t.name [Název události] ,DB_NAME(ft.databaseid) [Název databáze] ,ft.Filename [Název souboru] ,(ft.IntegerData*8)/1024.0 [Růst MB] ,( ft.duration/1000) [Duration MS]FROM ::fn_trace_gettable(@fname, DEFAULT) AS ft INNER JOIN sys.trace_events AS t ON ft.EventClass =t.trace_event_id WHERE (ft.EventClass =92 -- DatethFile Auto-grow NEBO ft.EventClass =93) -- LogFile Auto-growthORDER BY ft.StartTime

Podívejme se, co jednotlivé termíny znamenají:

Rezervováno :Prostor vyhrazený pro použití databázovými objekty =(Data + Index + Nepoužité ) =476704 + 1280 + 1312 =479296 kB. To ukazuje, jak jsou objekty plné; v ideálním případě se pro transakční tabulky očekává 10 % nevyužitého prostoru.

Data :Skutečná velikost dat. Toto je součet všech datových souborů databáze.

Index :Množství místa použitého indexem.

Poznámka:V některých případech jsem viděl, že velikost indexu je větší než velikost skutečných dat. Co se týče indexů, to, co je pro systém potřeba, vždy závisí na výkonu databáze. Operace čtení jsou mnohokrát důležitější než operace zápisu. A v některých jiných případech jsou zápisy důležitější než čtení. V případech, kdy se firma rozhodla, že čtení je mnohem důležitější než zápis, může tento systém potřebovat spoustu indexů, aby uspokojil výkonnostní požadavky firmy a uživatelů.

Nepoužité :Část vyhrazeného prostoru, která ještě není využita

Nepoužité jsou stránky v přidělených oblastech, ale zatím je nepoužívá žádný objekt. Jakmile je rozsah přidělen (ať už jako jednotný nebo sdílený), získáme osm rezervovaných stránek na tomto rozsahu. Některé stránky jsou použité a některé nepoužité.

nepoužité a nepřiděleno sloupce ve výstupu mohou být matoucí. Pro upřesnění, nepoužité sloupcový výstup neukazuje množství volného místa zbývajícího v celé databázi. Místo toho je to celkové množství prostoru vyhrazeného pro tabulky, ale nezaplněného daty. V mnoha případech lze nevyužitý prostor získat zpět vytvořením seskupeného indexu nebo správou existujících indexů.

Výstup sp_spaceused lze dále zjednodušit a zjistit velikost souboru .mdf a souborů .log. Součet rezervovaného prostoru a nepřiděleného prostoru se víceméně rovná velikosti datového souboru – neboli MDF – souboru. Odečtením velikosti souboru MDF od velikosti databáze také získáte velikost souboru protokolu.

Zde jsou tedy dva vzorce:

Velikost souboru MDF =vyhrazené + nepřidělené místo

Velikost souboru protokolu =Database_Size – Velikost souboru MDF

SELECT 476704+ 1280+ 1312 'Rezervované kB', (479296/1024,00)+51,94 'MDFSizeMB', 848,00 - ((479296/1024,00)+51,94 MB'pregSize> 51,94 MB''Lo 

Výše uvedené body nám říkají, jak je každý ze sloupců ve výstupu sp_spaceused interpretován, vypočítáván a analyzován.

Dopad nastavení automatického růstu

Počáteční velikosti a konfigurace automatického růstu mají významný vliv na nevyužitý prostor. Stanovit pro ně správné hodnoty je výzva. Viděl jsem mnoho případů, kdy byl automatický růst nastaven na růst v procentech. Předpokládejme, že automatický růst je nastaven na 25 % pro datový soubor o velikosti 100 GB. K zaplnění diskové jednotky jsou zapotřebí pouze 4 události automatického růstu.

Druhým případem je přestavba indexů. Tato operace má přímý dopad na nevyužitý prostor tabulky, protože data jsou přeskupována mezi jednotným a smíšeným rozsahem. V několika případech může operace při přehazování stránek způsobit nepřidělené místo kvůli nastavení automatického růstu datového souboru.

Uvažujme scénář, kdy nastavení automatického růstu není v databázi správně nastaveno. Toto je opět problém:Pokud je v databázi povolen automatický růst, znamená to, že expanze disku proběhne automaticky během nějaké události, i když data nevyužívají veškerý prostor.

Vždy je dobré nastavit pro datový soubor vhodné nastavení automatického růstu. Někdy může nesprávné nastavení datového souboru způsobit fyzickou fragmentaci, což má za následek vážné snížení výkonu systému. Jinými slovy, pokud nemáte nepřidělené místo, nová data se pokusí sedět na prázdných místech, která mohou být rozptýlena. To platí i pro soubor protokolu. Nepřidělené místo v databázi nepřímo ovlivňuje nastavení automatického růstu datového souboru a souboru protokolu a přímo ovlivňuje výkon. Jejich klíčem je nalezení správné rovnováhy.

Zabalení

  1. V procesu vytváření databáze není definovaná velikost (tj. počáteční velikost) ničím jiným než skutečnou velikostí databáze. Tato počáteční velikost je zaznamenána v záhlaví stránky. Během procesu zmenšování databáze používá proces minimální velikost vlastnost jako odkaz, pouze pokud je skutečná velikost dat menší než minimální velikost – minimální velikost je také nalezena v záhlaví stránky a lze ji zobrazit pomocí příkazu DBCC PAGE. Stejný proces také platí pro DBCC SHRINKFILE, který zmenšuje soubory na menší, než je jejich původní velikost.
  2. Nedoporučuje se zmenšovat databázi, aby se uvolnilo místo na disku, ačkoli rozhodnutí závisí na scénáři – neobvyklé scénáře mohou vyžadovat nekonvenční akci. Je však třeba si uvědomit, že zmenšením databáze dochází k fragmentaci databáze. Vždy je dobré analyzovat hlavní příčinu nepřiděleného prostoru a nevyužité místo objektů. V mnoha případech by bylo vhodné/doporučované rozšíření disku pro zvládnutí nárůstu dat.
  3. Konfigurace automatického růstu:Když SQL Server provede operaci automatického růstu, transakce, která spustila událost automatického růstu, bude muset počkat, dokud se událost automatického růstu nedokončí. Teprve poté může být samotná transakce dokončena.
  4. Vždy se doporučuje nastavit možnosti automatického růstu v číslech místo v procentech.
  5. Vyvolání nevyužitého místa v tabulce může být z následujících důvodů:
    • Fragmentace
      Když jsou data fragmentována kvůli jejich povaze a typu definice, generuje se nějaké nevyužité místo. Časté úpravy dat (všechny operace UPDATE, INSERT OR DELETE) také vedou k většímu počtu rozdělení stránek, což s větší pravděpodobností vytvoří nevyužité místo v tabulce.
    • V tabulce není žádný seskupený index
      Chcete-li snížit fragmentaci v haldě, můžete si vytvořit shlukovaný index na stole. Chcete-li snížit fragmentaci indexu, proveďte údržbu indexu určením hodnoty avg_fragmentation_in_percent.
    • Velikost dat
      V některých případech použití vhodných datových typů vede k menším datovým řádkům, což zase umožňuje umístit více řádků na stránku. Nejenže snižuje vnitřní nevyužitý prostor, ale má také dopad na výkon snížením počtu rozdělení stránek.
  6. Nevyužitý prostor může být také důsledkem vypuštění sloupce s proměnnou délkou. Po provedení významných změn ve sloupcích s proměnnou délkou v tabulce nebo indexovaném zobrazení použijte DBCC CLEANTABLE, abyste okamžitě získali zpět nevyužité místo. Případně můžete znovu sestavit indexy v tabulce nebo pohledu; jedná se však o operaci náročnější na zdroje.
  7. Nevyužitý prostor je relativně větší, když skončíme načítáním relativně větších dat (>8 kB). V takových případech skončíme s velkým množstvím nevyužitého místa na datových stránkách.
  8. Po migraci SharePoint je možné vidět značné množství nevyužitého prostoru zavedeného do databází. Rekultivace je pomalejší proces, proces čištění duchů tyto stránky odstraní a k uvolnění dojde po určitou dobu.
  9. V některých případech nemusí být hodnoty sp_spaceused správné. Přestože sp_spaceused získává informace ze systémového objektu, který obsahuje všechny odhady, může být někdy nepřesný. Jedním z důvodů je to, že během migrace databáze nebo v případě zastaralých statistik, nebo když systém prochází častými úpravami DDL, nebo po provádění velkých operací hromadného kopírování. Chcete-li synchronizovat systémové objekty, použijte příkazy DBCC updateusage(0) nebo DBCC CHECKTABLE, abyste zajistili, že sp_spaceused vrátí aktuální přesná data. Pamatujte však, že příkazy DBCC jsou náročné na prostředky; dobře chápat důsledky jeho použití. Když spustíme příkaz DBCC updateusage, databázový stroj SQL Server prohledá datové stránky v databázi a provede nezbytné opravy sys.allocation_units a sys.partitions katalogové pohledy týkající se úložného prostoru využívaného každým stolem.

Odkazy

  • https://msdn.microsoft.com/en-us/library/cc280360.aspx
  • https://docs.microsoft.com/en-us/sql/t-sql/database-console-commands/dbcc-cleantable-transact-sql
  • https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-database-files-transact-sql

  1. Funkce ASCIISTR() v Oracle

  2. MySQL se dotazuje na příklady s odpověďmi

  3. Existuje nějaký způsob, jak vyprázdnit výstup z PL/SQL v Oracle?

  4. Klauzule CHECK pro aktualizovatelná zobrazení