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

Monitoraggio di SQL Server TempDB tramite viste a gestione dinamica (DMV)

Cos'è TempDB in MS SQL Server?

TempDB è un database di sistema in Microsoft SQL Server utilizzato come archivio di oggetti interni, versioni di riga, tabelle di lavoro, tabelle temporanee e indici. TempDB è disponibile per l'uso per tutti i partecipanti connessi a un'istanza di SQL Server (è una risorsa globale). Per chi ha familiarità con altre versioni di database, il database tempDB è simile al tablespace TEMP in Oracle. Per dirla in parole povere, tutto ciò che non può adattarsi alla memoria dell'istanza si riversa sui file di dati tempdb.

TempDB viene in genere utilizzato nei seguenti casi:

  1. Le tabelle temporanee vengono create con la convenzione di denominazione #. Ho visto una o due applicazioni nel mio negozio che creano molte di queste convenzioni. Di conseguenza, potrebbe influire sulle prestazioni. Per ogni tabella temporanea, TempDB distribuisce le pagine la cui dimensione dipende dalla dimensione della tabella. Inoltre, potrebbero verificarsi dei conflitti se diverse sessioni simultanee creano tali TempTable contemporaneamente.
  2. Il livello di isolamento READ_COMMITTED_SNAPSHOT è abilitato. Abbiamo dovuto farlo su due delle nostre istanze alcuni anni fa perché c'erano due applicazioni che stavano riscontrando un grave numero di deadlock. L'uso dei livelli di isolamento degli snapshot è un modo per gestire i deadlock, in particolare se non si desidera andare avanti e indietro con gli sviluppatori sulla codifica corretta. Dovresti essere consapevole del fatto che questo dovrebbe aiutare a migliorare le prestazioni. Tuttavia, utilizza un controllo della concorrenza ottimistico che potrebbe non essere desiderabile in tutti i casi rispetto all'integrità dei dati.
  3. Gli indici vengono creati o ricostruiti con l'opzione SORT_IN_TEMPDB=ON. Tende a rimuovere l'onere dell'ordinamento dal database che possiede l'indice mentre il processo di ricostruzione è in corso. Può essere utile esaminare l'impatto totale di questa opzione sulle prestazioni dell'istanza nel suo insieme.
  4. La funzionalità MARS (Multiple Active Result Sets) è abilitata. No, MARS non è un pianeta in questo scenario, è una funzionalità che consente a un'applicazione di inviare più batch tramite un'unica connessione. È disabilitato per impostazione predefinita e può essere abilitato esplicitamente includendo MultipleActiveResultSets=True in una stringa di connessione.
  5. Internamente, SQL Server utilizza TempDB anche per creare tabelle di lavoro comunemente utilizzate nelle operazioni sui cursori, chiamate dalle clausole GROUP BY, ORDER BY o UNION. Le tabelle di lavoro possono essere considerate come tabelle temporanee create dall'attività del motore di SQL Server anziché direttamente dall'attività dell'utente.

Viste di gestione dinamica pertinenti SQL Server

Le seguenti viste a gestione dinamica (DMV) pertinenti sono utili quando si esamina l'attività in TempDB:

  1. sys.dm_db_file_space_usage :Questo DMV restituisce alcune informazioni sull'utilizzo dello spazio dei file nei database che ti interessano. Può essere utilizzato per esaminare qualsiasi database nell'istanza e l'output riguarda solo quel database. Nel contesto di questo articolo, utilizzeremo il DMV per esaminare TempDB.
  2. sys.dm_db_session_space_usage :questo DMV è esclusivo del database TempDB e restituisce il numero di pagine allocate e deallocate da ciascuna sessione per un determinato database. Le allocazioni delle pagine vengono generalmente mantenute fino al termine della sessione.
  3. sys.dm_db_task_space_usage :questo DMV è anche esclusivo del database TempDB e fornisce alcune informazioni sul numero di pagine allocate e deallocate da ciascuna attività per un determinato database.
  4. sys.dm_tran_active_snapshot_database_transactions :questo DMV restituisce le transazioni attive che generano e possono accedere alle versioni di riga. Questa visualizzazione è rilevante quando sono abilitate opzioni come ALLOW_SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT.
  5. sys.dm_tran_version_store :questo DMV fornisce alcune informazioni su tutti i record di versione nell'archivio versioni. In un server di produzione attivo, i record in questa tabella potrebbero aumentare in modo significativo. Pertanto, dobbiamo fare attenzione quando interroghiamo il DMV.

Esame dei comandi DMV prima di lavorare con il database TempDB

sys.dm_file_space_usage

Possiamo ottenere alcune descrizioni di questi DMV dalla documentazione Microsoft.

La tabella 1 mostra la descrizione di sys.dm_file_space_usage . La query nel Listato 1 mostra l'utilizzo dello spazio file rispettivamente per TempDB e per i database WideWorldImporters. Le immagini 1 e 2 restituiscono gli output di questa query rispettivamente con i database TempDB e WideWorldImporters.

[id tabella=44 /]

Tabella 1:descrizione di 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 di Query su sys.dm_file_space_usage (WideWorldImporters)

