<?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>Oracle - Concepts et Exemples &#187; parse</title>
	<atom:link href="https://blog.developpez.com/pachot/tag/parse/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/pachot</link>
	<description>Les fonctionalités et concepts d&#039;Oracle à partir de traductions et de démos</description>
	<lastBuildDate>Sun, 03 Apr 2016 20:36:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Statistiques de parsing des requêtes, par Jonathan Lewis</title>
		<link>https://blog.developpez.com/pachot/jl_parse_calls/</link>
		<comments>https://blog.developpez.com/pachot/jl_parse_calls/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 18:08:12 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Jonathan Lewis]]></category>
		<category><![CDATA[parse]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cet article est la traduction d&#8217;un article de Jonathan Lewis publié sur son blog. L&#8217;article original en anglais se trouve ici. Jonathan Lewis donne la définition des statistiques qui concernent les parsing des requêtes : session cursor cache hits parse &#8230; <a href="https://blog.developpez.com/pachot/jl_parse_calls/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p><ins>Cet article est la traduction d&rsquo;un article de Jonathan Lewis publié sur son blog. L&rsquo;article original en anglais se trouve <a href="http://jonathanlewis.wordpress.com/2007/07/03/parse-calls/">ici</a>.<br />
<br />
Jonathan Lewis donne la définition des statistiques qui concernent les parsing des requêtes : session cursor cache hits parse count (total) parse count (hard) execute count<br />
Vous trouverez aussi quelques mots sur le parsing <a href="http://blog.developpez.com/pachot/p8749/auteurs/jonathan-lewis/jl-nutshell-2/">ici</a><br />
</ins></p></blockquote>
<p>Voici un extrait d&rsquo;un rapport que j&rsquo;ai fait récemment sur l&rsquo;activité d&rsquo;une session. Cherchez l&rsquo;erreur:</p>
<pre>
Name                           Value
----                           -----
session cursor cache hits          3
parse count (total)                5
parse count (hard)                31
execute count                     35
</pre>
<p>Il n&rsquo;y a pas d&rsquo;astuce particulière pour avoir ce résultat, même si l&rsquo;activité de la base de données est un peu particulière, et je n&rsquo;ai pas trafiqué les chiffres. Alors comment se fait-il qu&rsquo;on ait plus de &lsquo;<em>hard parse</em>&lsquo; que de &lsquo;<em>parses</em>&lsquo; ?</p>
<p>Je n&rsquo;aime pas du tout le terme &lsquo;<em>hard parse</em>&lsquo;, je ne suis pas très enthousiaste à propos de &lsquo;<em>soft parse</em>&lsquo;, et je suis irrité par la confusion fréquente où l&rsquo;on ne distingue pas les &lsquo;<em>parse calls</em>&lsquo; et le <em>parsing</em>.</p>
<p>Les statistiques que j&rsquo;ai cité, et qui semblent bizarres, s&rsquo;expliquent facilement.<br />
&lsquo;<em>parse count (hard)</em>&lsquo; devrait plutôt s&rsquo;appeler &lsquo;<em>optimizations</em>&lsquo;, et ces optimisations d&rsquo;une requête peuvent être nécessaires pour l&rsquo;appel de l&rsquo;exécution de la requête (&lsquo;<em>execute call</em>&lsquo;) aussi bien que pour l&rsquo;appel de <em>parse</em> de la requête (&lsquo;<em>parse call</em>&lsquo;).</p>
<p>Les &lsquo;<em>parse count (total)</em>&lsquo; devraient plutôt être appelés &lsquo;<em>parse calls</em>&lsquo;, et il y a des &lsquo;<em>parse calls</em>&lsquo; qui ne nécessitent aucun parsing, lorsque la requête se trouve dans le cache des curseurs de la session (<em>session cursor cache</em>).</p>
<p>Tout ce que j&rsquo;ai fait pour cette démonstration se trouve dans ce simple bloc pl/sql:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">declare <br />
&nbsp; m_n &nbsp;number; <br />
begin <br />
&nbsp; for i in 1..30 loop <br />
&nbsp; &nbsp; select count(*) into m_n from t1; <br />
&nbsp; &nbsp; dbms_lock.sleep(1); <br />
&nbsp; end loop; <br />
end; <br />
/</div></div>
<p>Mais il faut noter l&rsquo;appel à <code class="codecolorer text default"><span class="text">dbms_lock.sleep</span></code>. Lorsque ce bloc a été exécuté, j&rsquo;ai fait un <strong><code class="codecolorer text default"><span class="text">truncate</span></code></strong> de la table <code class="codecolorer text default"><span class="text">t1</span></code> toutes les secondes à partir d&rsquo;une autre session.</p>
<p>Parce que je suis en pl/sql, le <strong><code class="codecolorer text default"><span class="text">select</span></code></strong> est automatiquement retenu dans le cache des curseurs, il n&rsquo;est parsé qu&rsquo;une fois et exécuté 30 fois, donc il n&rsquo;y a pas 30 &lsquo;<em>parse calls</em>&lsquo;, mais un seul &lsquo;<em>parse call</em>&lsquo; et 30 &lsquo;<em>execute calls</em>&lsquo;</p>
<p>Mais parce qu&rsquo;il y a les <code class="codecolorer text default"><span class="text">truncate</span></code> à chaque fois dans l&rsquo;autre session, le plan d&rsquo;exécution qui  été généré pour la requête au moment du &lsquo;<em>parse call</em>&lsquo; (qui a parsé, optimisé et gardé le curseur ouvert) s&rsquo;est trouvé invalidé à peu près à chaque exécution.</p>
<p>Alors, pratiquement à chaque exécution, il a fallu réoptimiser la requ&#7871;te à nouveau. Si vous vérifiez V$SQL vous verrez que le curseur fils a subi 30 <em><strong>invalidations</strong></em> et <em><strong>loads</strong></em>.</p>
<p>En résumé:</p>
<p><strong><em>&lsquo;parse count (total)&rsquo;</em></strong> est le nombre de demande de parse (&lsquo;<em>parse calls</em>&lsquo;). Si la requête n&rsquo;a jamais été vue avant, cela entraîne un parse et une optimisation. S&rsquo;il elle a déjà été vue, celà entraine une recherche dans le &lsquo;<strong><em>library cache</em></strong>&lsquo; (c&rsquo;est la manière de savoir qu&rsquo;elle a déjà été vue) et peut entraîner un &lsquo;<em>cursor authentication</em>&lsquo;. Si elle a déjà été vue, et authentifiée, et qu&rsquo;elle a une entrée dans le cache de session (<em>session cursor cache</em>) alors l&rsquo;appel de parsing &lsquo;<em>parse call</em>&lsquo; ne fait quasiment rien, parce qu&rsquo;il n&rsquo;y a même pas besoin de faire de recherche dans le <em>library cache</em> vu qu&rsquo;il a été implicitement retenu.</p>
<p><strong><em>&lsquo;parse count (hard)&rsquo;</em></strong> est le nombre d&rsquo;optimisation qui ont eu lieu. L&rsquo;optimisation peut être la conséquence d&rsquo;un &lsquo;<em>parse call</em>&lsquo; ou bien d&rsquo;un &lsquo;<em>execute call</em>&lsquo;. Même un curseur qui a été retenu peut avoir eu son plan d&rsquo;exécution invalidé, ce qui entraîne une réoptimisation à la prochaine exécution.</p>
<p><strong><em>&lsquo;session cursor cache hits&rsquo;</em></strong> est le nombre de fois où un &lsquo;parse call&rsquo; n&rsquo;a eu quasiment rien à faire parce que la requête a été retenue automatiquement lorsque la couche OCI a dérecté une utilisation répétée de la requête.</p>
<p>Ajout:</p>
<p>Il y a une autre statistique dont je n&rsquo;ai pas parlé. Elle n&rsquo;apparaît pas souvent dans un rapport statspack, mais pour être complet, je dois le mentionner car cela peut embrouiller les choses.</p>
<p>Si vous exécutez une requête qui a une erreur au parsing (comme <code class="codecolorer text default"><span class="text">select ssdate from dual</span></code>) alors l&rsquo;optimiseur retourne l&rsquo;erreur qui correspond (ORA-00904 dans cet exemple). La statistique &lsquo;<em>parse count (failures)</em>&lsquo; est incrémentée, tout comme &lsquo;<em>parse count (hard)</em>&lsquo;.</p>
<p>Mais malheureusement, &lsquo;<em>parse count (total)</em>&lsquo; peut ne pas changer. C&rsquo;était le cas lorsque j&rsquo;ai essayé à partir de SQL*Plus en version 9.2.0.8, mais elle a été incrémentée lorsque j&rsquo;ai essayé en 10.2.0.3. C&rsquo;est donc une autre cas où l&rsquo;on peut avoir plus de &lsquo;<em>hard parses</em>&lsquo; que de &lsquo;<em>parses</em>&lsquo;.</p>
<p>Si vous voyez beaucoup de &lsquo;parse count (failures)&rsquo;, vous allez aussi voir les évènements de waits correspondants: &lsquo;<em>SQL*Net break/reset to client</em>&lsquo; (ou <em>dblink</em>, selon d&rsquo;ou vient la requête).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
