Vad är TempDB i MS SQL Server?
TempDB är en systemdatabas i Microsoft SQL Server som används som ett lager av interna objekt, radversioner, arbetstabeller, temporära tabeller och index. TempDB är tillgängligt för användning för alla deltagare som är anslutna till en SQL Server-instans (det är en global resurs). För de som är bekanta med andra databasvarianter, liknar tempDB-databasen TEMP-tabellutrymmet i Oracle. För att uttrycka det milt, allt som inte kan passa ditt instansminne spills över till tempdb-datafilerna.
TempDB används vanligtvis i följande fall:
- Tillfälliga tabeller skapas med # namnkonventionen. Jag har sett en eller två applikationer i min butik som skapar en hel del av dessa konventioner. Som ett resultat kan det påverka prestandan. För varje temporär tabell distribuerar TempDB sidor vars storlek beror på tabellstorleken. Dessutom kan det uppstå vissa konflikter om flera samtidiga sessioner skapar sådana TempTables samtidigt.
- READ_COMMITTED_SNAPSHOT-isoleringsnivån är aktiverad. Vi var tvungna att göra detta på två av våra instanser för några år sedan eftersom det fanns två ansökningar som upplevde ett allvarligt antal dödlägen. Att använda isoleringsnivåerna för ögonblicksbilder är ett sätt att hantera dödlägen, särskilt om du inte vill gå fram och tillbaka med utvecklare om korrekt kodning. Du bör vara medveten om att detta förväntas bidra till att förbättra prestandan. Den använder dock optimistisk samtidighetskontroll som kanske inte är önskvärt i alla fall med avseende på dataintegritet.
- Index byggs eller byggs om med alternativet SORT_IN_TEMPDB=ON. Det tenderar att ta bort bördan av sortering från databasen som äger indexet medan ombyggnadsprocessen pågår. Det kan hjälpa att undersöka den totala effekten av detta alternativ på instansens prestanda som helhet.
- Funktionen Multiple Active Result Sets (MARS) är aktiverad. Nej, MARS är inte en planet i det här scenariot, det är en funktion som gör att en applikation kan skicka in flera batcher via en enda anslutning. Den är inaktiverad som standard och kan explicit aktiveras genom att inkludera MultipleActiveResultSets=True till en anslutningssträng.
- Internt använde SQL Server också TempDB för att skapa arbetstabeller som vanligtvis används i marköroperationer – anrop av satserna GROUP BY, ORDER BY eller UNION. Arbetstabeller kan ses som tillfälliga tabeller skapade av SQL Server-motoraktiviteten snarare än av en användaraktivitet direkt.
Relevanta Dynamic Management Views SQL Server
Följande relevanta dynamiska hanteringsvyer (DMV) är användbara när du undersöker aktiviteten i TempDB:
- sys.dm_db_file_space_usage :Denna DMV returnerar viss information om utrymmesanvändning för filer i databaserna du är intresserad av. Den kan användas för att undersöka vilken databas som helst i instansen och utdata avser endast den databasen. I samband med denna artikel kommer vi att använda DMV för att undersöka TempDB.
- sys.dm_db_session_space_usage :Denna DMV är exklusiv för TempDB-databasen och returnerar antalet sidor som tilldelats och avallokerats av varje session för en given databas. Sidallokeringarna behålls vanligtvis tills sessionen avslutas.
- sys.dm_db_task_space_usage :Denna DMV är också exklusiv för TempDB-databasen och ger viss information om antalet sidor som tilldelats och avallokerats av varje uppgift för en given databas.
- sys.dm_tran_active_snapshot_database_transactions :Denna DMV returnerar de aktiva transaktionerna som genererar och kan komma åt radversioner. Den här vyn är relevant när alternativ som ALLOW_SNAPSHOT_ISOLATION och READ_COMMITTED_SNAPSHOT är aktiverade.
- sys.dm_tran_version_store :Denna DMV ger viss information om alla versionsposter i versionslagret. I en aktiv produktionsserver kan posterna i den här tabellen växa avsevärt. Därför måste vi vara försiktiga när vi frågar efter DMV.
Undersöka DMV-kommandona innan du arbetar med TempDB-databasen
sys.dm_file_space_usage
Vi kan få några beskrivningar av dessa DMV från Microsofts dokumentation.
Tabell 1 visar beskrivningen av sys.dm_file_space_usage . Frågan i Lista 1 visar filutrymmesanvändningen för TempDB respektive WideWorldImporters-databaserna. Bild 1 och 2 returnerar utdata från denna fråga med både TempDB- respektive WideWorldImporters-databaser.
[tabell id=44 /]
Tabell 1:beskrivning av 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 Utdata från fråga på sys.dm_file_space_usage (WideWorldImporters)
Observera att kolumnen total_page_count visar den exakta storleken på databasfilen i fråga. Dessutom visas inte filtyperna LOG och FILESTREAM. Dessutom, som förväntat, allocated_extent_page_count matchar det använda utrymmet i WWI_UserData-datafilen.
Fig. 3 Filstorlekar i WideWorldImporters-databasen
sys.dm_db_session_space_usage
Tabell 2 visar användningen av sys.dm_db_session_space_usage DMV. Lista 2 är resultatet av frågan. Observera att antalet returnerade rader matchar det aktuella antalet sessioner (aktiva eller inaktiva) i instansen. Kom också ihåg att denna DMV ENDAST hänför sig till TempDB.
[tabell id=45 /]
Tabell 2:beskrivning av 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
Tabell 3 visar implementeringen av sys.dm_db_task_space_usage DMV. Lista 3 visar dess utdata.
[tabell id=46 /]
Tabell 3:beskrivning av 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;
Andra DMV-frågor i MSSQL TempDB
De andra två DMV:erna verkar vara tomma innan någon databasaktivitet exekveras. Tabell 4 och 5 visar en beskrivning av båda tabellerna. I nästa avsnitt kommer vi att ta en titt på hur data i DMV:erna förändras när vi genererar databasaktivitet.
[tabell id=47 /]
Tabell 4:beskrivning av sys.dm_tran_active_snapshot_database_transactions
[tabell id=48 /]
Tabell 5:beskrivning av sys.dm_tran_version_store
Undersöka DMV efter att databasaktiviteten är klar
Låt oss skapa lite aktivitet.
För att göra detta, kör de enkla frågorna i lista 4.
-- Listing 4 -- Query 1 use WideWorldImporters go select * from [Sales].[Invoices]; -- Query 2 use WideWorldImporters go select * from [Sales].[Invoices] order by ContactPersonID;
Som du kan se finns det inga betydande tilldelningar eller avallokeringar från denna lilla fråga så vi höjer ribban genom att skapa en tillfällig tabell med skriptet i Listing 5.
-- Listing 5 use WideWorldImporters go select * into [#Invoices] from [Sales].[Invoices]; use tempdb go drop table [#Invoices];
Vi får nu ett betydande antal sidor tilldelade och reserverade för vår aktiva session 62 (se fig. 8). Var också uppmärksam på det betydande antalet tilldelade omfattningar och reserverade sidor som visas i sys.dm_db_file_space_usage (Fig. 9).
När vi går vidare och släpper Temptable #Invoice ser vi att sidorna som tilldelats i TempDB släpps som visas i Fig. 12. Utdata från dm_db_session_space_usage DMV indikerar dock fortfarande att vissa sidor är allokerade till sessionen. Vi ser att detta släpps så fort vi stänger sessionen (session ID 62).
Därefter öppnar vi ytterligare en session och skapar ett index med hjälp av frågorna i Lista 6. I fråga 1 exklusive alternativet SORT_IN_TEMPDB och i fråga 2 använder vi det här alternativet efter att ha släppt indexet. Inga betydande tilldelningar sker för det första fallet men vi ser några förändringar när vi använder SORT_IN_TEMPDB. Denna förändring är mycket liten med tanke på storleken på indexet i fråga (se fig. 16 och 17).
Vi ska göra det sista testet. Vi får reda på att till detta ögonblick returnerar DMV:er som sys.dm_tran_active_snapshot_database_transactions och sys.dm_tran_version_store inga rader när de efterfrågas.
Låt oss aktivera SNAPSHOT_ISOLATION- och READ_COMMITTED_SNAPSHOT-isoleringsnivåerna (lista 7). När det är gjort skapar en enda uppdateringssats en post i sys.dm_tran_version_store DMV. Att ställa samma fråga är en transaktion som vi använder för att se att en post också genereras i sys.dm_tran_active_snapshot_database_transactions under transaktionen.
-- 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
Slutsats
Vi har kort utforskat att vi kan övervaka TempDB-aktivitet med hjälp av fem viktiga DMV:er som exponeras av SQL Server. När vi använder denna nivå av övervakningsprocessen i en produktionsmiljö kan vi avgöra om vi behöver mer utrymme i TempDB och datafiler. Vi kan också analysera effekten av SNAPSHOT-isoleringen om vi har aktiverat den här funktionen tidigare.
Utdata från dessa DMV:er kan också vara till hjälp för att tydligt visa applikationsutvecklare effekten av deras kodbeteende på tempDB och instansen som helhet. Sammantaget är det ganska givande att förstå användningen av dessa DMV:er som en DBA som handlar om prestanda och rymdhantering.
Referenser
Isolering av ögonblicksbilder i SQL Server
Använda flera aktiva resultatuppsättningar
Beskrivning av sys.dm_tran_version_store
Beskrivning av sys.dm_db_task_space_usage
Beskrivning av sys.dm_file_space_usage av sys.session_space
Beskrivning av sys.dm_tran_active_snapshot_database_transactions