sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server TempDB-overvågning ved hjælp af Dynamic Management Views (DMV)

Hvad er TempDB i MS SQL Server?

TempDB er en systemdatabase i Microsoft SQL Server, der bruges som et lager af interne objekter, rækkeversioner, arbejdstabeller, midlertidige tabeller og indekser. TempDB er tilgængelig til brug for alle deltagere, der er tilsluttet en SQL Server-instans (det er en global ressource). For dem, der er bekendt med andre databasevarianter, ligner tempDB-databasen TEMP-tablespacet i Oracle. For at sige det mildt, alt, hvad der ikke kan passe til din instanshukommelse, smitter over på tempdb-datafilerne.

TempDB bruges typisk i følgende tilfælde:

  1. Midlertidige tabeller oprettes med #-navngivningskonventionen. Jeg har set en eller to applikationer i min butik, der skaber en hel masse af disse konventioner. Som følge heraf kan det påvirke ydeevnen. For hver midlertidig tabel distribuerer TempDB sider, hvis størrelse afhænger af tabelstørrelsen. Derudover kan der være nogle konflikter, hvis flere samtidige sessioner opretter sådanne TempTables samtidigt.
  2. READ_COMMITTED_SNAPSHOT-isolationsniveauet er aktiveret. Vi var nødt til at gøre dette på to af vores instanser for et par år siden, fordi der var to ansøgninger, der oplevede et alvorligt antal dødvande. Brug af snapshot-isolationsniveauerne er en måde at håndtere dødvande, især hvis du ikke ønsker at gå frem og tilbage med udviklere om korrekt kodning. Du skal være opmærksom på, at dette forventes at bidrage til at forbedre ydeevnen. Den bruger dog optimistisk samtidighedskontrol, som måske ikke er ønskelig i alle tilfælde med hensyn til dataintegritet.
  3. Indekser bygges eller genopbygges med indstillingen SORT_IN_TEMPDB=ON. Det har en tendens til at fjerne sorteringsbyrden fra databasen, som ejer indekset, mens genopbygningsprocessen er i gang. Det kan hjælpe at undersøge den samlede indvirkning af denne indstilling på instansydelsen som helhed.
  4. Funktionaliteten Multiple Active Result Sets (MARS) er aktiveret. Nej, MARS er ikke en planet i dette scenarie, det er en funktion, der gør det muligt for en applikation at indsende flere batcher via en enkelt forbindelse. Det er deaktiveret som standard og kan eksplicit aktiveres ved at inkludere MultipleActiveResultSets=True ind i en forbindelsesstreng.
  5. Internt brugte SQL Server også TempDB til at skabe arbejdstabeller, som almindeligvis bruges i markøroperationer – kald af GROUP BY-, ORDER BY- eller UNION-sætningerne. Arbejdstabeller kan opfattes som midlertidige tabeller, der er oprettet af SQL Server-motoraktiviteten snarere end af en brugeraktivitet direkte.

Relevante Dynamic Management Views SQL Server

