SQL Server 2008

Avanzate di risoluzione dei problemi con eventi estesi

Paul S. Randal

 

In un riepilogo delle:

  • Risoluzione dei problemi perché è necessario
  • Risoluzione dei problemi gli strumenti di SQL Server
  • Panoramica e architettura di eventi estesa
  • Utilizzo degli eventi estesi

Contenuto

Risoluzione dei problemi in SQL Server 2005
Eventi estesi
Considerazioni sulle prestazioni
Vita di un evento
Utilizzo degli eventi estesi
System_health estesa eventi di sessione
Disposizione dei

Gli amministratori di database di SQL Server il mondo tramite ha un problema di che non sembra per passare immediatamente: risoluzione dei problemi, la stragrande maggioranza della risoluzione dei problemi svolto per individuare un problema di prestazioni di vario genere.Anche più attentamente garantire e sistema testato applicazione verrà esperienza modifiche nel tempo può causare problemi di prestazioni significativi.

Ad esempio possibile modificare il carico di lavoro (ad esempio il numero di utenti simultanei, l'esecuzione di query e nuovo mese, fine report eseguito), può aumentare il volume dei dati in fase di elaborazione dell'hardware su cui è in esecuzione il sistema può variare (ad esempio il numero di core del processore, la quantità di memoria server disponibile e capacità del sottosistema di I/O) e potrebbe essere introdotti nuovi carichi di lavoro simultanei (mirroring, ad esempio la replica transazionale del database e modificare dati acquisizione).

Video

Riportato di seguito viene Paul Randal illustrato come è possibile utilizzare la nuova funzionalità estese eventi in SQL Server 2008 per il monitoraggio e risoluzione dei problemi.

Ma quelli non sono i problemi solo che si verificano.Quando la progettazione e test di sistemi di applicazioni, problemi imprevisti spesso trovano con la struttura, che quindi richiedere anche risoluzione dei problemi.Ovviamente, indipendentemente quando nel ciclo di vita applicazione viene rilevato il problema, risoluzione dei problemi devono essere eseguiti per identificare la causa e una soluzione.

Un sistema applicazione complessa avrà molti componenti hardware e software che potrebbero richiedere da analizzare, ma quello che mi prioritaria è SQL Server.Senza considerare le prestazioni di diversi risoluzione metodologie (che potrebbero essere una conversazione e rientra nell'ambito di questo articolo), che cosa sono gli strumenti che necessari per la risoluzione dei problemi in SQL Server?

Risoluzione dei problemi in SQL Server 2005

Su versioni alcune ultima di SQL Server, la selezione di strumenti disponibili per la risoluzione dei problemi delle prestazioni è espanso notevolmente.SQL Server è sempre stato numerosi comandi DBCCs (comando console database) disponibili per fornire una conoscenza approfondita di cosa sta succedendo nelle varie parti del modulo di gestione di database.Inoltre, vi è SQL Server Profiler e a livello di programmazione utilizzando il meccanismo di traccia SQL sottostante.

Sebbene SQL Server è costantemente offerto miglioramenti per la risoluzione dei problemi, queste opzioni presentano alcuni problemi.Post-Processing di DBCC output è difficile, che è necessario Scarica i risultati in una tabella temporanea prima di qualsiasi con essi.E in esecuzione traccia SQL e profiler può causare un peggioramento delle prestazioni quando è configurato (ad esempio tutti i blocchi di analisi: acquistati e bloccare: rilasciato gli eventi in un sistema di disponibilità e ogni filtrare colonne di DatabaseId e IDOggetto dell'evento).Nella schermata nella Figura 1 è raffigurata una finestra di dialogo utilizzato per configurare un filtro per una nuova traccia.

fig01.gif

Figura 1 configurazione di un filtro in SQL Server 2008 Profiler

SQL Server 2005 aggiunto viste a gestione dinamica e funzioni (collettivamente denominate le viste a gestione dinamica) allo scopo di ottenere informazioni all'esterno del modulo di gestione di database.Le viste a gestione dinamica sostituiti alcuni comandi DBCC, le tabelle di sistema e stored procedure ed esposti molte nuove aree del funzionamento del modulo di gestione.Le viste a gestione dinamica sono efficaci comandi che vengono componibile, poter essere utilizzate nelle istruzioni T-SQL complesse che filtro e post-process i risultati DMV.

Ad esempio, il codice mostrato nella Figura 2 restituisce solo il frammentazione e pagina densità entrambi arrotondate dei livelli foglia di tutti gli indici in un database, con un filtro a livello di frammentazione.È possibile non utilizzare facilmente utilizzando il comando DBCC SHOWCONTIG precedente.(Per ulteriori informazioni sulle viste a gestione dinamica, vedere"Viste di gestione dinamica e funzioni (Transact-SQL)." Inoltre, SQL Server 2005 aggiunte numerose altre funzionalità che potrebbero essere utilizzate per la risoluzione dei problemi, inclusi DDL (data definition language) trigger e le notifiche degli eventi.

Nella Figura 2 Utilizzo DMV per i risultati efficaci

SELECT
  OBJECT_NAME (ips.[object_id]) AS 'Object Name',
  si.name AS 'Index Name',
  ROUND (ips.avg_fragmentation_in_percent, 2) AS 'Fragmentation',
  ips.page_count AS 'Pages',
  ROUND (ips.avg_page_space_used_in_percent, 2) AS 'Page Density'
FROM sys.dm_db_index_physical_stats (
  DB_ID ('SQLskillsDB'), NULL, NULL, NULL, 'DETAILED') ips
CROSS APPLY sys.indexes si
WHERE
  si.object_id = ips.object_id
  AND si.index_id = ips.index_id
  AND ips.index_level = 0 -- only the leaf level
  AND ips.avg_fragmentation_in_percent > 10; -- filter on fragmentation
GO

Diversi team all'interno di Microsoft hanno fornito anche utile prestazioni risoluzione dei problemi strumenti, ad esempio il Utilità SQLdiag, la Utilità RML per SQL Server, la Report dashboard delle prestazioni di SQL Server 2005, e DMVStats. È presente inoltre un valore stringa Provider di eventi traccia per Windows (ETW) per SQL Server 2005, che consente di eventi di traccia SQL per essere integrato con eventi da altre parti di Windows.

Quando SQL Server 2005 apportate strides grande per aumentare la capacità di agli amministratori di database di risoluzione dei problemi il modulo di gestione di database, si sono ancora molti scenari sono stati praticamente impossibile per gli amministratori di database risolvere in modo efficace. In un esempio comune le citazioni sono alcune query utilizzare quantità eccessiva di risorse della CPU, ma le viste a gestione dinamica non fornisce informazioni sufficienti per determinare quali query ad hoc sono il culprits. Ma a differenza di SQL Server 2005, SQL Server 2008 è in grado di risolvere tali limitazioni da una nuova caratteristica denominata eventi estesa di SQL Server.

Eventi estesi

Le funzionalità del sistema estesa eventi sono molto oltre quelli di qualsiasi precedente registrazione evento e risoluzione dei problemi meccanismo che ha fornito a SQL Server. Secondo me, gli argomenti principali del sistema estesa eventi sono i seguenti:

  • Gli eventi generato in modo sincrono, ma possono essere elaborati in modo sincrono o asincrono.
  • Qualsiasi destinazione può utilizzare qualsiasi evento e qualsiasi azione può essere abbinato a qualsiasi evento, consentendo l'utilizzo di un sistema di monitoraggio approfondito.
  • "Smart predicati consentono di creare regole complesse utilizzando la logica booleana.
  • È possibile impostare il controllo completo sulle sessioni estesa eventi utilizzando il linguaggio Transact-SQL.
  • È possibile monitorare critici delle prestazioni codice senza influire sulle prestazioni.

Prima di è possibile accedere in, verranno richiedere alcuni minuti per definire una parte la terminologia di nuova.

evento Un evento è un punto definito nel codice. Alcuni esempi sono il punto in cui un'istruzione T-SQL terminato l'esecuzione o il punto in cui viene completata l'acquisizione di un blocco. Ogni evento è un payload definito, il set di colonne che vengono restituiti dall'evento e viene definita utilizzando il modello ETW (in cui ogni evento restituisce un canale e la parola chiave come parte del payload) per consentire l'integrazione con ETW. SQL Server 2008 inizialmente spediti con gli eventi definiti 254 e più prevista per essere aggiunto nel tempo.

È possibile visualizzare l'elenco degli eventi definiti utilizzando il seguente codice:

SELECT xp.[name], xo.*
FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE xp.[guid] = xo.[package_guid]
  AND xo.[object_type] = 'event'
ORDER BY xp.[name];

E si trovino il payload per un evento specifico utilizzando questo codice:

SELECT * FROM sys.dm_xe_object_columns
  WHERE [object_name] = 'sql_statement_completed';
GO

Si noti che il sistema eventi esteso è un insieme completo di informativi di viste a gestione dinamica che descrivono tutti gli eventi, destinazioni e così via. Per ulteriori informazioni, vedere" SQL Server Extended eventi dinamico Gestione visualizzazioni."

predicati Predicati sono il metodo utilizzato per filtrare gli eventi utilizzando un set di regole logiche prima che gli eventi vengono utilizzati. Predicati possono essere semplice, ad esempio la verifica che una delle colonne restituito nell'evento payload è un determinato valore (ad esempio, filtri acquisito blocco eventi DALL'ID di oggetto).

Offrono inoltre alcune funzionalità avanzate, ad esempio conteggio del numero di volte che un evento specifico è stata effettuata durante la sessione e solo consentendo l'evento per essere utilizzato dopo un'occorrenza o l'aggiornamento in modo dinamico il predicato in modo da eliminare il consumo di eventi contenente dati simili.

Predicati possono essere scritti utilizzando logica booleana in modo che ignorare appena possibile. In questo modo la quantità minima di elaborazione sincrona da eseguire prima di determinare se l'evento verrà consumare oppure no.

Azione Un'azione è un insieme di comandi che vengono eseguite in modo sincrono prima che venga utilizzato un evento. Qualsiasi azione può essere collegati a qualsiasi evento. Sono in genere raccogliere ulteriori dati per aggiungere il payload di evento (ad esempio una pila di T-SQL o un piano di esecuzione di query) o eseguire un calcolo viene aggiunto il payload di evento.

Azioni possono essere costose, le azioni per un evento vengono eseguite solo dopo la valutazione di qualsiasi predicato, non sarebbe nessun punto di esecuzione in modo sincrono di un'azione se sono stati quindi determinare che potrebbe non essere utilizzato l'evento. È disponibili un elenco di azioni predefinite utilizzando il seguente codice:

SELECT xp.[name], xo.*
FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE xp.[guid] = xo.[package_guid]
  AND xo.[object_type] = 'action'
ORDER BY xp.[name];

destinazione Una destinazione fornisce semplicemente un modo per utilizzare gli eventi e qualsiasi destinazione può utilizzare qualsiasi evento (o almeno cessione è se non esegue alcuna operazione per la destinazione eseguire, ad esempio una destinazione controllo recupero di un evento di controllo non). Le destinazioni possono utilizzare gli eventi in modo sincrono (per istanza, il codice che ha generato l'evento attende l'evento da consumare) o asincrona.

Ha come destinazione compresi tra consumer semplice, ad esempio eventi file e buffer circolare, e consumer più complesse che ha la possibilità di eseguire abbinamento evento. È possibile trovare l'elenco di destinazioni disponibili con il codice seguente:

SELECT xp.[name], xo.*
FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE xp.[guid] = xo.[package_guid]
  AND xo.[object_type] = 'target'
ORDER BY xp.[name];

Per ulteriori informazioni sulle destinazioni, vedere" SQL Server Extended destinazioni di eventi."

pacchetto Un package è un contenitore che definisce gli oggetti eventi estesa (ad esempio eventi, azioni e le destinazioni). Un pacchetto è contenuto all'interno del modulo (ad esempio un file eseguibile o una DLL) descrive, come illustrato nella Figura 3 .

Nella figura 3 la relazione betweenmodules pacchetti, oggetti e ExtendedEvents

Quando un pacchetto viene registrato con il motore di eventi esteso, tutti gli oggetti definiti da essa saranno disponibili per l'utilizzo. Per ulteriori informazioni su pacchetti e un elenco completo degli eventi estesa terminologia, vedere" SQL Server Extended pacchetti di eventi."

sessione Una sessione è possibile collegare insieme oggetti eventi estesa per l'elaborazione, ovvero un evento con un'azione da consumare da una destinazione. Una sessione è possibile collegare gli oggetti da qualsiasi pacchetto registrato e può utilizzare qualsiasi numero di sessioni la stesso evento, azione e così via. È possibile visualizzare quali sessioni estesa eventi vengono definiti mediante il codice riportato di seguito:

SELECT * FROM sys.dm_xe_sessions;
Go

Le sessioni vengono create, eliminato modificato, arrestato e avviata utilizzando i comandi T-SQL. Come si può immaginare, questo offre numerose flessibilità, anche la possibilità di modificare in modo dinamico una sessione in base a livello di codice di analisi di dati da acquisiti da sessione stessa. Per ulteriori informazioni sulle sessioni, vedere" SQL Server Extended sessioni di eventi."

Considerazioni sulle prestazioni

Quando si inserisce insieme una sessione di eventi estesa utilizzando CREATE EVENT sessione, esistono alcune impostazioni che è necessario essere necessario configurare correttamente, come sono inavvertitamente può influire sulle prestazioni. La prima decisione è se si desidera disporre di eventi utilizzati in modo sincrono o asincrono. E come è prevedibile, destinazioni sincrone maggiori effetti sulle prestazioni del codice monitorato rispetto destinazioni asincrone.

Come spiegato in precedenza, quando un evento è utilizzato in modo sincrono, il codice che ha generato l'evento deve attendere finché non è stato utilizzato l'evento. Ovviamente, se il consumo dell'evento è un processo complicato, questo può rallentare il codice.

Ad esempio, in un sistema occupato servendo migliaia di piccole dimensioni transazioni al secondo, sincrona consumo di un evento sql_statement_completed con un'azione per acquisire una query piano sarà molto probabilmente avere un impatto negativo sulle prestazioni. Inoltre, ricordare che predicati sempre vengono eseguite in modo sincrono, pertanto necessario prestare particolare attenzione non creino predicati eccessivamente complesse per gli eventi generati da codice critici delle prestazioni.

Invece, può essere forzato a utilizzare gli eventi in modo sincrono. Per contare le occorrenze di un determinato evento, il modo più semplice per eseguire questa operazione probabilmente è necessario utilizzare la destinazione synchronous_event_counter.

La seconda cosa che è necessario considerare è come configurare il buffer eventi se si decide di utilizzare le destinazioni asincrone. La quantità predefinita di memoria disponibile per il buffer eventi è 4MB. La latenza di invio predefinito tra un evento da attivato e successivamente utilizzato da una destinazione è 30 secondi. Se, ad esempio, si desidera generare le statistiche di alcuni eventi ogni 10 secondi, quindi sarà necessario modificare la latenza.

Legato alle impostazioni di buffer eventi è come si desidera suddividere la memoria utilizzata per buffer eventi. Il valore predefinito è per creare un set di buffer per l'istanza intera. In SMP (multiprocessore simmetrica) e computer NUMA (uniforme non Memory Access), questo può causare problemi di prestazioni con processori dover attendere accesso a memoria.

Considerazione terzo è come si desidera gestire eventi perdita. Quando si definisce la sessione di eventi estesa, è possibile specificare se gli eventi possono essere "persi". Ciò significa che se non vi è sufficiente memoria per un evento del buffer, viene semplicemente eliminato. Il valore predefinito è consentire singoli eventi per l'eliminazione, ma è anche possibile consentire l'intero buffer degli eventi perdersi (per le sessioni in cui i buffer eventi occupare molto rapidamente) o anche specificare che nessun evento può essere perso.

Consigliabile utilizzarlo con grande attenzione questa ultima opzione come impone il codice che ha generato l'evento attendere memoria buffer per memorizzare l'evento. Impostazione di questa opzione quasi sempre ha un effetto dannosa sulle prestazioni. Si noti che se si imposta accidentalmente questa opzione per su, il server deve rimanere risponde sufficiente per consentire di disattivare l'impostazione.

In genere, sarà possibile esaminare le impostazioni tra loro. E non c'è realmente generalizzato consigliabile che È possibile assegnare tranne per verificare che è inserire pensiero nei controlli oppure è possibile eseguire in problemi di prestazioni. È possibile trovare ulteriori informazioni su queste impostazioni in" CREATE SESSION CASO (T-SQL)".

Vita di un evento

Dopo la sessione di eventi esteso è stata definita e avviata, l'elaborazione continua come normale fino a quando viene monitorato fornito attraverso un evento. La procedura seguita dal sistema estesa eventi vengono illustrata nella Figura 4 . I passaggi sono i seguenti:

  1. Un segno di spunta avviene per vedere se tutte le sessioni estesa eventi sono monitoraggio dell'evento. In caso contrario, controllo viene restituito al codice che contiene l'evento e continua l'elaborazione.
  2. Viene determinato il payload di evento, e tutte le informazioni necessarie vengono raccolte in memoria, in altre parole, viene costruito il payload di evento.
  3. Se qualsiasi predicati sono definiti per l'evento, vengono eseguiti. A questo punto, il risultato al predicato potrebbe essere che l'evento non deve essere utilizzato. Se questo è il caso, controllo viene restituito al codice che contiene l'evento, e continua l'elaborazione.
  4. Il sistema ora sa che verrà utilizzato l'evento, in modo che esegue le azioni collegate l'evento. L'evento ora ha un payload di completo e pronto per il consumo.
  5. L'evento viene pubblicato alle destinazioni sincroni, se presente.
  6. Se le destinazioni asincrone esistono, l'evento è memorizzato nel buffer per successive elaborazioni.
  7. Controllo viene restituito al codice che contiene l'evento e continua l'elaborazione.

sqlfig04.gif

Nella figura 4 vita di un evento estesa eventi fare clic su Immagine per una visualizzazione ingrandita

Come HO già detto in precedenza, dovrà prestare particolare attenzione quando si crea una sessione di eventi in modo che influisce azioni sincrone o buffer per i destinatari asincrone non sulle prestazioni del codice che si sta controllando.

Utilizzo degli eventi estesi

Documentazione in linea di SQL Server 2008 (informazioni in lingua inglese) sono inclusi due esempi di utilizzo degli eventi estesa: " Procedura: determinare le query sono con blocchi"e" Procedura: trovare oggetti con i più blocchi acquisizione nel loro."

Vorrei dettagliatamente un esempio di impostazione di una sessione di eventi estesa e analizzare i risultati. Come appreso quando avviato utilizzando eventi estesa in 2007 in ritardo, inserendo insieme una sessione semplice è molto semplice (utilizzando le istruzioni DDL T-SQL semplice), ma i risultati di analisi è non semplice.

I risultati vengono presentati in XML, che inizialmente sorpresi mi prima realizzato che il numero enorme di possibili combinazioni di eventi e le azioni che potrebbero essere raccolti in una singola sessione destinate effettivamente non verificato altri scelta fattibile per memorizzare uno schema estensibile.

A questo punto, è stata di uno sviluppatore del team di motore di archiviazione di SQL Server per molti anni e considerare manualmente un programmatore altamente esperto C, c ++ e assembly, ma HO dovuto spendere alcune ore intuire il codice necessario per estrarre i campi del payload di eventi a livello di codice dai dati XML. Non sono tentando di eliminare è di utilizzare eventi estesa; invece attiva solo avvisi che se non si è utilizzato a lavorare con dati XML, da preparare per un po'di una curva di apprendimento prima di visualizzare i risultati.

Ecco il mio scenario: sono un amministratore di database utilizzando la funzionalità di Governor risorse di SQL Server 2008 per sandbox vari gruppi della mia società su uno dei server di produzione. HO creato due pool di risorse Governor risorse, lo sviluppo e marketing, per rappresentare ogni team di utilizzare il server. Mi limitare ciascun pool CPU e utilizzo di memoria dell'esecuzione di query, ma non la quantità di risorse I/O che utilizzano consente di Governor risorsa. Pertanto, vorrei institute un meccanismo chargeback che aiuta me amortize il costo dell'aggiornamento a una nuova rete SAN (archiviazione area network) per ogni team per utilizzo I/O sul server di fatturazione.

È possibile presupporre che il modo più semplice per attivare acquisizione / O informazioni sia quando qualsiasi istruzione T-SQL completa e SO c'è un evento denominato sql_statement_completed nel pacchetto package0. Pertanto, i dati vengono raccolti nell'evento payload?

Eseguire il codice seguente consentirà più l'elenco di tutti i dati, inclusi entrambi legge e scrive:

SELECT [name] FROM sys.dm_xe_object_columns
  WHERE [object_name] = 'sql_statement_completed';
GO

Non penso che questi sono fisiche letture e scritture (quando i dati sono lette o scritti sul disco anziché solo in memoria nel pool di buffer), ma verrà offrono me un'idea del rapporto della risorse di I/O in uso da ogni team.

Ora È necessario scoprire quale team eseguita una determinata istruzione T-SQL e pertanto È necessario un'azione che verrà avvisa che. L'esecuzione di questo codice fornisce più una lista delle tutte le azioni che È possibile intraprendere quando viene generato l'evento, inclusa una che raccoglie session_resource_pool_id nel pacchetto sqlserver:

SELECT xp.[name], xo.*
FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
WHERE xp.[guid] = xo.[package_guid]
   AND xo.[object_type] = 'action'
ORDER BY xp.[name];

È possibile ottenere l'elenco di pool di risorse È definita Governor per risorse e la correlazione che con ID raccolti dalla sessione di eventi estesa. A questo punto sono pronto per definire la sessione. Si noti che quando esegue questo codice, verrà prima verificare se una sessione di eventi con lo stesso nome presente. Se ne trova uno con lo stesso nome, verrà eliminare la sessione. Di seguito è riportato il codice:

IF EXISTS (
SELECT * FROM sys.server_event_sessions
    WHERE name = 'MonitorIO')
DROP EVENT SESSION MonitorIO ON SERVER;
GO

CREATE EVENT SESSION MonitorIO ON SERVER
ADD EVENT sqlserver.sql_statement_completed
  (ACTION (sqlserver.session_resource_pool_id))
ADD TARGET package0.ring_buffer;
GO

Crea quindi una nuova sessione con un singolo evento, sql_statement_completed che inoltre esegue l'azione di session_resource_pool_id registrazione tutti gli elementi in un buffer circolare mentre sono ancora alla creazione di prototipi. (Nell'ambiente di produzione, sarebbe probabilmente scegliere di utilizzare una destinazione di file asincrono.)

Per avviare la sessione, È necessario eseguire questo codice:

ALTER EVENT SESSION MonitorIO ON SERVER
STATE = START;
GO

Ora è in esecuzione.

Dopo aver faking alcune attività dai team marketing e lo sviluppo, sono pronto per analizzare i risultati della sessione. Questo codice verrà estrarre i dati dal buffer circolare:

SELECT CAST(xest.target_data AS XML) StatementData
  FROM sys.dm_xe_session_targets xest
JOIN sys.dm_xe_sessions xes ON
  xes.address = xest.event_session_address
WHERE xest.target_name = 'ring_buffer'
  AND xes.name = 'MonitorIO';
GO

Tuttavia, estrae i dati come un valore elevato di XML. Se si desidera suddividere ulteriormente, È possibile utilizzare il codice illustrato nella Figura 5 .

Nella figura 5 interruzione i dati XML

SELECT
  Data2.Results.value ('(data/.)[6]', 'bigint') AS Reads,
  Data2.Results.value ('(data/.)[7]', 'bigint') AS Writes,
  Data2.Results.value ('(action/.)[1]', 'int') AS ResourcePoolID
FROM
(SELECT CAST(xest.target_data AS XML) StatementData
  FROM sys.dm_xe_session_targets xest
  JOIN sys.dm_xe_sessions xes ON
    xes.address = xest.event_session_address
  WHERE xest.target_name = 'ring_buffer'
    AND xes.name = 'MonitorIO') Statements
CROSS APPLY StatementData.nodes ('//RingBufferTarget/event') AS Data2 (Results);
GO

Questo funziona, ma offre una riga di output per ogni evento è acquisito. Non è un formato di straordinario e si desidera ottenere output aggregati, pertanto HO deciso di utilizzare una tabella derivata come si vede nella Figura 6 .

Nella figura 6 risorse aggregati output

SELECT DT.ResourcePoolID,
  SUM (DT.Reads) as TotalReads,
  SUM (DT.Writes) AS TotalWrites
FROM
(SELECT 
  Data2.Results.value ('(data/.)[6]', 'bigint') AS Reads,
  Data2.Results.value ('(data/.)[7]', 'bigint') AS Writes,
  Data2.Results.value ('(action/.)[1]', 'int') AS ResourcePoolID
FROM
(SELECT CAST(xest.target_data AS XML) StatementData
  FROM sys.dm_xe_session_targets xest
  JOIN sys.dm_xe_sessions xes ON
    xes.address = xest.event_session_address
  WHERE xest.target_name = 'ring_buffer'
    AND xes.name = 'MonitorIO') Statements
CROSS APPLY StatementData.nodes ('//RingBufferTarget/event') AS Data2 (Results)) AS DT
WHERE DT.ResourcePoolID > 255 –- only show user-defined resource pools
GROUP BY DT.ResourcePoolID;
GO

Phew! Esiste codice complesso certamente alcune in tale posizione, ma funziona correttamente. A questo punto È stato ottenuto i risultati che desidera. Esaminare l'output dalla query nei dati di test, illustrati nella Figura 7 .

Nella figura 7 output dalla query
ResourcePoolID TotalReads TotalWrites
256 3831 244
257 5708155 1818

È possibile indicare che pool di risorse 256 è marketing, mentre 257 è per lo sviluppo, pertanto questi numeri di rilevamento in termini di quante attività del database prevedibile dal team dell'azienda. È possibile non prodotte questi risultati facilmente stato non utilizzato eventi estesa.

E, infine, È necessario interrompere la sessione con il codice seguente:

ALTER EVENT SESSION MonitorIO ON SERVER
STATE = STOP;
GO

Per scoprire ciò che sono parlando in termini di output in ogni fase di questo esempio, estrarre la schermata cast che accompagna questo articolo. È possibile trovare in technetmagazine.com/video.

System_health estesa eventi di sessione

SQL Server 2008 include effettivamente una sessione predefinita è impostata su eseguito per impostazione predefinita e viene chiamata la sessione system_health. La sessione corrente è l'idea del team di supporto tecnico clienti e tiene traccia di informazioni che sono generalmente utilizzare per eseguire il debug sistemi di cliente, ad esempio quando si verifica un blocco critico (deadlock) o un errore di gravità alta. La sessione viene creata e avviata come parte del processo di installazione per un'istanza di SQL Server 2008, e gli eventi in un buffer circolare tiene traccia in modo che non utilizzano una quantità eccessiva di memoria.

Puoi utilizzare il codice riportato di seguito per verificare il buffer circolare necessario contiene:

SELECT CAST (xest.target_data AS XML)
FROM sys.dm_xe_session_targets xest 
JOIN sys.dm_xe_sessions xes ON
xes.address = xest.event_session_address 
WHERE xes.name = 'system_health';
GO

Il Blog di supporto SQL al supporto tecnico Microsoft dispone di informazioni più dettagliate su cosa del rilevato da questa sessione.

Disposizione dei

È stato detto che il team SQL Server è la pianificazione aggiungere molti eventi di più in sqlserver.exe in futuro. Infatti, il numero modificato da rilasciare 165 in febbraio 2007 CTP (Community Technology Preview) per 254 nella versione RTM (versione in fase di produzione).

Esistono alcuni eventi davvero interessante a ricerca per analizzare, ad esempio per modificare dati acquisizione (che È trattata in mio articolo "Verifica Variazioni in Buoni del database dell'organizzazione"compressione dei dati e indice nel numero di novembre 2008 di TechNet Magazine) pagina divisioni. Indice di pagina divisioni aspetto promessa d ' consente di elaborare quali indici siano creando i frammentazione sapping prestazioni senza la necessità di eseguire periodicamente il sys.dm_db_index_physical_stats DMV su tutti gli indici.

Nel complesso, il sistema di eventi estesa nuovo consente alcuni monitoraggio molto sofisticati che non è stato possibile prima. Sebbene richieda un po'di formazione scoprire l'analisi XML che sarà necessario eseguire per ottenere con i dati, i vantaggi del nuovo sistema di sono molto superiori disputa di dover apprendere alcuni costrutti di codice nuovi.

Spero che questo articolo è assegnato è sufficiente una panoramica degli eventi estesa per ottenere è interessato e visualizzare i tipi delle operazioni che è possibile eseguire con tale. Risoluzione felice. Come sempre, se si dispone eventuali commenti e suggerimenti o domande, possibile rilascio di una riga Paul@SQLskills.com.

S Paul Randal è il responsabile gestione SQLskills.come un MVP di SQL Server. Ha lavorato nel team motore di archiviazione di SQL Server in Microsoft da 1999 a 2007. Paul scritto DBCC CHECKDB e ripristino per SQL Server 2005 ed era responsabile per il motore di archiviazione principale durante lo sviluppo di SQL Server 2008. Paul è un esperto di ripristino di emergenza, un'elevata disponibilità e manutenzione dei database ed è un normale relatore a conferenze di tutto il mondo. Blog ha in SQLskills.com/blogs/paul.