Le blog de l'avenir

Aller au contenu | Aller au menu | Aller à la recherche

vendredi, février 11 2011

SQL Profiler & traces SQL Server-Side vs Client Side : Coté client ou coté serveur ?

A la recherche d'outils et d'informations pour l'analyse des performances sur une application Web et sa base de données SQL Server 2005, je recherchais un moyen de faire des traces et des analyses de deadlocks. Je connaissais SQL Profiler mais le problème est qu'il bouffe les ressources du serveur.

Et bien j'ai appris que :

- Quand on fait une trace avec SQL Server Profiler, c'est une trace "coté client". Même si on lance SQL Profiler sur le serveur. Et l'interface GUI bouffe les ressources. En fait pour faire une trace qui prend un minimum de ressources il faut faire une trace "coté serveur".

Faites une recherche "server side sql server trace" sur google vous trouverez plein de lien et tutoriels. Notamment celui là qui donne un graphique comparatif 1.sans traces, 2.traces coté serveur 3. traces coté client : http://sqlblog.com/blogs/linchi_shea/archive/2007/08/01/trace-profiler-test.aspx Traces SQL Server" Coté client" vs "Coté serveur"

http://sqlserverpedia.com/wiki/The_Server-side_Trace:_What,_Why,_and_How http://www.mssqltips.com/tip.asp?tip=1035 http://vyaskn.tripod.com/server_side_tracing_in_sql_server.htm

Et un très bon tutoriel en français sur developpez.com: http://elsuket.developpez.com/tutoriels/sqlserveur/fichier-trace-cote-serveur/

Retrouver les deadlock qui se sont produits sur une instance SQL Serveur 2008

Alors il y a quelques temps je me suis demander si c'était possible de retrouver des deadlocks qui se seraient produit sur une base de données SQL Serveur 2005 (Microsoft). Je me suis dit : "peut être avec un outil qui irait chercher ça dans le journal de transaction (fichier LDF) ou quelque chose comme ça". Mais j'ai pas trouvé par contre je suis tombé sur un lien : apparemment avec SQL Server 2008, il est désormais possible avec une requête SQL de lister tous les deadlocks d'une instance SQL.

Voici le lien : http://blog.developpez.com/elsuket/p9234/moteur-de-base-de-donnees-sql-server/obtenir-la-liste-des-deadlocks-retrospec/

Ca reste à approfondir (pas eu le temps), par exemple, est ce que cette liste est limitée au X derniers deadlocks ?

Voici le script (récupéré sur le lien) :

;WITH 
  -- Récupération des documents XML capturés par la session 
  xml_event_payload AS 
  ( 
    SELECT    CAST(T.target_data AS xml) AS data 
    FROM    sys.dm_xe_session_targets AS T 
    INNER JOIN  sys.dm_xe_sessions AS S 
          ON S.address = T.event_session_address 
    WHERE    S.name = 'system_health' 
  ), 
  prepare AS -- Extraction des événements de deadlock 
  ( 
    SELECT    ED.event_xml.value('(./data/value)[1]', 'varchar(max)') AS deadlock_data 
    FROM    xml_event_payload AS XEP 
    CROSS APPLY  data.nodes('/RingBufferTarget/event') AS ED (event_xml) 
    WHERE    ED.event_xml.value('./@name', 'varchar(32)') = 'xml_deadlock_report' 
  ), 
  well_form_xml_doc AS -- Formation correcte du document XML (mal formé par défaut) 
  ( 
    SELECT  REPLACE(REPLACE(deadlock_data, '<victim-list>', '<deadlock><victim-list>'), '<process-list>','</victim-list><process-list>') AS deadlock_data 
    FROM  prepare 
  ), 
  del_victim_list AS -- Formation correcte du document XML (mal formé par défaut) 
  ( 
    SELECT  CAST(STUFF(deadlock_data, PATINDEX('%<victim-list>%', deadlock_data), PATINDEX('%</victim-list>%', deadlock_data) + 14 - PATINDEX('%<victim-list>%', deadlock_data), '') AS xml) AS deadlock_data 
      , ROW_NUMBER() OVER(ORDER BY deadlock_data) AS n 
    FROM  well_form_xml_doc 
  )    
SELECT    n 
    , D.name AS database_name 
    , DC.deadlock_characteristics.value('./@lasttranstarted', 'datetime') AS occurence_date_time 
    , DC.deadlock_characteristics.value('(./inputbuf)[1]', 'varchar(max)') AS query 
    , deadlock_data 
FROM    del_victim_list 
CROSS APPLY  deadlock_data.nodes('/deadlock-list/deadlock/process-list/process') AS DC (deadlock_characteristics) 
INNER JOIN  sys.databases AS D ON D.database_id = DC.deadlock_characteristics.value('./@currentdb', 'int') 
WHERE    DC.deadlock_characteristics.value('./@lasttranstarted', 'datetime') > '20100823 00:00:00.000' 
ORDER BY  del_victim_list.n