Si noti che la colonna total_page_count mostra la dimensione esatta del file di database in questione. Inoltre, i tipi di file LOG e FILESTREAM non vengono visualizzati. Inoltre, come previsto, allocated_extent_page_count corrisponde allo spazio utilizzato nel file di dati WWI_UserData.

Fig. 3 Dimensioni dei file nel database WideWorldImporters

sys.dm_db_session_space_usage

La tabella 2 mostra l'utilizzo della DMV sys.dm_db_session_space_usage. Il Listato 2 è l'output della query. Si noti che il numero di righe restituite corrisponde al numero corrente di sessioni (attive o inattive) nell'istanza. Inoltre, ricorda che questo DMV riguarda SOLO TempDB.

[id tabella=45 /]

Tabella 2:descrizione di 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

La tabella 3 mostra l'implementazione della DMV sys.dm_db_task_space_usage. Il Listato 3 ne mostra l'output.

[id tabella=46 /]

Tabella 3:descrizione di 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;

Altre query DMV in MSSQL TempDB

Gli altri due DMV sembrano vuoti prima dell'esecuzione di qualsiasi attività del database. Le tabelle 4 e 5 mostrano una descrizione di entrambe le tabelle. Nella prossima sezione, daremo un'occhiata a come cambiano i dati nelle DMV quando generiamo l'attività del database.

[id tabella=47 /]

Tabella 4:descrizione di sys.dm_tran_active_snapshot_database_transactions

[id tabella=48 /]

Tabella 5:descrizione di sys.dm_tran_version_store

Esame del DMV dopo il completamento dell'attività del database

Generiamo un po' di attività.

Per fare ciò, esegui le query semplici nell'elenco 4.

-- Listing 4
-- Query 1
use WideWorldImporters
go
select * from
[Sales].[Invoices];
-- Query 2
use WideWorldImporters
go
select * from
[Sales].[Invoices]
order by ContactPersonID;

Come puoi vedere, non ci sono allocazioni o deallocazioni significative da questa piccola query, quindi alziamo l'asticella creando una tabella temporanea utilizzando lo script nel Listato 5.

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

Ora otteniamo un numero significativo di pagine allocate e riservate per la nostra sessione attiva 62 (vedi Fig. 8). Inoltre, presta attenzione al numero significativo di estensioni allocate e pagine riservate mostrate in sys.dm_db_file_space_usage (Fig. 9).

Quando andiamo avanti e rilasciamo Temptable #Invoice, vediamo che le pagine allocate in TempDB vengono rilasciate come mostrato in Fig. 12. Tuttavia, l'output della DMV dm_db_session_space_usage indica ancora che alcune pagine sono allocate alla sessione. Vediamo che questo viene rilasciato non appena chiudiamo la sessione (ID sessione 62).

Successivamente, apriamo un'altra sessione e creiamo un indice utilizzando le query nel Listato 6. Nella query 1 esclusa l'opzione SORT_IN_TEMPDB e nella query 2, utilizziamo questa opzione dopo aver eliminato l'indice. Non si verificano allocazioni significative per il primo caso, ma vediamo alcune modifiche durante l'utilizzo di SORT_IN_TEMPDB. Questa variazione è molto lieve data la dimensione dell'indice in questione (vedi Fig. 16 e 17).

Faremo il test finale. Scopriamo che fino a questo momento i DMV come sys.dm_tran_active_snapshot_database_transactions e sys.dm_tran_version_store non restituiscono righe quando interrogati.

Abilitiamo i livelli di isolamento SNAPSHOT_ISOLATION e READ_COMMITTED_SNAPSHOT (Listato 7). Al termine, una singola istruzione di aggiornamento crea un record nella DMV sys.dm_tran_version_store. Mettere questa stessa query è una transazione che usiamo per vedere che un record viene generato anche in sys.dm_tran_active_snapshot_database_transactions durante la transazione.

-- 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

Conclusione

Abbiamo brevemente esplorato la possibilità di monitorare l'attività di TempDB utilizzando cinque DMV chiave esposte da SQL Server. Quando si utilizza questo livello del processo di monitoraggio in un ambiente di produzione, è possibile determinare se è necessario più spazio in TempDB e nei file di dati. Inoltre, possiamo analizzare l'impatto dell'isolamento SNAPSHOT se abbiamo abilitato questa funzione in precedenza.

I dati di output di queste DMV potrebbero anche essere utili per mostrare chiaramente agli sviluppatori di applicazioni l'impatto del comportamento del loro codice su tempDB e sull'istanza nel suo insieme. Nel complesso, è abbastanza gratificante comprendere l'uso di questi DMV come DBA che si occupa di prestazioni e gestione dello spazio.

Riferimenti

Isolamento snapshot in SQL Server
Utilizzo di più set di risultati attivi
Descrizione di sys.dm_tran_version_store
Descrizione di sys.dm_db_task_space_usage
Descrizione di sys.dm_file_space_usage
Descrizione di sys.dm_db_session_space_usage
Descrizione di sys.dm_tran_active_snapshot_database_transactions