Følgende relevante dynamiske administrationsvisninger (DMV'er) er nyttige, når du undersøger aktiviteten i TempDB:

  1. sys.dm_db_file_space_usage :Denne DMV returnerer nogle oplysninger om pladsforbruget af filer i de databaser, du er interesseret i. Den kan bruges til at undersøge enhver database i instansen, og outputtet vedrører kun den database. I forbindelse med denne artikel skal vi bruge DMV til at undersøge TempDB.
  2. sys.dm_db_session_space_usage :Denne DMV er eksklusiv for TempDB-databasen og returnerer antallet af sider, der er allokeret og deallokeret af hver session for en given database. Sidetildelingerne vedligeholdes typisk, indtil sessionen afsluttes.
  3. sys.dm_db_task_space_usage :Denne DMV er også eksklusiv for TempDB-databasen og giver nogle oplysninger om antallet af sider, der er allokeret og deallokeret af hver opgave for en given database.
  4. sys.dm_tran_active_snapshot_database_transactions :Denne DMV returnerer de aktive transaktioner, der genererer og kan få adgang til rækkeversioner. Denne visning er relevant, når muligheder såsom ALLOW_SNAPSHOT_ISOLATION og READ_COMMITTED_SNAPSHOT er aktiveret.
  5. sys.dm_tran_version_store :Denne DMV giver nogle oplysninger om alle versionsposter i versionslagret. I en aktiv produktionsserver kan posterne i denne tabel vokse betydeligt. Derfor skal vi være forsigtige, når vi forespørger DMV.

Undersøgelse af DMV-kommandoer, før du arbejder med TempDB-databasen

sys.dm_file_space_usage

Vi kan få nogle beskrivelser af disse DMV'er fra Microsofts dokumentation.

Tabel 1 viser beskrivelsen af ​​sys.dm_file_space_usage . Forespørgslen i liste 1 viser filpladsforbruget for henholdsvis TempDB- og WideWorldImporters-databaserne. Billed 1 og 2 returnerer output fra denne forespørgsel med henholdsvis både TempDB- og WideWorldImporters-databaserne.

[tabel id=44 /]

Tabel 1:beskrivelse af 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 Output af forespørgsel på sys.dm_file_space_usage (WideWorldImporters)

Bemærk, at kolonnen total_page_count viser den nøjagtige størrelse af den pågældende databasefil. Derudover vises filtyperne LOG og FILESTREAM ikke. Også, som forventet, allocated_extent_page_count matcher den brugte plads i WWI_UserData-datafilen.

Fig. 3 Filstørrelser på WideWorldImporters-databasen

sys.dm_db_session_space_usage

Tabel 2 viser brugen af ​​sys.dm_db_session_space_usage DMV. Liste 2 er outputtet af forespørgslen. Bemærk, at antallet af returnerede rækker matcher det aktuelle antal sessioner (aktive eller inaktive) i forekomsten. Husk også, at denne DMV KUN vedrører TempDB.

[tabel id=45 /]

Tabel 2:beskrivelse af 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 viser implementeringen af ​​sys.dm_db_task_space_usage DMV. Liste 3 viser dets output.

[tabel id=46 /]

Tabel 3:beskrivelse af 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;

Andre DMV-forespørgsler i MSSQL TempDB

De to andre DMV'er ser ud til at være tomme før nogen databaseaktivitet udføres. Tabel 4 og 5 viser en beskrivelse af begge tabeller. I næste afsnit vil vi tage et kig på, hvordan data i DMV'erne ændres, når vi genererer databaseaktivitet.

[tabel id=47 /]

Tabel 4:beskrivelse af sys.dm_tran_active_snapshot_database_transactions

[tabel id=48 /]

Tabel 5:beskrivelse af sys.dm_tran_version_store

Undersøgelse af DMV'en, efter at databaseaktiviteten er fuldført

Lad os skabe noget aktivitet.

For at gøre dette skal du køre de simple forespørgsler i liste 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, er der ingen væsentlige tildelinger eller deallokeringer fra denne lille forespørgsel, så vi hæver barren ved at oprette en midlertidig tabel ved hjælp af scriptet i liste 5.

-- Listing 5
use WideWorldImporters
go
select *
into [#Invoices]
from [Sales].[Invoices];
use tempdb
go
drop table [#Invoices];

Vi får nu et betydeligt antal sider tildelt og reserveret til vores aktive session 62 (se fig. 8). Vær også opmærksom på det betydelige antal tildelte områder og reserverede sider vist i sys.dm_db_file_space_usage (fig. 9).

Når vi går videre og dropper Temptable #Invoice, ser vi, at siderne, der er allokeret i TempDB, frigives som vist i fig. 12. Outputtet fra dm_db_session_space_usage DMV indikerer dog stadig, at nogle sider er allokeret til sessionen. Vi ser, at dette frigives, så snart vi lukker sessionen (session ID 62).

Dernæst åbner vi endnu en session og opretter et indeks ved hjælp af forespørgslerne i Listing 6. I Forespørgsel 1 med undtagelse af SORT_IN_TEMPDB-indstillingen og i Forespørgsel 2 bruger vi denne mulighed efter at have slettet indekset. Der sker ingen væsentlige tildelinger for det første tilfælde, men vi ser nogle ændringer, mens vi bruger SORT_IN_TEMPDB. Denne ændring er meget lille i betragtning af størrelsen af ​​det pågældende indeks (se fig. 16 og 17).

Vi udfører den sidste test. Vi finder ud af, at indtil dette øjeblik returnerer DMV'er såsom sys.dm_tran_active_snapshot_database_transactions og sys.dm_tran_version_store ingen rækker, når de bliver spurgt.

Lad os aktivere SNAPSHOT_ISOLATION- og READ_COMMITTED_SNAPSHOT-isolationsniveauerne (liste 7). Når det er gjort, opretter en enkelt opdateringserklæring en post i sys.dm_tran_version_store DMV. At sætte denne samme forespørgsel er en transaktion, vi bruger til at se, at en post også genereres 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

Konklusion

Vi har kort undersøgt, at vi kan overvåge TempDB-aktivitet ved hjælp af fem nøgle DMV'er, der er eksponeret af SQL Server. Når vi bruger dette niveau af overvågningsprocessen i et produktionsmiljø, kan vi afgøre, om vi har brug for mere plads i TempDB og datafiler. Vi kan også analysere virkningen af ​​SNAPSHOT-isoleringen, hvis vi har aktiveret denne funktion før.

Outputdataene fra disse DMV'er kan også være nyttige til klart at vise applikationsudviklere virkningen af ​​deres kodeadfærd på tempDB og instansen som helhed. Samlet set er det ret givende at forstå brugen af ​​disse DMV'er som en DBA, der beskæftiger sig med præstations- og pladsstyring.

Referencer

Snapshot-isolering i SQL Server
Brug af flere aktive resultatsæt
Beskrivelse af sys.dm_tran_version_store
Beskrivelse af sys.dm_db_task_space_usage
Beskrivelse af sys.dm_file_space_usage of sys_session_space.
Beskrivelse af sys.dm_tran_active_snapshot_database_transactions


  1. SQL Server 2016:Sikkerhedskopier en database

  2. hvordan gemmer man PostgreSQL jsonb ved hjælp af SpringBoot + JPA?

  3. En databasemodel til en onlineundersøgelse. Del 3

  4. Sådan fungerer Floor() i PostgreSQL