<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog - Guireg CAPITAINE &#187; Traces</title>
	<atom:link href="http://www.guiregcapitaine.com/tag/traces/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.guiregcapitaine.com</link>
	<description>Le blog de mes expériences</description>
	<lastBuildDate>Sun, 30 May 2010 10:08:12 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=abc</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Décoder vos traces avec l&#8217;utilitaire TKPROF</title>
		<link>http://www.guiregcapitaine.com/2009/11/23/decoder-vos-traces-avec-lutilitaire-tkprof/</link>
		<comments>http://www.guiregcapitaine.com/2009/11/23/decoder-vos-traces-avec-lutilitaire-tkprof/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 18:29:03 +0000</pubDate>
		<dc:creator>Guireg CAPITAINE</dc:creator>
				<category><![CDATA[Mes expériences personnelles]]></category>
		<category><![CDATA[10G]]></category>
		<category><![CDATA[11G]]></category>
		<category><![CDATA[Oracle Database]]></category>
		<category><![CDATA[tkprof]]></category>
		<category><![CDATA[Traces]]></category>

		<guid isPermaLink="false">http://www.guiregcapitaine.com/?p=384</guid>
		<description><![CDATA[
Introduction
Comme vous avez pu dans le voir dans l&#8217;article Générer des traces sur votre instance Oracle , les traces en elle-même sont globalement illisibles  
Pour vous éviter un mal de tête, Oracle a développer un outil très pratique nommé Tkprof qui se chargera de vous décoder vos traces et de vous fournir quelques éléments [...]]]></description>
			<content:encoded><![CDATA[<h1><a href="http://www.guiregcapitaine.com/wp-content/uploads/2009/11/idea.jpg" rel="lightbox[384]"><img class="alignright size-medium wp-image-437" title="Tkprof - I've got an idea" src="http://www.guiregcapitaine.com/wp-content/uploads/2009/11/idea-300x225.jpg" alt="Tkprof - I've got an idea" width="200" height="151" /></a></h1>
<h1>Introduction</h1>
<p>Comme vous avez pu dans le voir dans l&#8217;article <a title="Générer des traces sur votre instance Oracle" href="http://www.guiregcapitaine.com/2009/11/07/generer-des-traces-sur-votre-instance-oracle/">Générer des traces sur votre instance Oracle</a> , les traces en elle-même sont globalement illisibles <img src='http://www.guiregcapitaine.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Pour vous éviter un mal de tête, Oracle a développer un outil très pratique nommé Tkprof qui se chargera de vous <em>décoder</em> vos traces et de vous fournir quelques éléments pratiques comme le plan d&#8217;exécution des requêtes.</p>
<h1>Utilisation de TkProf</h1>
<p>TkProf est inclut dans Oracle Client et Oracle Database. C&#8217;est un outil en ligne de commande que vous pouvez via une invite de commande sous Windows ou un terminal sous Linux.</p>
<p>Sans plus attendre, voici la syntaxe :</p>
<p><span style="text-decoration: underline;">Windows :</span></p>
<blockquote><p>tkprof  C:/oracle/&#8230;./trace.trc output=C:/oracle/&#8230;./trace_output.txt</p></blockquote>
<p><span style="text-decoration: underline;">Linux :</span></p>
<blockquote><p>$ORACLE_HOME/bin/tkprof  /app/oracle/&#8230;/trace.trc output=/app/oracle/&#8230;/trace_output.txt</p></blockquote>
<p><span style="color: #ff0000;">Attention :</span> La version de TkProf doit être impérativement la même que celle de la base de donnée où vous avez généré vos traces. Si elles sont différentes, vous aurez à coup sûr des valeurs aberrantes dans votre output file.</p>
<h2>Les options indispensables</h2>
<p>Pour que vos rapports TkProf soient plus lisibles, quelques options sont indispensables.</p>
<ul>
<li>SYS=no : Ne pas afficher les ordres SQL exécutés par l&#8217;utilisateur SYS</li>
<li>EXPLAIN=user/password : Permet de spécifier le schéma dans lequel tkprof va générer les explain plan. Inutile si vous générez vos traces directement avec le compte oracle en local sur votre base de donnée</li>
<li>AGGREGATE=no : Permet de ne pas regrouper les ordres SQL similaires</li>
<li>SORT= : Permet de triées les instructions selon l&#8217;option désirée</li>
</ul>
<h2>Et comment je les utilise ces options ?</h2>
<p>Simple comme bonjour ! Par exemple, pour des traces sans ordres SQL exécutées par SYS et pas de regroupements d&#8217;ordres SQL similaires sous Linux :</p>
<blockquote><p>$ORACLE_HOME/bin/tkprof  /app/oracle/&#8230;/trace.trc sys=no aggregate=no output=/app/oracle/&#8230;/trace_output.txt</p></blockquote>
<h1>Comment lire mon rapport ?</h1>
<p>Pour mieux illustrer, prenons la trace qui avait été générée dans mon article<a href="http://www.guiregcapitaine.com/2009/11/07/generer-des-traces-sur-votre-instance-oracle/"> <em>Générer des traces sur votre instance Oracle</em></a>.</p>
<blockquote>
<pre>********************************************************************************

SELECT e.last_name, j.job_title from oracle.employees e
    JOIN oracle.jobs j ON (e.job_id=j.job_id)

call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.01       0.13          0          4          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        2      0.00       0.00          0         15          0         107
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        4      0.01       0.14          0         19          0         107

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: SYS

Rows     Row Source Operation
-------  ---------------------------------------------------
    107  HASH JOIN  (cr=15 pr=0 pw=0 time=5798 us)
     19   TABLE ACCESS FULL JOBS (cr=7 pr=0 pw=0 time=187 us)
    107   TABLE ACCESS FULL EMPLOYEES (cr=8 pr=0 pw=0 time=796 us)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       2        0.00          0.00
  SQL*Net message from client                     2        0.14          0.15
********************************************************************************</pre>
</blockquote>
<p>Nous pouvons distinguer trois parties :</p>
<ul>
<li>Un tableau avec plein de nombres. (On reviendra dessus après)</li>
<li>L&#8217;explain plan de la requête</li>
<li>Les Wait events générés par la requête</li>
</ul>
<h3>Comment je le lis le tableau ?</h3>
<p>Ce fameux tableau est découpé en trois lignes :</p>
<ul>
<li><em>Parse :</em> Cette étape détermine le plan d&#8217;exécution de votre requête</li>
<li><em>Execute :</em> Pour les ordres INSERT, UPDATE, DELETE : modifie les données. Pour l&#8217;ordre SELECT : Identifie les lignes à extraire</li>
<li><em>Fetch :</em> Extraction des lignes et opérations de tri. Concerne uniquement l&#8217;ordre SELECT.</li>
</ul>
<p>Concernant les lignes, voici leurs significations :</p>
<ul>
<li><em>Count :</em> Nombre de fois que le Parse/Execute/Fetch a été exécuté</li>
<li><em>CPU (Seconde) : </em>Temps total de traitement CPU</li>
<li><em>Elapsed (Seconde) :</em> Temps total pris par le Parse/Execute/Fetch.</li>
<li><em>Disk :</em> Nombre total de blocs lus physiquement dans les fichiers de données</li>
<li><em>Query :</em> Nombre de buffers exploités en mode cohérent</li>
<li><em>Current :</em> Nombre de buffers exploités en mode courant</li>
<li><em>Rows : </em>Nombre de lignes affectés par la requête.</li>
</ul>
<h3>Quelques consignes pour bien commencer</h3>
<ol>
<li>Vérifier qu&#8217;il n&#8217;y a pas de grosses différences entre CPU et Elapsed</li>
<li>N&#8217;oubliez jamais de diviser vos valeurs par la valeur de Count</li>
<li>Prenez l&#8217;habitude d&#8217;additionner Current et Query pour connaître le nombre total de buffers extraits</li>
<li>Comparer le nombre de blocs parcourus aux nombre de lignes fetchées pour vérifier s&#8217;il ne manque pas un index. (Inutile si vous avez l&#8217;explain plan)</li>
<li>Ne perdez pas de temps à trop décoder, ça se parcoure vraiment très rapidement</li>
</ol>
<p><strong>Conclusion</strong></p>
<p>TkProf est un outil très facile à utiliser mais néanmoins indispensable à tous les DBAs. Il vous permettra de comprendre et résoudre de nombreux problèmes en très peu de temps.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.guiregcapitaine.com/2009/11/23/decoder-vos-traces-avec-lutilitaire-tkprof/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Générer des traces sur votre instance Oracle</title>
		<link>http://www.guiregcapitaine.com/2009/11/07/generer-des-traces-sur-votre-instance-oracle/</link>
		<comments>http://www.guiregcapitaine.com/2009/11/07/generer-des-traces-sur-votre-instance-oracle/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 11:48:52 +0000</pubDate>
		<dc:creator>Guireg CAPITAINE</dc:creator>
				<category><![CDATA[Mes expériences personnelles]]></category>
		<category><![CDATA[10G]]></category>
		<category><![CDATA[11G]]></category>
		<category><![CDATA[Base de données]]></category>
		<category><![CDATA[Explain plan]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Oracle Database]]></category>
		<category><![CDATA[Plan d'exécution]]></category>
		<category><![CDATA[tkprof]]></category>
		<category><![CDATA[Traces]]></category>

		<guid isPermaLink="false">http://www.guiregcapitaine.com/?p=355</guid>
		<description><![CDATA[
Introduction
Imaginez-vous dans cette situation : un programmeur vous appelle &#171;&#160;Monsieur CAPITAINE, j&#8217;ai des problèmes avec un de mes traitements sur l&#8217;instance de Dèv, c&#8217;est très lent. Pouvez-vous me dire ce qui est lent ?&#160;&#187;. Qu&#8217;allez-vous faire ? Vous allez lancer des traces.
C&#8217;est un des outils les plus pratiques du DBA Oracle. Une trace est un [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="border: 0pt none;" src="http://www.guiregcapitaine.com/wp-content/uploads/2009/10/traces_inversed.jpeg" alt="" width="182" height="182" /></p>
<h1>Introduction</h1>
<p>Imaginez-vous dans cette situation : un programmeur vous appelle &laquo;&nbsp;Monsieur CAPITAINE, j&#8217;ai des problèmes avec un de mes traitements sur l&#8217;instance de Dèv, c&#8217;est très lent. Pouvez-vous me dire ce qui est lent ?&nbsp;&raquo;. Qu&#8217;allez-vous faire ? Vous allez lancer des traces.</p>
<p>C&#8217;est un des outils les plus pratiques du DBA Oracle. Une trace est un fichier plat qui recense tous les ordres SQL passés entre un laps de temps que vous définirez. Dans l&#8217;exemple plus haut, l&#8217;intervalle serait <em>Début du traitement &#8211; Fin du traitement</em> .</p>
<h1>Un peu de technique</h1>
<p>Voici une trace : <a href="http://www.guiregcapitaine.com/wp-content/uploads/orcl_ora_3428.trc" target="_blank">Cliquez ici pour la voir</a></p>
<p>Première impression : &laquo;&nbsp;Gné ?&nbsp;&raquo; . Vous avez tout à fait raison. Les traces, en elle-même, sans être parsées par l&#8217;utilitaire tkprof sont globalement illisibles sauf pour les DBA très expérimentés qui se feront une joie de vous les déchiffrer.</p>
<p>Pour satisfaire votre curiosité, voici la même trace qu&#8217;au dessus mais à la différence d&#8217;être parsées par TKPROF : <a href="http://www.guiregcapitaine.com/wp-content/uploads/trace.txt" target="_blank">Cliquez ici pour la voir</a></p>
<h1>Comment on trace ?</h1>
<p>Il y a plusieurs façons de générer des traces. Vous pouvez les générer pour &laquo;&nbsp;vous&nbsp;&raquo; au niveau session, mais vous pouvez aussi les générer pour une session différente de la vôtre.</p>
<h2>Tracer votre propre session</h2>
<p>Tout d&#8217;abord au niveau de votre de votre session, la solution la plus simple est l&#8217;ALTER SESSION :</p>
<blockquote><p>ALTER SESSION SET EVENTS &#8216;10046 trace name context forever,level 12&#8242;;</p></blockquote>
<p>Vous n&#8217;avez plus qu&#8217;à exécuter votre traitement qui pose des soucis de performance. Une fois terminée, vous n&#8217;avez qu&#8217;à entrer cette commande :</p>
<blockquote><p>ALTER SESSION SET EVENTS &#8216;10046 trace name context off&#8217;;</p></blockquote>
<p><strong>Tiens d&#8217;ailleurs en parlant de ça je pourrais les trouver où mes traces ?</strong></p>
<p>Pour trouver l&#8217;emplacement de vos traces, il suffit d&#8217;ouvrir SQL*plus et de copier la commande</p>
<blockquote><p>show parameter user_dump_dest</p></blockquote>
<p>Le résultat est le dossier exact où se trouve toutes vos traces générées.</p>
<h2>Tracer une session distante</h2>
<p>Maintenant, pour tracer des sessions distantes, vous pouvez utiliser le package DBMS_SYSTEM comme ceci :</p>
<blockquote>
<pre style="line-height: 18pt;">EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION (sid=&gt;[sid],serial#=&gt;[serial],sql_trace=&gt;TRUE);</pre>
</blockquote>
<p>Exécutez votre traitement puis pour stopper les traces :</p>
<blockquote>
<pre style="line-height: 18pt;">EXECUTE DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION (sid=&gt;[sid],serial#=&gt;[serial],sql_trace=&gt;FALSE);</pre>
</blockquote>
<p><span style="color: #ff0000;">Attention :</span> Votre utilisateur doit avoir le droit EXECUTE sur le package DBMS_SYSTEM pour faire ceci.</p>
<p><strong>Je fais comment pour récupérer le SID et le SERIAL ?</strong></p>
<p>Le SID (Session ID) et le Serial# sont des identifiants uniques attachés à chaque session sur votre base de données Oracle. Pour récupérer le SID de la session visée, exécutez cette requête :</p>
<blockquote>
<pre style="line-height: 18pt;">SELECT SYS_CONTEXT('userenv','SID') SID FROM DUAL;</pre>
</blockquote>
<p>Ensuite, avec un utilisateur qui a les privilèges de SELECT sur la vue V$SESSION, vous pouvez retrouver le serial avec cette requête :</p>
<blockquote>
<pre style="line-height: 18pt;">SELECT serial# FROM V$SESSION WHERE sid=[SID précédemment trouvé];</pre>
</blockquote>
<h1>Conclusion</h1>
<p>Maintenant que vous savez lancer des traces de votre session et d&#8217;une distante, il vous faut les rendre lisibles. Pour ceci, la page suivante vous apprendra à manipuler l&#8217;utilitaire<em> tkprof.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.guiregcapitaine.com/2009/11/07/generer-des-traces-sur-votre-instance-oracle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
