Co je TempDB na MS SQL Server?
TempDB je systémová databáze v Microsoft SQL Server používaná jako úložiště interních objektů, verzí řádků, pracovních tabulek, dočasných tabulek a indexů. TempDB je k dispozici pro použití všem účastníkům připojeným k instanci SQL Serveru (jedná se o globální zdroj). Pro ty, kteří jsou obeznámeni s jinými typy databází, je databáze tempDB podobná tabulkovému prostoru TEMP v Oracle. Mírně řečeno, vše, co se nevejde do paměti vaší instance, se přelije do datových souborů tempdb.
TempDB se obvykle používá v následujících případech:
- Dočasné tabulky se vytvářejí podle # konvence pojmenování. Ve svém obchodě jsem viděl jednu nebo dvě aplikace, které vytvářejí spoustu těchto konvencí. V důsledku toho to může ovlivnit výkon. Pro každou dočasnou tabulku TempDB distribuuje stránky, jejichž velikost závisí na velikosti tabulky. Kromě toho může dojít ke konfliktům, pokud takové TempTables vytváří několik souběžných relací současně.
- Úroveň izolace READ_COMMITTED_SNAPSHOT je povolena. Před několika lety jsme to museli udělat na dvou z našich instancí, protože tam byly dvě aplikace, které zažívaly vážný počet uváznutí. Použití úrovní izolace snímků je jedním ze způsobů, jak se vypořádat se zablokováním, zejména pokud se nechcete s vývojáři obracet tam a zpět na správné kódování. Měli byste si být vědomi toho, že se očekává, že to pomůže zlepšit výkon. Používá však optimistickou kontrolu souběžnosti, která nemusí být ve všech případech s ohledem na integritu dat žádoucí.
- Indexy se sestavují nebo přestavují pomocí možnosti SORT_IN_TEMPDB=ON. Má tendenci odstranit břemeno třídění z databáze, která vlastní index, zatímco proces obnovy probíhá. Může pomoci prozkoumat celkový dopad této možnosti na výkon instance jako celek.
- Je povolena funkce MARS (Multiple Active Result Sets). Ne, MARS není v tomto scénáři planeta, je to funkce, která umožňuje aplikaci odeslat několik dávek prostřednictvím jediného připojení. Ve výchozím nastavení je zakázána a lze ji explicitně aktivovat zahrnutím MultipleActiveResultSets=True do připojovacího řetězce.
- Interně SQL Server také používal TempDB k vytváření pracovních tabulek, které se běžně používají při operacích kurzoru – volání klauzulí GROUP BY, ORDER BY nebo UNION. Pracovní tabulky lze považovat za dočasné tabulky vytvořené aktivitou stroje SQL Server spíše než přímou aktivitou uživatele.
Příslušná zobrazení dynamické správy SQL Server
Následující relevantní pohledy dynamické správy (DMV) jsou užitečné při zkoumání aktivity v TempDB:
- sys.dm_db_file_space_usage :Tento DMV vrací některé informace o využití místa soubory v databázích, které vás zajímají. Lze jej použít k prozkoumání jakékoli databáze v instanci a výstup se týká pouze této databáze. V kontextu tohoto článku použijeme DMV ke zkoumání TempDB.
- sys.dm_db_session_space_usage :Tento DMV je exkluzivní pro databázi TempDB a vrací počet stránek přidělených a uvolněných každou relací pro danou databázi. Alokace stránek jsou obvykle udržovány, dokud není relace ukončena.
- sys.dm_db_task_space_usage :Tento DMV je také exkluzivní pro databázi TempDB a poskytuje určité informace o počtu stránek alokovaných a přidělených každou úlohou pro danou databázi.
- sys.dm_tran_active_snapshot_database_transactions :Tento DMV vrací aktivní transakce, které generují verze řádků a mohou k nim přistupovat. Toto zobrazení je relevantní, když jsou povoleny možnosti jako ALLOW_SNAPSHOT_ISOLATION a READ_COMMITTED_SNAPSHOT.
- sys.dm_tran_version_store :Tento DMV poskytuje některé informace o všech záznamech verzí v úložišti verzí. Na aktivním produkčním serveru by záznamy v této tabulce mohly výrazně narůst. Proto musíme být opatrní při dotazování na DMV.
Zkoumání příkazů DMV před prací s databází TempDB
sys.dm_file_space_usage
Některé popisy těchto DMV můžeme získat z dokumentace společnosti Microsoft.
Tabulka 1 ukazuje popis sys.dm_file_space_usage . Dotaz ve výpisu 1 zobrazuje využití souborového prostoru pro databáze TempDB a WideWorldImporters. Obrázky 1 a 2 vracejí výstupy tohoto dotazu s databázemi TempDB a WideWorldImporters.
[id tabulky=44 /]
Tabulka 1:popis sys.dm_file_space_usage
-- List 1: Check space usage on database files -- Check space usage on tempdb use tempdb go select db_name(database_id) [Database_name] ,file_name(file_id) [File_name] ,filegroup_id ,total_page_count [TPC] ,total_page_count*8/1024 [TSU (MB)] ,allocated_extent_page_count [AEPC] ,allocated_extent_page_count*8/1024 [AEPC (MB)] ,version_store_reserved_page_count [VSRP] ,version_store_reserved_page_count*8/1024 [VSRP (MB)] ,user_object_reserved_page_count [UORP] ,user_object_reserved_page_count*8/1024 [UORPC (MB)] ,internal_object_reserved_page_count [IORPC] ,internal_object_reserved_page_count*8/1024 [UORPC (MB)] ,mixed_extent_page_count [MEPC] ,mixed_extent_page_count*8/1024 [MEPC (MB)] from sys.dm_db_file_space_usage; -- Check space usage on WideWorldImporters use WideWorldImporters go select db_name(database_id) [Database_name] ,file_name(file_id) [File_name] ,filegroup_id ,total_page_count [TPC] ,total_page_count*8/1024 [TSU (MB)] ,allocated_extent_page_count [AEPC] ,allocated_extent_page_count*8/1024 [AEPC (MB)] ,version_store_reserved_page_count [VSRP] ,version_store_reserved_page_count*8/1024 [VSRP (MB)] ,user_object_reserved_page_count [UORP] ,user_object_reserved_page_count*8/1024 [UORPC (MB)] ,internal_object_reserved_page_count [IORPC] ,internal_object_reserved_page_count*8/1024 [UORPC (MB)] ,mixed_extent_page_count [MEPC] ,mixed_extent_page_count*8/1024 [MEPC (MB)] from sys.dm_db_file_space_usage;
Obr. 2 Výstup dotazu na sys.dm_file_space_usage (WideWorldImporters)
Všimněte si, že sloupec total_page_count ukazuje přesnou velikost příslušného databázového souboru. Kromě toho se nezobrazují typy souborů LOG a FILESTREAM. Také podle očekávání allocated_extent_page_count odpovídá použitému prostoru v datovém souboru WWI_UserData.
Obr. 3 Velikosti souborů v databázi WideWorldImporters
sys.dm_db_session_space_usage
Tabulka 2 ukazuje použití DMV sys.dm_db_session_space_usage. Výpis 2 je výstupem dotazu. Všimněte si, že počet vrácených řádků odpovídá aktuálnímu počtu relací (aktivních nebo neaktivních) v instanci. Pamatujte také, že tento DMV se týká POUZE TempDB.
[id tabulky=45 /]
Tabulka 2:popis sys.dm_db_session_space_usage
-- Listing 2: Check space allocation per session in the instance -- Applies on to tempdb database select session_id ,db_name(database_id) [Database_name] ,user_objects_alloc_page_count [UOAPC] ,user_objects_alloc_page_count*8/1024 [UOAPC (MB)] ,user_objects_dealloc_page_count [UODPC] ,user_objects_dealloc_page_count*8/1024 [UODPC (MB)] ,internal_objects_alloc_page_count [UOAPC] ,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)] ,internal_objects_dealloc_page_count [UODPC] ,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)] from sys.dm_db_session_space_usage; select count(*) from sys.dm_exec_sessions;
sys.dm_db_task_space_usage
Tabulka 3 ukazuje implementaci DMV sys.dm_db_task_space_usage. Výpis 3 zobrazuje jeho výstup.
[id tabulky=46 /]
Tabulka 3:popis sys.dm_db_task_space_usage
-- List 3: Check space allocation per task int the instance -- Applies on to tempdb database select task_address ,is_remote_task ,session_id ,request_id ,exec_context_id ,db_name(database_id) [Database_name] ,user_objects_alloc_page_count [UOAPC] ,user_objects_alloc_page_count*8/1024 [UOAPC (MB)] ,user_objects_dealloc_page_count [UODPC] ,user_objects_dealloc_page_count*8/1024 [UODPC (MB)] ,internal_objects_alloc_page_count [UOAPC] ,internal_objects_alloc_page_count*8/1024 [UOAPC (MB)] ,internal_objects_dealloc_page_count [UODPC] ,internal_objects_dealloc_page_count*8/1024 [UODPC (MB)] from sys.dm_db_task_space_usage;
Další dotazy DMV v MSSQL TempDB
Zbývající dva DMV se zdají být prázdné před provedením jakékoli aktivity databáze. Tabulky 4 a 5 ukazují popis obou tabulek. V další části se podíváme na to, jak se data v DMV mění, když generujeme databázovou aktivitu.
[id tabulky=47 /]
Tabulka 4:popis sys.dm_tran_active_snapshot_database_transactions
[id tabulky=48 /]
Tabulka 5:popis sys.dm_tran_version_store
Zkoumání DMV po dokončení aktivity databáze
Pojďme vygenerovat nějakou aktivitu.
Chcete-li to provést, spusťte jednoduché dotazy ve výpisu 4.
-- Listing 4 -- Query 1 use WideWorldImporters go select * from [Sales].[Invoices]; -- Query 2 use WideWorldImporters go select * from [Sales].[Invoices] order by ContactPersonID;
Jak můžete vidět, z tohoto malého dotazu nevyplývají žádné významné alokace nebo dealokace, takže jsme zvýšili laťku vytvořením dočasné tabulky pomocí skriptu ve výpisu 5.
-- Listing 5 use WideWorldImporters go select * into [#Invoices] from [Sales].[Invoices]; use tempdb go drop table [#Invoices];
Nyní získáme významný počet stránek alokovaných a rezervovaných pro naši aktivní relaci 62 (viz obr. 8). Věnujte také pozornost značnému počtu přidělených oblastí a rezervovaných stránek zobrazených v sys.dm_db_file_space_usage (obr. 9).
Když pokračujeme a zahodíme Temptable #Invoice, vidíme, že stránky alokované v TempDB jsou uvolněny, jak je znázorněno na obr. 12. Nicméně výstup dm_db_session_space_usage DMV stále ukazuje, že některé stránky jsou přiděleny relaci. Vidíme, že toto je uvolněno, jakmile relaci zavřeme (ID relace 62).
Dále otevřeme další relaci a vytvoříme index pomocí dotazů ve výpisu 6. V Dotazu 1 s výjimkou možnosti SORT_IN_TEMPDB a v Dotazu 2 tuto možnost použijeme po zrušení indexu. V prvním případě nedochází k žádným významným alokacím, ale při používání SORT_IN_TEMPDB vidíme určité změny. Tato změna je velmi nepatrná vzhledem k velikosti příslušného indexu (viz obr. 16 a 17).
Provedeme závěrečný test. Zjistili jsme, že do této chvíle DMV jako sys.dm_tran_active_snapshot_database_transactions a sys.dm_tran_version_store nevrací při dotazu žádné řádky.
Povolme úrovně izolace SNAPSHOT_ISOLATION a READ_COMMITTED_SNAPSHOT (výpis 7). Po dokončení vytvoří jeden příkaz aktualizace záznam v sys.dm_tran_version_store DMV. Zadání stejného dotazu je transakce, kterou používáme k tomu, abychom viděli, že během transakce je také generován záznam v sys.dm_tran_active_snapshot_database_transactions.
-- Listing 7 ALTER DATABASE WideWorldImporters SET ALLOW_SNAPSHOT_ISOLATION ON; ALTER DATABASE WideWorldImporters SET READ_COMMITTED_SNAPSHOT ON;
-- Listing 8 -- Query 1 update [WideWorldImporters].[Sales].[Invoices] set DeliveryInstructions='Shop 50, 1476 Poddar Lane' where InvoiceID=48; -- Query 2 -- Transaction BEGIN TRAN update [WideWorldImporters].[Sales].[Invoices] set DeliveryInstructions='Shop 50, 1476 Poddar Lane' where InvoiceID=48; WAITFOR DELAY '00:00:30'; COMMIT TRAN; GO
Závěr
Stručně jsme prozkoumali, že můžeme monitorovat aktivitu TempDB pomocí pěti klíčových DMV vystavených SQL Serverem. Při použití této úrovně procesu monitorování v produkčním prostředí můžeme určit, zda potřebujeme více místa v TempDB a datových souborech. Také můžeme analyzovat dopad izolace SNAPSHOT, pokud jsme tuto funkci povolili dříve.
Výstupní data těchto DMV by také mohla být užitečná při jasném zobrazení vývojářů aplikací dopadu jejich chování kódu na tempDB a instanci jako celek. Celkově vzato je docela obohacující pochopit použití těchto DMV jako DBA zabývající se výkonem a správou prostoru.
Odkazy
Izolace snímku v SQL Server
Použití více sad aktivních výsledků
Popis sys.dm_tran_version_store
Popis sys.dm_db_task_space_usage
Popis sys.dm_file_space_usage_br />Popis syssesage_dm_db_db_sysagesage_store
Popis sys.dm_tran_active_snapshot_database_transactions