SQL Server 2008

Avancé dépannage des événements globale

Paul S. Randal

 

À une vue d'ensemble :

  • Pourquoi la résolution des problèmes sont nécessaire
  • Dépanner des outils dans SQL Server
  • Vue d'ensemble et architecture d'événements étendu
  • Utilisation d'événements globale

Contenu

Résolution des problèmes dans SQL Server 2005
Événements étendus
Considérations de performances
Vie d'un événement
Utilisation d'événements globale
L'étendue des événements session system_health
Conclusion

SQL Server DBAs le monde sur avoir un problème qui semble jamais disparaissent : résolution des problèmes, avec la grande majorité de dépannage effectué pour rechercher un problème de performances quelconque.Même les plus attentivement conçue et système d'application testé est expérience modifications dans le temps peut entraîner des problèmes de performances significative.

Par exemple, la charge de travail peut modifier (tels que le nombre d'utilisateurs simultanés, les requêtes en cours d'exécution et rapports de fin de mois nouveau en cours d'exécution), le volume de données en cours de traitement peut augmenter le matériel sur lequel s'exécute le système peut modifier (tels que le nombre de noyaux du processeur, quantité de mémoire de serveur disponible et la capacité sous-système d'E / S) et nouveau simultanées charges de travail peuvent être présentés (base de données telles que la réplication transactionnelle, de la mise en miroir et modifier la capture de données).

Vidéo

Paul Randal illustre comment vous pouvez utiliser la nouvelle fonctionnalité étendue des événements dans SQL Server 2008 pour la surveillance et le dépannage des.

Mais les ne sont pas les problèmes uniquement qui se produisent.Lorsque vous créez et systèmes d'applications de test, inattendues des problèmes sont souvent détectés avec la conception, qui puis également nécessitent résolution des problèmes.Bien entendu, sans tenir compte lorsque dans le cycle de vie application le problème est détecté, résolution des problèmes doivent être effectuées pour identifier la cause et une solution.

Un système d'application complexe a plusieurs composants matériels et logiciels peut-être besoin d'être analysées, mais celui que je suis préoccuper est SQL Server.Sans envisagez les performances différents dépannage des méthodologies (qui serait être une conversation bien au-delà de la portée de cet article), quels sont les outils dont vous avez besoin pour le dépannage de SQL Server ?

Résolution des problèmes dans SQL Server 2005

Sur les dernière versions peu de SQL Server, la sélection d'outils disponibles pour la résolution des performances a développée considérablement.SQL Server a toujours eu plusieurs commandes DBCCs (Database Console Command) disponibles pour fournir la vision de ce qui se passe dans les différentes parties du moteur de base de données.En outre, il est SQL Server Profiler et par programmation en utilisant le mécanisme de trace SQL sous-jacente.

Bien que SQL Server a proposé en permanence avancées pour le dépannage, ces options présentent certains problèmes.Post-Processing de DBCC sortie est difficile, que vous le souhaitez vider les résultats dans une table temporaire avant quoi que ce soit avec eux.Et exécution SQL trace/du Générateur de profils peut provoquer une baisse des performances lorsque mal configuré (comme le suivi de verrouiller tous les : Acquisition et verrouiller : lancé événements sur un système de disponibilité et oubli pour appliquer un filtre sur DatabaseId et ID d'objet colonnes l'événement).La capture d'écran dans la figure 1 affiche une boîte de dialogue utilisé pour configurer un filtre pour une nouvelle trace.

fig01.gif

Figure 1 Configuration d'un filtre dans le Générateur de profils SQL Server 2008

SQL Server 2005 ajouté gestion dynamique vues et fonctions (collectivement appelées DMV) comme un moyen d'obtenir des informations hors du moteur de base de données.DMV remplacé certains commandes DBCC, les tables système et les procédures stockées et exposé plusieurs nouvelles zones du fonctionnement du moteur.Ces DMV est des commandes puissants qui sont composable, qu'elles puissent être utilisées dans les instructions T-SQL complexes qui filtrer et post-process les résultats DMV.

Par exemple, le code illustré figure 2 renvoie uniquement les fragmentation et densité page (les deux arrondies) des niveaux de feuille de tous les index dans une base de données, avec un filtre au niveau de fragmentation.Ceci ne peut pas être réalisé facilement utilisant ma commande DBCC SHOWCONTIG ancien.(Pour plus d'informations sur DMV, voir »Vues de gestion dynamique et fonctions (Transact-SQL)." En outre, SQL Server 2005 ajouté un certain nombre d'autres fonctionnalités qui pourraient être utilisées pour corriger, y compris les déclencheurs DDL (data definition language) et notifications d'événement.

La figure 2 Utilisation DMV pour résultats puissantes

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

Différentes équipes au sein de Microsoft ont également fourni utile performances dépanner des outils, tels que le Utilitaire SQLdiag, la Utilitaires RML pour SQL Server, la Rapports de tableau de bord de performances SQL Server 2005, et DMVStats. Il existe également un Fournisseur d'événements suivi (ETW, Event TRACING for Windows) pour SQL Server 2005, qui autorise les événements de trace SQL pour être intégré avec des événements à partir d'autres parties de Windows.

Pendant que SQL Server 2005 rendue très avancées pour augmenter la capacité de DBAs à résoudre le moteur de base de données, il y avait toujours plusieurs scénarios qui ont été presque impossible de DBAs dépanner efficacement. Dans un exemple souvent citée, certaines requêtes utilisent des montants trop de ressources D'UC, mais les DMV ne fournissez pas suffisamment informations mettre en évidence les requêtes ad hoc sont la cause. Mais contrairement à SQL Server 2005, SQL Server 2008 est en mesure de résoudre ces restrictions par une nouvelle fonctionnalité appelée événements étendue de SQL Server.

Événements étendus

Les capacités du système d'événements globale sont bien au-delà de celles de toute précédente suivi d'événements et de dépannage mécanisme de SQL Server a fourni. À mon avis, les extraits du système d'étendue des événements sont les suivantes :

  • Événements se déclenchent synchrone mais peuvent être traités de façon synchrone ou asynchrone.
  • Les cibles peut consommer n'importe quel événement et toute action peut être associée à un événement, permettant à un système de surveillance détaillé.
  • « Actives prédicats permettent de créer des règles complexes à l'aide de logique booléenne.
  • Vous pouvez contrôlez complète sessions étendue des événements à l'aide de Transact-SQL.
  • Vous pouvez surveiller code critique de performances sans impact sur les performances.

Avant de se sur, je vous prenez un instant pour définir de la terminologie de nouveau.

événement Un événement est un point défini dans le code. Voici quelques exemples sont le point auquel une instruction T-SQL exécution terminée ou le point auquel l'acquisition d'un verrou est terminée. Chaque événement est une charge définie (le jeu de colonnes qui sont retournées par l'événement) et est définie l'utilisation du modèle ETW (où chaque événement renvoie un canal et le mot clé dans le cadre de la charge utile) pour autoriser l'intégration avec ETW. SQL Server 2008 initialement livrés avec des événements définis 254 et plus doivent être ajoutés dans le temps.

Vous pouvez visualiser la liste d'événements définis à l'aide du code suivant :

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

Et vous pouvez trouver la charge utile d'un événement spécifique à l'aide de ce code :

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

Notez que le système d'événements étendu comporte un ensemble complet de DMV d'information qui décrivent tous les événements, objectifs et ainsi de suite. Pour plus d'informations, voir la rubrique" SQL Server étendue des événements dynamique Gestion des affichages."

prédicats Prédicats sont la méthode utilisée pour filtrer les événements avec un ensemble de règles de logiques avant les événements sont consommés. Prédicats peuvent être simples, telles que la vérification qu'une des colonnes renvoyées par l'événement charge utile est une valeur donnée (par exemple, filtrage acquis de verrou événements par code de l'objet).

Ils fournissent également des fonctionnalités avancées, telles que compter le nombre de fois qu'un événement spécifique s'est produit lors de la session et uniquement ce qui permet l'événement pour être consommés après une occurrence ou dynamiquement mise à jour le prédicat lui-même pour supprimer la consommation d'événements contenant des données similaires.

Prédicats peuvent être écrits à l'aide de logique booléenne afin de leur court-circuit dès que possible. Ceci permet la quantité minimale de traitement synchrone à effectuer avant de déterminer si l'événement va être consommés ou non.

action Une action est un ensemble de commandes qui sont effectuées de façon synchrone avant un événement est consommé. Toute action peut être liée à un événement. Ils rassembler généralement plus de données à ajouter à la charge utile événement (comme une pile de T-SQL ou un plan d'exécution de requête) ou à effectuer certaines calcul est ajoutée à la charge utile d'événement.

Actions peuvent être coûteuses, les actions pour un événement sont exécutées uniquement après que tout prédicat a été évalué, il serait inutile à l'exécution synchrone d'une action s'il a été puis déterminé que l'événement ne serait pas être consommé. Une liste des actions prédéfinies se trouve à l'aide du code suivant :

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

cible Une cible simplement permet pour consommer les événements, et les cibles peut utiliser n'importe quel événement (ou moins céder il Si rien pour faire la cible, par comme une cible d'audit Obtention d'un événement d'audit non). Cibles peuvent consommer des événements de façon synchrone (pour instance, le code qui a déclenché l'événement attend que l'événement doit être consommée) ou asynchrone.

Cible comprises entre consommateurs simples, tels que les événements fichiers et les mémoires tampon en anneau, et plus complexes consommateurs qui ont la possibilité d'effectuer la paire d'événements. Vous trouverez la liste des cibles disponibles à l'aide du code suivant :

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

Pour plus d'informations sur cibles, consultez » SQL Server étendue cibles d'événements."

package Un package est un conteneur qui définit les objets d'étendue des événements (tels que les événements, actions et cibles). Un package est contenu au sein du module (comme un fichier exécutable ou une DLL) il décrit, comme illustré figure 3 .

La figure 3 la relation betweenmodules, les paquets et les objets ExtendedEvents

Quand un package est enregistré avec le moteur étendue des événements, tous les objets définis par il sont ensuite disponibles pour utilisation. Pour plus d'informations sur les packages et une liste complète des événements étendu terminologie, voir » Total des lots des événements SQL Server."

session Une session représente un moyen de lier ensemble globale des événements des objets de traitement, un événement avec une action devant être consommée par une cible. Une session pouvez lier des objets à partir des packages enregistrés, de n'importe quel nombre de sessions pouvant utiliser le même événement, action, etc.. Vous pouvez voir les sessions étendue des événements sont définies à l'aide du code suivant :

SELECT * FROM sys.dm_xe_sessions;
Go

Sessions sont créées, supprimé modifié, arrêtée et démarrée en utilisant les commandes de T-SQL. Comme vous pouvez l'imaginer, ceci offre une grande flexibilité, même la possibilité de modifier dynamiquement une session en fonction de programmation analyse des données en cours capturées par la session elle-même. Pour plus d'informations sur des sessions, consultez » SQL Server total de sessions d'événements."

Considérations de performances

Lorsque vous placez ensemble une session de total des événements à l'aide cas CREATE SESSION, il existe certains paramètres que vous devez faire attention configurer correctement, comme elles peuvent affecter par inadvertance des performances. Votre première décision est s'il faut avoir les événements consommées de manière synchrone ou asynchrone. Et comme vous pouvez l'imaginer, cibles synchrones ont supérieure effet sur les performances du code surveillé que cibles asynchrones.

Comme J'AI expliqué ci-dessus, lorsqu'un événement est consommé de manière synchrone, le code qui a déclenché l'événement doit attendre que l'événement a été consommé. Bien entendu, si consommation de l'événement est un processus complexe, cela peut ralentir le code.

Par exemple, sur un système occupé maintenance des milliers de petites transactions par seconde, synchrone consommation d'un événement sql_statement_completed avec une action pour capturer une requête plan est très probablement avoir un impact négatif sur les performances. N'oubliez pas que prédicats sont exécutées toujours de manière synchrone, donc attention doit être prélevée ne pas pour créer des prédicats trop complexes des événements déclenchés par le code critique de performances.

En revanche, vous soit forcé consommer des événements de façon synchrone. Pour compter les occurrences d'un événement particulier, la façon de procéder plus simple sera probablement d'utiliser la cible synchronous_event_counter.

La deuxième chose que vous devez prendre en compte est comment configurer le tampon d'événement si vous décidez d'utiliser des cibles asynchrones. La quantité par défaut de mémoire disponible pour la mise en tampon de l'événement est 4 Mo. La latence de répartition par défaut entre un événement est déclenché et ensuite consommés par une cible est de 30 secondes. Si, par exemple, vous souhaitez générer des statistiques d'événement 10 secondes, vous devez modifier la latence.

Liés aux paramètres de mise en mémoire tampon d'événement consiste à comment vous souhaitez partitionner la mémoire utilisée à des événements mémoire tampon. La valeur par défaut est de créer un ensemble de tampons pour l'instance ensemble. Sur SMP (multiprocesseurs symétriques) et les machines NUMA (non-uniform Memory Access), cela peut entraîner des problèmes de performances avec processeurs avoir à attendre l'accès à la mémoire.

La troisième considération est comment vous à gérer les événements perte. Lorsque vous définissez la session d'étendue des événements, vous pouvez spécifier si les événements peuvent être « perdus ». Cela signifie que si n'est pas assez de mémoire pour un événement de la mémoire tampon, il est tout simplement ignoré. La valeur par défaut est pour autoriser les événements unique pour être supprimé, mais vous pouvez également autoriser les mémoires tampon ensemble d'événements à être perdues (pour les sessions où événement tampons remplir très rapidement) ou même spécifier qu'aucun événement ne peut être perdues.

Cette option dernière doit être utilisée avec précaution idéale, car elle force le code qui a déclenché l'événement d'attendre la mémoire tampon pour stocker l'événement. Cette option presque toujours a un effet négatifs sur les performances. Notez que si par inadvertance, vous définissez cette option pour sur, le serveur doit rester réactif pour désactiver le paramètre de vous permettre de.

En règle générale, vous devez prendre en compte ces paramètres ensemble. Et il n'existe pas vraiment généralisé recommandé que je peut donner à l'exception pour Assurez-vous que vous placer pensée dans les ou vous pouvez exécuter des problèmes de performances. Vous trouverez plus d'informations sur ces paramètres dans » CREATE SESSION CAS (T-SQL)".

Vie d'un événement

Une fois que la session d'étendue des événements a été définie et démarrée, le traitement continue comme normal jusqu'à ce que le code surveillé est fourni dans un événement. Les étapes suivies par le système étendue des événements sont présentés dans la figure 4 . Les étapes sont les suivantes :

  1. Une vérification est effectuée pour voir si les sessions événements étendu surveillez l'événement. Si ce n'est pas le cas, le contrôle est renvoyé au code qui contient l'événement, et le traitement continue.
  2. La charge utile d'événement est déterminée, et toutes les informations requises sont collectées dans la mémoire — en d'autres termes, la charge utile d'événement est construite.
  3. Si les prédicats sont définies pour l'événement, elles sont exécutées. À ce stade, le résultat du prédicat peut être que l'événement ne doit pas être consommé. Si c'est le cas, le contrôle est renvoyé au code qui contient l'événement, et le traitement continue.
  4. Maintenant le système sait que l'événement sera consommée, afin qu'elle exécute les actions liées à l'événement. L'événement a une charge complète maintenant et est prête pour la consommation.
  5. L'événement est fournie à cibles synchrones, le cas échéant.
  6. Si les cibles asynchrones existent, l'événement est mises tampon pour un traitement ultérieur.
  7. Le contrôle est renvoyé au code qui contient l'événement, et le traitement continue.

sqlfig04.gif

La figure 4 durée de vie d'un événement étendue des événements (cliquez sur l'image pour l'agrandir)

Comme je L'AI mentionné précédemment, attention doit être prélevée lorsque vous créez une session d'événement afin que les actions synchrones ou mise en tampon pour les cibles asynchrones s'affectent pas les performances du code surveillé.

Utilisation d'événements globale

Documentation en ligne de SQL Server 2008 inclut deux exemples d'utilisation d'événements total: » Comment : déterminer quelles requêtes sont groupe verrous« et » Comment : rechercher les objets qui ont les plupart des verrous utilisés sur les."

J'aimerais étudier un exemple de paramétrage d'une session étendue des événements et analyser les résultats. Comme J'AI appris des lorsque J'AI commencé à l'aide étendue des événements dans 2007 au plus tard, assembler une session simple est très simple (utilisez les instructions DDL T-SQL simples), mais analyser les résultats est non trivial.

Les résultats sont présentés dans XML, initialement surpris m'avant que J'AI réalisé que le nombre important de combinaisons possibles d'événements et actions qui peuvent être collectées dans une seule session réellement conçue il ne était aucun autre choix réalisable pour stocker un schéma si extensible.

À présent, j'a été un développeur de l'équipe du moteur de stockage SQL Server depuis de nombreuses années et que vous m'envisager un programmeur C, C++ et assembly hautement proficient, mais je devais passer quelques heures découvrir le code nécessaire pour extraire champs de la charge utile d'événement par programmation les données XML. Je pas tente vous supprimer d'utiliser des événements étendu ; au lieu de cela, je suis uniquement vous avertir que si vous n'avez pas utilisé à la manipulation de données XML, être préparé pour un peu d'une courbe d'apprentissage avant de vous voir des résultats.

Voici mon scénario : je suis un administrateur de base de données utilisant des différents groupes de la fonctionnalité de Governor ressources de SQL Server 2008 à sandbox dans mon entreprise sur un des serveurs de production. J'ai créé deux pools de ressource ressources Governor, développement et marketing, pour représenter chaque équipe utilisant ce serveur. Ressource Governor m'afin de limiter processeur chaque pool et utilisation de mémoire de l'exécution de requête, mais pas la quantité de ressources d'E / S qu'ils utilisent permet. Par conséquent, j'aimerais institute un mécanisme d'écriture qui permet de m'amortir le coût de mise à niveau vers un nouveau SAN (réseau SAN) à la facturation de chaque équipe pour l'utilisation d'E / S sur ce serveur.

Je suppose que la méthode la plus simple pour déclencher des informations d'E / S capturing est lorsque toute instruction T-SQL se termine, et je sais il y a un événement appelé sql_statement_completed dans le package package0. Ainsi, les données sont collectées dans l'événement charge utile ?

L'exécution le code suivant donnera me la liste de toutes les données, y compris les lectures mais écrit :

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

Je ne pense que ces sont physiques lectures et écritures (lorsque des données sont lire à partir d'ou sur le disque, plutôt que simplement en mémoire dans le pool de tampons), mais ils vous me donner une idée de la proportion de ressources d'E / S utilisé par chaque équipe.

Maintenant je dois afin de déterminer quelle équipe exécuté une instruction T-SQL particulier, et donc J'AI besoin une action me qui. L'exécution de ce code m'affiche une liste des actions que je peut prendre lorsque l'événement est déclenché, notamment un qui collecte le session_resource_pool_id dans le package 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];

J'AI peut obtenir la liste de ressources pools j'avez définies pour les ressources Governor et que mettre en corrélation avec les ID collectées par ma session étendue des événements. Maintenant je suis prêt à définir ma session. Notez que lorsque j'exécutez ce code, il est tout d'abord Vérifiez si une session d'événements avec le même nom existe. S'il en trouve un avec le même nom, il va supprimer la session. Voici le code :

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

Il crée ensuite une nouvelle session avec un événement unique, sql_statement_completed qui effectue également l'action session_resource_pool_id, ouvrir une session tout un tampon en anneau alors que je suis toujours prototypage. (En production, je serait probablement choisir d'utiliser une cible de fichier asynchrones.)

Pour lancer ma session, J'AI devrez exécuter ce code :

ALTER EVENT SESSION MonitorIO ON SERVER
STATE = START;
GO

Il est opérationnel.

Après avoir faking une activité des équipes de développement et marketing, je suis prêt à analyser les résultats de la session. Ce code va extraire les données à partir du tampon en anneau :

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

Toutefois, il extrait les données comme une valeur XML grande. Si je souhaite décomposer il supplémentaires, je peut utiliser le code illustré figure 5 .

La figure 5 critiques vers le bas les données 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

Cela fonctionne, mais donne une ligne de sortie pour chaque événement est capturée. Ce n'est pas un format fantastique ainsi que je souhaite obtenir sortie agrégée, telle sorte que J'AI décidé d'utiliser une table dérivée, comme vous pouvez le voir dans la figure 6 .

Obtention de la figure 6 agrégées sortie

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 ! Code certainement certains complexe est de là, mais qu'il fonctionne bien. J'ai donc maintenant les résultats que J'AI souhaité. Examinez la sortie à partir de cette requête sur mes données de test, illustrées figure 7 .

Sortie de la figure 7 à partir de ma requête
ResourcePoolID TotalReads TotalWrites
256 3831 244
257 5708155 1818

Je sais que liste de ressources 256 est de marketing, et 257 est pour le développement, afin ces nombres prendre opportun en termes de combien activité de base de données avez prévu des équipes de ma société. J'AI ne pourrait pas ont généré ces résultats que facilement avait J'AI pas utilisé étendue des événements.

Et enfin, je dois arrêter la session en utilisant le code suivant :

ALTER EVENT SESSION MonitorIO ON SERVER
STATE = STOP;
GO

Pour afficher davantage de quoi je parle en termes de la sortie à chaque étape de cet exemple, extraire l'écran cast qui accompagne cet article. Vous pouvez le trouver en technetmagazine.com/Video.

L'étendue des événements session system_health

SQL Server 2008 est fourni en fait avec une session prédéfinie qui est définie à exécuter par défaut et est appelée à la session system_health. Cette session était l'idée de l'équipe du support technique et il conserve le suivi des informations qu'ils utilisent généralement pour déboguer les systèmes clients, tels que lorsqu'un blocage ou une erreur de sévérité haute se produit. La session est créée et lancement en tant que partie du processus Installation pour une instance de SQL Server 2008, et il suit les événements dans un tampon en anneau afin que qu'il ne consomme pas trop de mémoire.

Vous pouvez utiliser le code suivant pour savoir ce que contient le tampon en anneau :

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

Le Blog de support Microsoft PSS SQL a plus d'informations sur ce qui est suivi par cette session.

Conclusion

J'ai été dit que l'équipe SQL Server prévoit d'ajouter de nombreux événements plus dans sqlserver.exe dans le futur. En fait, le numéro d'intervalle de 165 dans le mois de février 2007 CTP (Community Technology Preview) version à 254 dans la version RTM (version finale RTM).

Il existe certains événements très intéressants-recherche pour rechercher, par exemple pour modifier données capture (que j'abordé dans mon article L'option "suivi des modifications de la base de données entreprise »dans le numéro novembre 2008 de TechNet Magazine), compression de données et index page fractionnements. Index page fractionnements se présente comme une façon de promesse de livraison des fragmentation sapping des performances sans avoir à exécuter régulièrement le sys.dm_db_index_physical_stats DMV sur tous les index les index sont création.

Globalement, le système d'étendue des événements nouveau permet certains surveillance assez sophistiquées qui a jamais été possible avant. Bien qu'il nécessite un peu de formation déterminer l'analyse XML que vous devrez faire pour obtenir les données, les avantages du nouveau système dépassent loin la peine de devoir apprendre quelques nouvelles structures de codage.

J'espère que cet article a fourni suffisamment d'un aperçu d'étendue des événements pour vous aider à intéresser et vous montrer les types de choses que vous pouvez faire avec lui. Résolution des problèmes heureux ! Comme toujours, si vous avez des commentaires ou des questions, n'hésitez pas à me déplacer une ligne Paul@SQLskills.com.

S Paul Randal est le directeur Gestion de SQLskills.comet un MVP de SQL Server. Il a travaillé dans l'équipe SQL Server Storage Engine chez Microsoft de 1999 à 2007. Paul écrit DBCC CHECKDB/réparation pour SQL Server 2005 et était responsable pour le moteur de stockage base pendant le développement de SQL Server 2008. Paul est un expert de la récupération après incident, haute disponibilité et la maintenance de base de données et est un présentateur standard à des conférences dans le monde entier. Blogs il à SQLskills.com/blogs/paul.