Wat is TempDB in MS SQL Server?
TempDB is een systeemdatabase in Microsoft SQL Server die wordt gebruikt als opslag van interne objecten, rijversies, werktabellen, tijdelijke tabellen en indexen. TempDB is beschikbaar voor gebruik door alle deelnemers die zijn verbonden met een SQL Server-instantie (het is een globale bron). Voor degenen die bekend zijn met andere database-smaken, is de tempDB-database vergelijkbaar met de TEMP-tabelruimte in Oracle. Om het zacht uit te drukken, alles wat niet in uw instancegeheugen past, gaat over naar de tempdb-gegevensbestanden.
TempDB wordt meestal gebruikt in de volgende gevallen:
- Tijdelijke tabellen worden gemaakt met de naamgevingsconventie #. Ik heb een of twee toepassingen in mijn winkel gezien die veel van deze conventies creëren. Als gevolg hiervan kan het de prestaties beïnvloeden. Voor elke tijdelijke tabel distribueert TempDB pagina's waarvan de grootte afhangt van de grootte van de tabel. Bovendien kunnen er enkele conflicten zijn als meerdere gelijktijdige sessies tegelijkertijd dergelijke TempTables maken.
- Het READ_COMMITTED_SNAPSHOT isolatieniveau is ingeschakeld. We moesten dit een paar jaar geleden op twee van onze instanties doen omdat er twee toepassingen waren die een serieus aantal impasses ondervonden. Het gebruik van de snapshot-isolatieniveaus is een manier om met impasses om te gaan, vooral als u niet heen en weer wilt gaan met ontwikkelaars over de juiste codering. Houd er rekening mee dat dit naar verwachting de prestaties zal helpen verbeteren. Het maakt echter gebruik van optimistische gelijktijdigheidscontrole die niet in alle gevallen wenselijk is met betrekking tot gegevensintegriteit.
- Indexen worden gemaakt of opnieuw opgebouwd met de optie SORT_IN_TEMPDB=ON. Het heeft de neiging om de last van het sorteren te verwijderen van de database die eigenaar is van de index terwijl het wederopbouwproces aan de gang is. Het kan helpen om de totale impact van deze optie op de prestaties van de instantie als geheel te onderzoeken.
- De functionaliteit voor meerdere actieve resultatensets (MARS) is ingeschakeld. Nee, MARS is in dit scenario geen planeet, het is een functie waarmee een applicatie meerdere batches kan indienen via één enkele verbinding. Het is standaard uitgeschakeld en kan expliciet worden ingeschakeld door MultipleActiveResultSets=True op te nemen. in een verbindingsreeks.
- Intern gebruikte SQL Server TempDB ook om werktabellen te maken die vaak worden gebruikt bij cursorbewerkingen - aanroepen door de clausules GROUP BY, ORDER BY of UNION. Werktabellen kunnen worden gezien als tijdelijke tabellen die zijn gemaakt door de SQL Server-engine-activiteit in plaats van rechtstreeks door een gebruikersactiviteit.
Relevante dynamische beheerweergaven SQL Server
De volgende relevante dynamische managementweergaven (DMV's) zijn handig bij het onderzoeken van de activiteit in TempDB:
- sys.dm_db_file_space_usage :Deze DMV retourneert wat informatie over het ruimtegebruik van bestanden in de databases waarin u geïnteresseerd bent. Het kan worden gebruikt om elke database in de instantie te onderzoeken en de uitvoer heeft alleen betrekking op die database. In de context van dit artikel zullen we de DMV gebruiken om TempDB te onderzoeken.
- sys.dm_db_session_space_usage :Deze DMV is exclusief voor de TempDB-database en retourneert het aantal pagina's dat is toegewezen en vrijgemaakt door elke sessie voor een bepaalde database. De paginatoewijzingen worden doorgaans gehandhaafd totdat de sessie wordt beëindigd.
- sys.dm_db_task_space_usage :Deze DMV is ook exclusief voor de TempDB-database en biedt informatie over het aantal pagina's dat is toegewezen en vrijgemaakt door elke taak voor een bepaalde database.
- sys.dm_tran_active_snapshot_database_transactions :Deze DMV retourneert de actieve transacties die rijversies genereren en kunnen openen. Deze weergave is relevant wanneer opties zoals ALLOW_SNAPSHOT_ISOLATION en READ_COMMITTED_SNAPSHOT zijn ingeschakeld.
- sys.dm_tran_version_store :Deze DMV geeft informatie over alle versierecords in het versiearchief. In een actieve productieserver kunnen de records in deze tabel aanzienlijk groeien. We moeten dus voorzichtig zijn bij het opvragen van de DMV.
De DMV-opdrachten onderzoeken voordat u met de TempDB-database gaat werken
sys.dm_file_space_usage
We kunnen enkele beschrijvingen van deze DMV's verkrijgen uit de Microsoft-documentatie.
Tabel 1 toont de beschrijving van sys.dm_file_space_usage . De query in Listing 1 toont het gebruik van de bestandsruimte voor respectievelijk TempDB en de WideWorldImporters-databases. Afbeeldingen 1 en 2 retourneren de uitvoer van deze query met respectievelijk TempDB en de WideWorldImporters-databases.
[tabel id=44 /]
Tabel 1:beschrijving van 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;
Fig. 2 Uitvoer van query op sys.dm_file_space_usage (WideWorldImporters)
Merk op dat de kolom total_page_count de exacte grootte van het betreffende databasebestand weergeeft. Bovendien worden de bestandstypen LOG en FILESTREAM niet weergegeven. Ook, zoals verwacht, allocated_extent_page_count komt overeen met de gebruikte ruimte in het WWI_UserData-gegevensbestand.
Fig. 3 Bestandsgrootten in de WideWorldImporters-database
sys.dm_db_session_space_usage
Tabel 2 toont het gebruik van de sys.dm_db_session_space_usage DMV. Listing 2 is de output van de query. Houd er rekening mee dat het aantal geretourneerde rijen overeenkomt met het huidige aantal sessies (actief of inactief) in de instantie. Onthoud ook dat deze DMV ALLEEN betrekking heeft op TempDB.
[tabel id=45 /]
Tabel 2:beschrijving van 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
Tabel 3 toont de implementatie van de sys.dm_db_task_space_usage DMV. Listing 3 geeft de output weer.
[tabel id=46 /]
Tabel 3:beschrijving van 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;
Andere DMV-query's in MSSQL TempDB
De andere twee DMV's lijken leeg te zijn voordat enige databaseactiviteit wordt uitgevoerd. Tabellen 4 en 5 geven een beschrijving van beide tabellen. In het volgende gedeelte zullen we bekijken hoe gegevens in de DMV's veranderen wanneer we database-activiteit genereren.
[tabel id=47 /]
Tabel 4:beschrijving van sys.dm_tran_active_snapshot_database_transactions
[tabel id=48 /]
Tabel 5:beschrijving van sys.dm_tran_version_store
De DMV onderzoeken nadat de databaseactiviteit is voltooid
Laten we wat activiteit genereren.
Voer hiervoor de eenvoudige zoekopdrachten uit in lijst 4.
-- Listing 4 -- Query 1 use WideWorldImporters go select * from [Sales].[Invoices]; -- Query 2 use WideWorldImporters go select * from [Sales].[Invoices] order by ContactPersonID;
Zoals je kunt zien, zijn er geen significante toewijzingen of deallocaties van deze kleine zoekopdracht, dus we leggen de lat hoger door een tijdelijke tabel te maken met behulp van het script in Listing 5.
-- Listing 5 use WideWorldImporters go select * into [#Invoices] from [Sales].[Invoices]; use tempdb go drop table [#Invoices];
We krijgen nu een aanzienlijk aantal pagina's toegewezen en gereserveerd voor onze actieve sessie 62 (zie Fig. 8). Let ook op het aanzienlijke aantal toegewezen gebieden en gereserveerde pagina's dat wordt weergegeven in sys.dm_db_file_space_usage (Fig. 9).
Wanneer we doorgaan en de Temptable #Invoice laten vallen, zien we dat de pagina's die zijn toegewezen in TempDB worden vrijgegeven zoals weergegeven in Fig. 12. De uitvoer van de dm_db_session_space_usage DMV geeft echter nog steeds aan dat sommige pagina's aan de sessie zijn toegewezen. We zien dat deze wordt vrijgegeven zodra we de sessie sluiten (sessie-ID 62).
Vervolgens openen we een andere sessie en maken we een index met behulp van de query's in Listing 6. In Query 1 met uitzondering van de SORT_IN_TEMPDB-optie en in Query 2 gebruiken we deze optie nadat we de index hebben verwijderd. Er vinden geen significante toewijzingen plaats voor het eerste geval, maar we zien enkele wijzigingen tijdens het gebruik van SORT_IN_TEMPDB. Deze verandering is zeer klein gezien de grootte van de index in kwestie (zie Fig. 16 en 17).
We voeren de laatste test uit. We ontdekken dat tot op dit moment de DMV's zoals sys.dm_tran_active_snapshot_database_transactions en sys.dm_tran_version_store geen rijen retourneren wanneer ze worden opgevraagd.
Laten we de SNAPSHOT_ISOLATION en de READ_COMMITTED_SNAPSHOT isolatieniveaus inschakelen (lijst 7). Eenmaal gedaan, maakt een enkele update-instructie een record in de sys.dm_tran_version_store DMV. Het plaatsen van dezelfde query is een transactie die we gebruiken om te zien dat er tijdens de transactie ook een record wordt gegenereerd in de 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
Conclusie
We hebben kort onderzocht dat we TempDB-activiteit kunnen controleren met behulp van vijf belangrijke DMV's die worden weergegeven door SQL Server. Wanneer we dit niveau van het monitoringproces in een productieomgeving gebruiken, kunnen we bepalen of we meer ruimte nodig hebben in TempDB en databestanden. We kunnen ook de impact van de SNAPSHOT-isolatie analyseren als we deze functie eerder hebben ingeschakeld.
De uitvoergegevens van deze DMV's kunnen ook nuttig zijn om applicatieontwikkelaars duidelijk de impact van hun codegedrag op tempDB en de instantie als geheel te laten zien. Over het algemeen is het zeer de moeite waard om het gebruik van deze DMV's te begrijpen als een DBA die zich bezighoudt met prestatie- en ruimtebeheer.
Referenties
Isolatie van momentopnamen in SQL Server
Meerdere actieve resultatensets gebruiken
Beschrijving van sys.dm_tran_version_store
Beschrijving van sys.dm_db_task_space_usage
Beschrijving van sys.dm_file_space_usage
Beschrijving van sys.dsession_dbs_dsession_db_.dsession_space_sys.dsession_
Beschrijving van sys.dm_tran_active_snapshot_database_transactions