<?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>Blog Oracle de Zakaria EL HAMDAOUI</title>
	<atom:link href="https://blog.developpez.com/zakaria-elhamdaoui/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/zakaria-elhamdaoui</link>
	<description>Oracle !! c&#039;est plus que vous imaginez !</description>
	<lastBuildDate>Sun, 06 Oct 2013 18:13:49 +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>Techniques de FLASHBACK ORACLE</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p12264/non-classe/techniques-de-flashback-oracle</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p12264/non-classe/techniques-de-flashback-oracle#comments</comments>
		<pubDate>Sun, 06 Oct 2013 18:13:49 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=109</guid>
		<description><![CDATA[1- Vue d’ensemble Les techniques de flashback sont un ensemble de fonctionnalités proposées par Oracle qui permettent de voir l’état passé de données, ou de ramener une table ou la totalité de la base de données dans le passé. Les fonctionnalités proposées sont les suivantes : - Flashback Query : permet de lire les données telles qu’elles étaient à un instant dans le passé (appary en version 9i). - Flashback Version Query : permet de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>1- Vue d’ensemble</strong><br />
Les techniques de flashback sont un ensemble de fonctionnalités proposées par Oracle qui permettent de voir l’état passé de données, ou de ramener une table ou la totalité de la base de données dans le passé.<br />
Les fonctionnalités proposées sont les suivantes :</p>
<p><em>- Flashback Query :</em> permet de lire les données telles qu’elles étaient à un instant dans le passé (appary en version 9i).</p>
<p><em>- Flashback Version Query :</em> permet de voir toutes les versions d’une ligne sur un certain intervelle de temps (apparu en version 10).</p>
<p><em>- Flashback Transaction Query) :</em> permet de voir les modifications réalisées par une ou plusieurs transactions sur un certain intervalle de temps (apparue en version 10).</p>
<p><em>- Flashback Transaction :</em> permet d’annuler les modifications d’une transaction, et de ses transactions dépendantes( apparue en version 11).</p>
<p><em>- Flashback Data Archive (Oracle Total Recall) :</em> permet de conserver sur le long terme, toutes les modifications apportées à une table (apparue en version 11).</p>
<p><em>- Flashback Table :</em> permet de ramener une table dans l état où elle était, juste avant sa suppression (apparue en version 10).</p>
<p><em>- Flashback Database :</em> permet de ramener la totalité de la base de données dans l’état où elle était à un certain moment dans le passé (apparue en version 11).</p>
<p>Seule la fonctionnalité Flashback Query est disponible dans toutes les éditions de la base de données (et donc notamment en Standart Edition).<br />
La fonctionnalité Flashback Data Archive, est une option de l’Entreprise Edition et nécessite donc, une licence supplémentaire. </p>
<p>Les autres fonctionnalités de Flashback nécessitent l’Entreprise Edition, mais sans option supplémentaire.<br />
Les fonctionnalités de Flashback de requête (Flashback Query, Flashback Version Query et Flashback Transaction Query), et la fonctionnalité de Flashback Table, utilisent les informations d’annulation pour revenir en arrière. Le paramètre UNDO_RETENTION et le tablespace d’annulation doivent donc être correctement dimensionnés, si vous souhaitez pouvoir retourner loin dans le passé.</p>
<p><strong>2- Niveau ligne</strong><br />
<strong>Flashback Query</strong><em></p>
<p>Pour lire les données telles qu’elles étaient à un instant donné du passé, vous pouvez utiliser l’option <em>AS OF</em> sur une table présente dans la clause <em>FROM </em>d’une requête <em>SELECT</em>.</p>
<p><strong>Syntaxe :</strong><br />
<em>Nom_table AS OF { TIMESTAMP | SCN } expression</em></p>
<p>L’option <em>TIMESTAMP </em>permet de retourner à un instant donné du passé en indiquant une date et une heure ; dans ce cas, l’expression doit être de type <em>TIMESTAMP</em>. L’option <em>SCN </em>permet de retourner à un instant donné du passé en indiquant un numéro <em>SCN </em>; dans ce cas, l’expression doit être un nombre.</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">SQL&amp;gt; select &nbsp; * &nbsp; from &nbsp; emp &nbsp; where &nbsp; empno = 7369;<br />
<br />
&nbsp; &nbsp; &nbsp;EMPNO ENAME &nbsp; &nbsp; &nbsp;JOB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MGR &nbsp; &nbsp;HIREDATE &nbsp; &nbsp; &nbsp; &nbsp;SAL &nbsp; &nbsp; &nbsp; COMM &nbsp; &nbsp; DEPTNO<br />
---------- ---------- --------- ---------- -------- ---------- ---------- --------------------------------<br />
&nbsp; &nbsp; &nbsp; 7369 SMITH &nbsp; &nbsp; CLERK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7902 &nbsp; &nbsp;17/12/80 &nbsp; &nbsp; &nbsp; &nbsp;800 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 20<br />
<br />
SQL&amp;gt; select to_char(sysdate, 'DD/MM/YYY HH24:MI:SS') &quot;SYSDATE&quot;,<br />
&nbsp; 2 &nbsp;dbms_flashback.get_system_change_number &quot;SCN&quot;<br />
&nbsp; 3 &nbsp;FROM dual;<br />
<br />
SYSDATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SCN<br />
------------------ ----------<br />
06/10/013 15:31:48 &nbsp; &nbsp;3446120</div></div>
<p>La fonction <em>GET_SYSTEM_Change_NUMBER </em>du package <em>DBMS_FLASHBACK </em>retourne le numéro <em>SCN </em>courant. Il faut le privilège <em>EXECUTE </em>sur le package pour l’utiliser.</p>
<p><strong>Un peu plus tard :</strong></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">SQL&amp;gt; update emp set ename = 'ZAKARIA' where empno = '7369';<br />
1 ligne mise à jour.<br />
SQL&amp;gt; commit;<br />
Validation effectuée.<br />
<br />
SQL&amp;gt; select to_char(sysdate, 'DD/MM/YYY HH24:MI:SS') &quot;SYSDATE&quot;,<br />
&nbsp; 2 &nbsp;dbms_flashback.get_system_change_number &quot;SCN&quot;<br />
&nbsp; 3 &nbsp;FROM dual;<br />
<br />
SYSDATE &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; SCN<br />
------------------ ----------<br />
06/10/013 15:38:41 &nbsp; &nbsp;3446364</div></div>
<p><em><strong>Maintenant je vais retourner vers le passé avec la notion du temps :</strong></em></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">SQL&amp;gt; SELECT * &nbsp;FROM EMP <br />
&nbsp; 2 &nbsp;AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '10' minute<br />
&nbsp; 3 &nbsp;where empno = 7369;<br />
&nbsp; <br />
&nbsp; EMPNO ENAME &nbsp; &nbsp; &nbsp;JOB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MGR HIREDATE &nbsp; &nbsp; &nbsp; &nbsp;SAL &nbsp; &nbsp; &nbsp; COMM &nbsp; &nbsp; DEPTNO<br />
--------- ---------- --------- ---------- -------- ---------- ---------- ----------<br />
&nbsp; &nbsp; &nbsp;7369 SMITH &nbsp; &nbsp; &nbsp;CLERK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7902 17/12/80 &nbsp; &nbsp; &nbsp; &nbsp;800 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;20</div></div>
<p><strong>Ou bien avec la notion du SCN :</strong><em></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">SQL&amp;gt; SELECT * &nbsp;FROM EMP <br />
&nbsp; 2 &nbsp;AS OF SCN 3446120<br />
&nbsp; 3 &nbsp;where empno = 7369;<br />
<br />
&nbsp; &nbsp; &nbsp;EMPNO ENAME &nbsp; &nbsp; &nbsp;JOB &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;MGR HIREDATE &nbsp; &nbsp; &nbsp; &nbsp;SAL &nbsp; &nbsp; &nbsp; COMM &nbsp; &nbsp; DEPTNO<br />
---------- ---------- --------- ---------- -------- ---------- ---------- ----------<br />
&nbsp; &nbsp; &nbsp; 7369 SMITH &nbsp; &nbsp; &nbsp;CLERK &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7902 17/12/80 &nbsp; &nbsp; &nbsp; &nbsp;800 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;20</div></div>
<p>NB : c&rsquo;est un résumé de la partie FLASHBACK du livre &laquo;&nbsp;Administration ORACLE 11g&nbsp;&raquo; de OLIVIER HEURTEL.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Statistiques ORACLE, Package DBMS_STAT</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p12082/non-classe/statistiques-oracle-package-dbms_stat</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p12082/non-classe/statistiques-oracle-package-dbms_stat#comments</comments>
		<pubDate>Sun, 23 Jun 2013 13:38:40 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=104</guid>
		<description><![CDATA[La semaine dernière, et lors d’une mission de consulting chez un opérateur télécoms, on a confronté un problème de performance qui concerne les statistiques. Bref, le problème est le suivant : L’équipe de développement a développé une application qui utilise une base de données Oracle 10g. Au niveau du serveur de recette l’application marche très bien, avec un temps de réponse raisonnable pour la plus part des requêtes, mais une fois l’application est en production, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La semaine dernière, et lors d’une mission de consulting chez un opérateur télécoms, on a confronté un problème de performance qui concerne les statistiques.</p>
<p>Bref, le problème est le suivant :</p>
<p>L’équipe de développement a  développé une application qui utilise une base de données Oracle 10g. Au niveau du serveur de recette l’application marche très bien, avec un temps de réponse raisonnable pour  la plus part des requêtes, mais une fois l’application est en production, oooops le temps de réponse est vraiment anormale (Exemple : une requête en recette : 15s, en prod : 3 minutes !!!!!!!!!!!!!).</p>
<p>NB : Avant mon arrivé, ils ont bien vérifié que la configuration des 2 serveurs (Recette et Prod) ont les mêmes caractéristiques . Les 2 BD ont aussi la même volumétrie.</p>
<p>Avant de commencer d’inspecter les plans d’exécutions, il fallait voir les statistiques utilisées par Oracle. On sait parfaitement qu’Oracle se base sur les statistiques collectées pour déterminer le meilleur plan d’exécution. Si on arrive à avoir les mêmes statistiques que le serveur de recette, il nous suffit de rejouer son scénario et si le problème vient réellement d&rsquo;un plan d&rsquo;exécution différent, alors on va  pouvoir identifier la ou les requêtes en question.</p>
<p>Pour cela, on va sauvegarder les statistiques du serveur de recette :</p>
<p>1-	Créer une table pour sauvegarder les statistique : (<strong>USER </strong>à le schéma qui utilise l ’application, <strong>NOM_TABLE_STATS </strong>à Nom de la table des statistiques)</p>
<p>     <strong>exec DBMS_STATS.CREATE_STAT_TABLE (ownname=&gt;&rsquo;USER&rsquo;, stattab=&gt;&rsquo;NOM_TABLE_STATS&rsquo;);</strong></p>
<p>2-	Alimenter la table NOM_TABLE_STATS par les statistiques du serveur de recette (A travers un Export du package DBMS_STATS) </p>
<p>    <strong>exec DBMS_STATS.EXPORT_SCHEMA(&lsquo;USER&rsquo;,&rsquo;NOM_TABLE_STATS&rsquo;);</strong></p>
<p>3-	Au niveau du serveur PROD, importer les statistique déjà collectées :<br />
     &#8211;	Pour cela, il faut déjà supprimé les statistiques du PROD par la commande suivante :<br />
<strong>exec DBMS_STATS.DELETE_SCHEMA_STATS(&lsquo;USER&rsquo;,FORCE=&gt;TRUE);</strong></p>
<p>     &#8211;	Importer les statistiques :<br />
 <strong>exec DBMS_STATS.IMPORT_SCHEMA_STATS(&lsquo;USER&rsquo;,&rsquo;NOM_TABLE_STATS&rsquo;);</strong></p>
<p>Et viola, maintenant on a les même statistiques au niveau des 2 serveurs, après les tests au niveau de la PROD, on a constaté que le temps de réponse est très raisonnable.</p>
<p><strong>NB :</strong> Normalement c’est la première étape qu’on doit faire, il y a des cas où le problème persiste toujours, dans ce cas il faut revoir et analyser les plans d’exécutions pour voire s’il y a des full scan ou des mauvaises utilisation d’index ou bien autre chose.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Générer les DDL d’un objet (table,index,…)</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p11917/non-classe/generer-les-ddl-dun-objet-tableindex</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p11917/non-classe/generer-les-ddl-dun-objet-tableindex#comments</comments>
		<pubDate>Mon, 15 Apr 2013 11:54:07 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=99</guid>
		<description><![CDATA[A partir de la version 9i, Oracle a introduit le paquet DBMS_METADATA , qui peut être utilisé pour récupérer des définitions d&#8217;objets que DDL. L’exemple ci-dessous montre comment utiliser ce paquet : Je vais creer une table Test : &#160;SQL&#38;gt; CREATE TABLE Test &#160; &#160; &#160; &#160; &#160; &#160; &#160; &#160; (Num integer, Nom varchar2(20), Prenom varchar2(20)); Maintenant, je vais générer le DDL de cette table : SQL&#38;gt; SELECT dbms_metadata.get_ddl('TABLE', TABLE_NAME) &#160;2 &#160;from user_tables &#160;3 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>A partir de la version 9i, Oracle a introduit le paquet DBMS_METADATA , qui peut être utilisé pour récupérer des définitions d&rsquo;objets que DDL.<br />
L’exemple ci-dessous montre comment utiliser ce paquet :</p>
<p>Je vais creer une table Test :</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">&nbsp;SQL&amp;gt; CREATE TABLE Test<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; (Num integer, Nom varchar2(20), Prenom varchar2(20));</div></div>
<p>Maintenant, je vais générer le DDL de cette table :</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">SQL&amp;gt; SELECT dbms_metadata.get_ddl('TABLE', TABLE_NAME)<br />
&nbsp;2 &nbsp;from user_tables<br />
&nbsp;3 &nbsp;where TABLE_NNAME = ('Test');</div></div>
<p>Le résultat est :</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">DBMS_METADATA.GET_DDL('TABLE',TABLE_NAME)<br />
--------------------------------------------------------------------<br />
<br />
&nbsp; CREATE TABLE &quot;SYS&quot;.&quot;TEST&quot;<br />
&nbsp; &nbsp;( &nbsp; &nbsp;&quot;NUM&quot; NUMBER(*,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;NOM&quot; VARCHAR2(20),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;P</div></div>
<p>Oppssss !!!! c&rsquo;est quoi ça !!!<br />
Alors on doit positionner les paramétres d&rsquo;affichage au niveau de SQLPLUS :</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">SQL&amp;gt; SET LONG 50000<br />
SQL&amp;gt; SET PAGES 500<br />
SQL&amp;gt; SET LINES 200</div></div>
<p>Maintenant, on Ré-exécute la même reqûete :</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">DBMS_METADATA.GET_DDL('TABLE',TABLE_NAME)<br />
----------------------------------------------------------------------------<br />
<br />
&nbsp; CREATE TABLE &quot;SYS&quot;.&quot;TEST&quot;<br />
&nbsp; &nbsp;( &nbsp; &nbsp;&quot;NUM&quot; NUMBER(*,0),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;NOM&quot; VARCHAR2(20),<br />
&nbsp; &nbsp; &nbsp; &nbsp; &quot;PRENOM&quot; VARCHAR2(20)<br />
&nbsp; &nbsp;) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING<br />
&nbsp; STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645<br />
&nbsp; PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)<br />
&nbsp; TABLESPACE &quot;SYSTEM&quot;</div></div>
<p>Essst voilà, notre code DDL est généré <img src="https://blog.developpez.com/zakaria-elhamdaoui/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> :).</p>
<p>NB : Vous pouvez aussi générer le DDL d&rsquo;une table DROPé, et ce avec la même reqûete (SELECT dbms_metadata.get_ddl(&lsquo;TABLE&rsquo;, TABLE_NAME)<br />
 2  from user_tables<br />
 3  where TABLE_NNAME = (&lsquo;Test&rsquo;);) Mais vous devez l&rsquo;adapter on utilisant FROM user_recyclebib <img src="https://blog.developpez.com/zakaria-elhamdaoui/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>A+</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>35902</slash:comments>
		</item>
		<item>
		<title>Le paramètre Oracle : CURSOR_SHARING</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p11774/tuning/le-parametre-oracle-cursor_sharing</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p11774/tuning/le-parametre-oracle-cursor_sharing#comments</comments>
		<pubDate>Sat, 09 Feb 2013 11:40:39 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[TUNING]]></category>
		<category><![CDATA[CURSOR_SHARING]]></category>
		<category><![CDATA[Zakaria EL HAMDAOUI]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=90</guid>
		<description><![CDATA[CURSOR_SHARING est un paramètre Oracle utilisé pour contrôler si une instruction SQL doit être ré-analyser ou pas. Oracle peut prendre une requête de la forme SELECT * FROM table WHERE COL = «littéral» et remplacer le «littéral» avec une valeur de liaison (BIND VARIABLE) si le prédicat WHERE deviendra COL = &#171;&#160;SYS_B_0&#8243;. Cela permet la réutilisation du plan de requête généré, menant peut-être à une meilleure utilisation de la shared pool(Zone de mémoire partagé) et [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>CURSOR_SHARING est un paramètre Oracle utilisé pour contrôler si une instruction SQL doit être ré-analyser ou pas. Oracle peut prendre une requête de la forme <strong>SELECT * FROM table WHERE COL = «littéral»</strong> et remplacer le «littéral» avec une valeur de liaison (BIND VARIABLE) si le prédicat WHERE deviendra COL = &laquo;&nbsp;SYS_B_0&Prime;. Cela permet la réutilisation du plan de requête généré, menant peut-être à une meilleure utilisation de la shared pool(Zone de mémoire partagé) et une réduction du temps d&rsquo;analyse effectuée par le système. Le paramètre CURSOR_SHARING peut avoir l&rsquo;une des trois valeurs suivantes:</p>
<p><em><strong>EXACT :</strong></em> Il s&rsquo;agit du réglage par défaut. Avec cette valeur, la requête n&rsquo;est pas réécrit pour utiliser des variables liées.</p>
<p><em><strong>FORCE :</strong></em> Ce réglage réécrit la requête, Oracle remplace tous les littéraux de valeurs liées pour générer un plan unique pour la requête réécrite. </p>
<p><em><strong>SIMILAR :</strong></em> Ce paramètre ne réécrit également la requête en remplaçant les littéraux avec des variables liées, mais peuvent mettre en place des plans différents pour différentes combinaisons de variables bind. Ce dernier point est pourquoi CURSOR_SHARING = SIMILAIRES pourrait réduire le nombre de plans générés. Parce que les plans multiples peuvent être générés, le réglage de SIMILAIRES peut ou ne peut pas réduire le nombre de plans réels que vous observez dans la piscine partagée</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instruction MERGE</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p11569/non-classe/instruction-merge</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p11569/non-classe/instruction-merge#comments</comments>
		<pubDate>Wed, 12 Dec 2012 14:38:22 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=83</guid>
		<description><![CDATA[Par : Zakaria EL HAMDAOUI Consultant Oracle A travers ce petit article, je vais essayer de présenter l&#8217;instruction &#171;&#160;MERGE&#160;&#187;, qui malheureusement n&#8217;est pas assez utilisée par les développeurs. MERGE, permet de mettre à jour ou d&#8217;insérer des données dans une table, de façon conditionnelle. - Exécute une instruction UPDATE si la ligne existe et une instruction INSERT s&#8217;il s&#8217;agit d&#8217;une nouvelle ligne : - Evite des mises à jour distinctes - Améliore les performances et facilite [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Par : <em>Zakaria EL HAMDAOUI<br />
      Consultant Oracle</em></p>
<p>A travers ce petit article, je vais essayer de présenter l&rsquo;instruction &laquo;&nbsp;MERGE&nbsp;&raquo;, qui malheureusement n&rsquo;est pas assez utilisée par les développeurs.</p>
<li> MERGE, permet de mettre à jour ou d&rsquo;insérer des données dans une table, de façon conditionnelle.
</li>
<li>- Exécute une instruction UPDATE si la ligne existe et une instruction INSERT s&rsquo;il s&rsquo;agit d&rsquo;une nouvelle ligne :
</li>
<ol>- Evite des mises à jour distinctes
</ol>
<ol>- Améliore les performances et facilite l&rsquo;utilisation
</ol>
<ol>- S&rsquo;avère particulièrement utile dans les applications de data warehouse
</ol>
<p>SQL a été étendu pour inclure l&rsquo;instruction MERGE. Cette instruction vous permet de mettre à jour ou d&rsquo;insérer une ligne dans une table de façon conditionnelle, évitant ainsi l&rsquo;utilisation de plusieurs instructions UPDATE. La mise à jour ou l&rsquo;insertion dans la table cible dépend d&rsquo;une condition définie dans la clause ON.<br />
Etant donné que l&rsquo;instruction MERGE combine les commandes INSERT et UPDATE, vous devez disposer des privilèges INSERT et UPDATE sur la table cible et du privilège SELECT sur la table source.<br />
L&rsquo;instruction MERGE est déterministe. Vous ne pouvez pas mettre à jour plusieurs fois la même ligne de la table cible dans la même instruction MERGE.<br />
Vous pouvez également utiliser des boucles PL/SQL et plusieurs instructions LMD. Cependant, l&rsquo;instruction MERGE est plus facile à utiliser et s&rsquo;exprime plus simplement sous la forme d&rsquo;une instruction SQL.<br />
L&rsquo;instruction MERGE convient à plusieurs applications de data warehouse. Par exemple, ce type d&rsquo;application peut nécessiter l&rsquo;utilisation de données provenant de plusieurs sources, et certaines de ces données peuvent être en double. A l&rsquo;aide de l&rsquo;instruction MERGE, vous pouvez ajouter ou modifier des lignes sous certaines conditions. </p>
<p><strong>Syntaxe de l&rsquo;instruction MERGE </strong></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">MERGE INTO table_name table_alias<br />
&nbsp; USING (table|view|sub_query) alias<br />
&nbsp; ON (join condition)<br />
&nbsp; WHEN MATCHED THEN<br />
&nbsp; &nbsp; UPDATE SET <br />
&nbsp; &nbsp; col1 = col_val1,<br />
&nbsp; &nbsp; col2 = col2_val<br />
&nbsp; WHEN NOT MATCHED THEN<br />
&nbsp; &nbsp; INSERT (column_list)<br />
&nbsp; &nbsp; VALUES (column_values);</div></div>
<li><strong>Clause INTO</strong>  désigne la table cible dans laquelle vous allez réaliser une insertion 	 ou une mise à jour. </li>
<li><strong>Clause USING</strong>  identifie la source des données à mettre à jour ou à insérer ; il peut 					s&rsquo;agir d&rsquo;une table, d&rsquo;une vue ou d&rsquo;une sous-interrogation. </li>
<li><strong>Clause ON </strong>	désigne la condition en fonction de laquelle l&rsquo;instruction MERGE 		 réalise une mise à jour ou une insertion. </li>
<li><strong>WHEN MATCHED</strong> |indique au serveur comment répondre aux résultats obtenus avec   la 	 condition de jointure. </li>
<li>WHEN NOT MATCHED</li>
<p><strong>Exemple de fusion de lignes </strong></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">MERGE INTO copy_emp c<br />
&nbsp; &nbsp; &nbsp;USING employees e<br />
&nbsp; &nbsp; &nbsp;ON (c.employee_id = e.employee_id)<br />
&nbsp; &nbsp;WHEN MATCHED THEN<br />
&nbsp; &nbsp; &nbsp;UPDATE SET<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.first_name &nbsp; &nbsp; = e.first_name,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.last_name &nbsp; &nbsp; &nbsp;= e.last_name,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.email &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;= e.email,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.phone_number &nbsp; = e.phone_number,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.hire_date &nbsp; &nbsp; &nbsp;= e.hire_date,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.job_id &nbsp; &nbsp; &nbsp; &nbsp; = e.job_id,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.salary &nbsp; &nbsp; &nbsp; &nbsp; = e.salary,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.commission_pct = e.commission_pct,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.manager_id &nbsp; &nbsp; = e.manager_id,<br />
&nbsp; &nbsp; &nbsp; &nbsp;c.department_id &nbsp;= e.department_id<br />
&nbsp; &nbsp;WHEN NOT MATCHED THEN<br />
&nbsp; &nbsp; &nbsp;INSERT VALUES(e.employee_id, e.first_name, e.last_name,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.email, e.phone_number, e.hire_date, e.job_id,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.salary, e.commission_pct, e.manager_id, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e.department_id);</div></div>
<p>L&rsquo;exemple ci-dessus compare les valeurs EMPLOYEE_ID de la table COPY_EMP avec les valeurs EMPLOYEE_ID de la table EMPLOYEES. Lorsqu&rsquo;une correspondance est trouvée, la ligne de la table COPY_EMP est mise à jour pour qu&rsquo;elle corresponde à la ligne de la table EMPLOYEES. Si la ligne n&rsquo;est pas trouvée, elle est insérée dans la table COPY_EMP. </p>
<p>La condition <strong>c.employee_id = e.employee_id</strong> est évaluée. La table COPY_EMP étant vide, la condition renvoie un message indiquant l&rsquo;absence de correspondance. La logique correspond à la clause WHEN NOT MATCHED et la commande MERGE insère les lignes de la table EMPLOYEES dans la table COPY_EMP.<br />
Lorsque la table COPY_EMP comprend des lignes et que les ID employés correspondent dans les deux tables (tables COPY_EMP et EMPLOYEES), les lignes présentes dans la table COPY_EMP sont mises à jour pour qu&rsquo;elles correspondent à celles de la table EMPLOYEES. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Les index virtuels</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p11494/tuning/les-index-virtuels</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p11494/tuning/les-index-virtuels#comments</comments>
		<pubDate>Wed, 14 Nov 2012 12:09:44 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[TUNING]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=51</guid>
		<description><![CDATA[Article de AHMED AANGOUR : Lorsque vous vous demandez si le fait de créer un index peut améliorer votre requête, ce qui vous freine souvent c’est le fait d’avoir à créer cet index pour effectuer votre test. Le fait de créer un index sur une table volumineuse peut prendre énormément de temps (CPU+IO) et va consommer de la place sur votre disque. Oracle offre la possibilité de créer un index sans lui associer de segment. [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Article de AHMED AANGOUR : <a href="http://ahmedaangour.blogspot.com/2010/11/les-index-virtuels.html"><br />
</a></p>
<p><a href="http://ahmedaangour.blogspot.com/2010/11/les-index-virtuels.html" target="_blank"></a></p>
<p>Lorsque vous vous demandez si le fait de créer un index peut améliorer votre requête, ce qui vous freine souvent c’est le fait d’avoir à créer cet index pour effectuer votre test.<br />
 Le fait de créer un index sur une table volumineuse peut prendre énormément de temps (CPU+IO) et va consommer de la place sur votre disque.</p>
<p> Oracle offre la possibilité de créer un index sans lui associer de segment. Cela revient à dire qu’on a la possibilité de créer un index virtuel et ainsi savoir si l’optimiseur prendrait en compte l’index s’il existait réellement.</p>
<p> Voici un exemple pour bien comprendre comment profiter des index virtuels.</p>
<p> Tout d’abord créons une table volumineuse :</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">SQL&amp;gt; create table t1 as select * from all_objects;<br />
<br />
Table créée.</div></div>
<p>Lorsque je veux récupérer les données de T1 dont la colonne OBJECT_TYPE équivaut à « WINDOW », je constate que l’optimiseur effectue un Full Table Scan (FTS) sur ma table.</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">SQL&amp;gt; &nbsp;explain plan for<br />
&nbsp; 2 &nbsp;select * from t1 where object_type='WINDOW';<br />
<br />
Explicité.</div></div>
<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">SQL&amp;gt; select * FROM TABLE<br />
&nbsp; 2 &nbsp;(DBMS_XPLAN.display (NULL, NULL, 'BASIC +COST'));<br />
<br />
PLAN_TABLE_OUTPUT<br />
-----------------------------------------------<br />
Plan hash value: 3617692013<br />
<br />
-----------------------------------------------<br />
| Id &nbsp;| Operation &nbsp; &nbsp; &nbsp; &nbsp; | Name | Cost (%CPU)|<br />
-----------------------------------------------<br />
| &nbsp; 0 | SELECT STATEMENT &nbsp;| &nbsp; &nbsp; &nbsp;| &nbsp; 367 &nbsp; (1)|<br />
| &nbsp; 1 | &nbsp;TABLE ACCESS FULL| T1 &nbsp; | &nbsp; 367 &nbsp; (1)|<br />
-----------------------------------------------</div></div>
<p>Maintenant je me demande la chose suivante : si j’avais un index sur la colonne OBJECT_TYPE, est-ce que l’optimiseur l’utiliserait ?</p>
<p> J’aimerais avoir une réponse à cette question mais sans avoir à créer réellement ma structure d&rsquo;index.<br />
 Pour cela je crée un index virtuel :</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">SQL&amp;gt; create index idx_t1 on t1(object_type) NOSEGMENT;<br />
<br />
Index créé.</div></div>
<p>La clause NOSEGMENT indique que mon index est virtuel.</p>
<p> A ce stade l’index n’est toujours pas visible par le CBO. Pour le rendre visible il faut modifier un paramètre caché :</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">SQL&amp;gt; ALTER SESSION SET &quot;_use_nosegment_indexes&quot; = TRUE;<br />
<br />
Session modifiée.</div></div>
<p>Maintenant, le CBO voit l’index et décide de le prendre en compte dans le plan :</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">SQL&amp;gt; explain plan for<br />
&nbsp; 2 &nbsp;select * from t1 where object_type='WINDOW';<br />
<br />
Explicité.</div></div>
<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">SQL&amp;gt; select * FROM TABLE<br />
&nbsp; 2 &nbsp;(DBMS_XPLAN.display (NULL, NULL, 'BASIC +COST'));<br />
<br />
PLAN_TABLE_OUTPUT<br />
-----------------------------------------------------------<br />
Plan hash value: 50753647<br />
<br />
-----------------------------------------------------------<br />
| Id &nbsp;| Operation &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; | Name &nbsp; | Cost (%CPU)|<br />
-----------------------------------------------------------<br />
| &nbsp; 0 | SELECT STATEMENT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; &nbsp; &nbsp;| &nbsp; &nbsp; 5 &nbsp; (0)|<br />
| &nbsp; 1 | &nbsp;TABLE ACCESS BY INDEX ROWID| T1 &nbsp; &nbsp; | &nbsp; &nbsp; 5 &nbsp; (0)|<br />
| &nbsp; 2 | &nbsp; INDEX RANGE SCAN &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;| IDX_T1 | &nbsp; &nbsp; 1 &nbsp; (0)|<br />
-----------------------------------------------------------</div></div>
<p>Notez que la création de l’index est intéressante car il fait chuter le COST du plan de 367 à 5.</p>
<p> Pour vous prouver que l’index n’existe pas réellement :<br />
SQL&gt; Select * from user_indexes where table_name=&rsquo;T1&prime; ;</p>
<p>aucune ligne sélectionnée</p>
<p> L’index n’est pas référencé en tant qu’un index dans USER_INDEXES mais est bien défini en tant qu’objet:</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">SQL&amp;gt; select object_name from user_objects where object_name='IDX_T1';<br />
<br />
OBJECT_NAME<br />
-----------------<br />
IDX_T1</div></div>
<p>Maintenant que j’ai validé que mon index est vraiment intéressant à créer je peux dropper mon index virtuel et créer un véritable index à la place.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Réglage des instructions SQL</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p11415/tuning/30</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p11415/tuning/30#comments</comments>
		<pubDate>Sat, 06 Oct 2012 19:50:39 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[TUNING]]></category>
		<category><![CDATA[explain plan]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[optimisation oracle]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[tkprof]]></category>
		<category><![CDATA[traçer une session]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=30</guid>
		<description><![CDATA[Par : Zakaria EL HAMDAOUI Administrateur base de données Consultant et formateur Oracle elhamdaoui_zakaria@yahoo.fr 1. Modes de fonctionnement de l&#8217;optimiseur • Optimisation basée sur les règles Lorsque ce mode de fonctionnement est utilisé, le processus serveur détermine son chemin d&#8217;accès aux données en examinant l&#8217;interrogation. L&#8217;optimiseur classe les chemins d&#8217;accès grâce au jeu de règles complet dont il dispose. Le plus souvent, les développeurs Oracle expérimentés maîtrisent parfaitement ces règles et règlent leur code SQL [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://blog.developpez.com/zakaria-elhamdaoui/files/2012/10/ziko.jpg"><img src="http://blog.developpez.com/zakaria-elhamdaoui/files/2012/10/ziko-140x150.jpg" alt="" width="140" height="150" class="alignright size-thumbnail wp-image-34" /></a><br />
Par :  Zakaria EL HAMDAOUI<br />
       Administrateur base de données<br />
       Consultant et formateur Oracle<br />
       elhamdaoui_zakaria@yahoo.fr</p>
<p><strong>1. Modes de fonctionnement de l&rsquo;optimiseur </strong><br />
     <strong>•	Optimisation basée sur les règles</strong><br />
Lorsque ce mode de fonctionnement est utilisé, le processus serveur détermine son chemin d&rsquo;accès aux données en examinant l&rsquo;interrogation. L&rsquo;optimiseur classe les chemins d&rsquo;accès grâce au jeu de règles complet dont il dispose. Le plus souvent, les développeurs Oracle expérimentés maîtrisent parfaitement ces règles et règlent leur code SQL en conséquence. L&rsquo;optimiseur basé sur les règles est orienté syntaxe : il utilise la syntaxe des instructions ainsi que les informations du dictionnaire de données sur les structures de données pour déterminer son plan d&rsquo;exécution. Ce mode de fonctionnement de l&rsquo;optimiseur est pris en charge pour des raisons de compatibilité avec les versions antérieures du serveur Oracle. </p>
<p>    <strong>• Optimisation basée sur le coût</strong><br />
Dans ce mode de fonctionnement, l&rsquo;optimiseur examine chaque instruction et identifie tous les chemins d&rsquo;accès possibles aux données. Il évalue ensuite le coût en ressources de chaque chemin d&rsquo;accès et choisit celui qui consomme le moins de ressources. <em>Le nombre de lectures logiques est l&rsquo;élément déterminant dans l&rsquo;évaluation du coût</em>. L&rsquo;optimiseur basé sur le coût est orienté statistiques : il détermine le plan d&rsquo;exécution approprié à l&rsquo;aide des statistiques générées pour les objets impliqués dans les instructions SQL. Il est utilisé si des statistiques ont été générées pour un objet contenu dans l&rsquo;instruction SQL. <em>Ce mode de fonctionnement est recommandé pour les nouvelles applications, surtout si elles utilisent la fonctionnalité Parallel Query, les index bitmap ou les index de jointure bitmap.</em> </p>
<p><strong>2.  Définir le mode de fonctionnement de l&rsquo;optimiseur </strong><br />
Vous pouvez définir le mode de fonctionnement de l&rsquo;optimiseur au niveau : </p>
<p>• de l&rsquo;instance, à l&rsquo;aide du paramètre OPTIMIZER_MODE, optimizer_mode =<br />
{choose|rule|first_rows|first_rows_n|all_rows}<br />
• de la session, à l&rsquo;aide de la commande ALTER SESSION,<br />
alter session set optimizer_mode = {choose|rule|first_rows|first_rows_n|all_rows}<br />
• de l&rsquo;instruction, grâce aux conseils (Hints). Utilisez des conseils </p>
<p>Le DBA est chargé de la définition du paramètre OPTIMIZER_MODE au niveau de l&rsquo;instance, car cette opération nécessite le redémarrage de celle-ci. En règle générale, les développeurs d&rsquo;applications peuvent définir le paramètre OPTIMIZER_MODE au niveau de la session et utiliser des conseils dans les instructions SQL. </p>
<p><strong>Paramètre OPTIMIZER_MODE</strong><br />
La valeur par défaut de ce paramètre est CHOOSE. Cela signifie que l&rsquo;optimiseur utilise le mode de fonctionnement basé sur le coût (ALL_ROWS) si des statistiques sont disponibles pour au moins l&rsquo;une des tables concernées. Dans le cas contraire, il utilise l&rsquo;optimisation basée sur les règles. </p>
<p><strong>Remarque :</strong><em> Si l&rsquo;une des tables concernées présente un degré d&rsquo;exécution en parallèle supérieur à 1 ou un conseil parallèle, l&rsquo;optimisation basée sur le coût est utilisée par défaut pour l&rsquo;instruction.<br />
Les autres valeurs possibles sont les suivantes : RULE, FIRST_ROWS, FIRST_ROWS_n et ALL_ROWS. La première impose l&rsquo;optimisation basée sur les règles, qu&rsquo;il existe ou non des statistiques. Les deux dernières représentent des méthodes différentes d&rsquo;utilisation de l&rsquo;optimisation basée sur le coût. FIRST_ROWS minimise le temps de réponse immédiat (éventuellement au détriment du temps de réponse global) et FIRST_ROWS_n minimise le temps de réponse immédiat pour les n premières lignes (éventuellement au détriment du temps de réponse global). La valeur de n peut être 1, 10, 100 ou 1000. ALL_ROWS minimise le temps de réponse global (débit). </p>
<p><strong>  • Option OPTIMIZER_MODE au niveau de la session</strong><br />
Les développeurs peuvent définir cette option à l&rsquo;aide de la commande ALTER SESSION.</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">SQL&amp;gt; ALTER SESSION SET OPTIMIZER_MODE = value</div></div>
<p><strong>Remarque </strong></em>: Pour des raisons de compatibilité descendante, l&rsquo;option OPTIMIZER_GOAL de la commande ALTER SESSION est toujours prise en charge comme alternative à l&rsquo;option OPTIMIZER_MODE.<br />
<strong>• Conseils de l&rsquo;optimiseur</strong> </p>
<p>Vous pouvez utiliser des conseils de la manière suivante :</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">SQL&amp;gt; &nbsp; &nbsp; SELECT /*+ FIRST_ROWS */ &nbsp; &nbsp;* &nbsp;FROM &nbsp;hr.employees;</div></div>
<p>Les conseils qui ont une influence sur le mode de fonctionnement de l&rsquo;optimiseur sont, entre autres, PARALLEL, RULE, FIRST_ROWS, FIRST_ROWS_n et ALL_ROWS. </p>
<p><strong>Règles de priorité </strong><br />
Les conseils remplacent toujours les paramètres au niveau de la session et ces derniers remplacent toujours les paramètres au niveau de l&rsquo;instance. </p>
<p><strong>3. Stabilité du plan de l&rsquo;optimiseur</strong><br />
Pour chaque instruction, l&rsquo;optimiseur prépare une arborescence d&rsquo;opérations appelée plan d&rsquo;exécution, qui définit l&rsquo;ordre et les méthodes des opérations que doit effectuer le serveur pour exécuter l&rsquo;instruction.<br />
Les informations dont dispose l&rsquo;optimiseur peuvent être incomplètes. Par conséquent, il se peut qu&rsquo;il ne choisisse pas le meilleur plan d&rsquo;exécution. Dans ce cas, vous pouvez influencer la sélection du plan de l&rsquo;optimiseur en réécrivant l&rsquo;instruction SQL et en utilisant des conseils ou d&rsquo;autres méthodes de réglage (tuning). Une fois cette opération terminée, vous pouvez vérifier si le plan ainsi réglé est généré à chaque fois qu&rsquo;une même instruction est recompilée, même si certains facteurs affectant l&rsquo;optimisation ont changé.<br />
Oracle9i offre aux utilisateurs un moyen de stabiliser les plans d&rsquo;exécution d&rsquo;une version Oracle à une autre, lors de modifications de la base de données ou d&rsquo;apparition d&rsquo;autres facteurs entraînant normalement une modification du plan d&rsquo;exécution. Vous pouvez créer un plan d&rsquo;exécution prédéfini contenant un ensemble de conseils qui seront utilisés par l&rsquo;optimiseur pour la création d&rsquo;un plan d&rsquo;exécution. </p>
<p><strong>OPTIMIZER_FEATURES_ENABLE </strong><br />
Ce paramètre permet à une version du serveur Oracle d&rsquo;utiliser les caractéristiques d&rsquo;optimiseur basé sur le coût définies dans une précédente version. Il est préférable de conserver sa valeur par défaut, qui correspond à la version actuelle. Toutefois, le DBA peut conserver les précédentes caractéristiques d&rsquo;optimiseur basé sur le coût au moment de la mise à niveau. Avant d&rsquo;effectuer une telle opération, voir Oracle9i Performance Guide and Reference.<br />
<strong>4. Equivalence des instructions SQL </strong><br />
Lorsque vous décidez d&rsquo;appliquer un plan d&rsquo;exécution prédéfini à une interrogation, la stabilité du plan repose sur une correspondance textuelle parfaite des interrogations. Les critères de correspondance sont les mêmes que ceux utilisés pour déterminer si un plan d&rsquo;exécution de la zone de mémoire partagée peut être réutilisé.<br />
Les plans d&rsquo;exécution prédéfinis reposent partiellement sur les conseils utilisés par l&rsquo;optimiseur pour générer des plans d&rsquo;exécution stables. Par conséquent, le niveau d&rsquo;équivalence des plans dépend des capacités des conseils utilisés par les plans. Les étapes d&rsquo;un plan d&rsquo;exécution prédéfini incluent les méthodes d&rsquo;accès aux lignes, l&rsquo;ordre et les méthodes de jointure, les accès distribués et la fusion vue/sous-interrogation. L&rsquo;accès distribué n&rsquo;inclut pas le plan d&rsquo;exécution sur le noeud distant.<br />
<strong>• Stabilité du plan </strong><br />
Ces plans restent cohérents et ne sont pas affectés par les différents types de modifications apportées aux instances et aux bases de données. Par conséquent, si vous développez des applications en vue d&rsquo;une distribution de masse, vous pouvez utiliser des plans d&rsquo;exécution prédéfinis pour garantir l&rsquo;accès de tous vos clients aux mêmes plans d&rsquo;exécution. Par exemple, si un schéma est modifié par l&rsquo;ajout d&rsquo;un index, le plan d&rsquo;exécution prédéfini peut empêcher l&rsquo;utilisation du nouvel index.<br />
<strong>5. Créer des plans d&rsquo;exécution prédéfinis </strong><br />
Le serveur peut créer automatiquement des plans d&rsquo;exécution prédéfinis, mais vous pouvez également le faire pour des instructions SQL spécifiques. Les plans d&rsquo;exécution prédéfinis utilisent l&rsquo;optimiseur basé sur le coût, car ils reposent sur des conseils.<br />
<strong>• Catégories</strong><br />
Les plans d&rsquo;exécution prédéfinis peuvent être regroupés en catégories. Une même instruction SQL peut être associée à un plan d&rsquo;exécution prédéfini dans plusieurs catégories. Par exemple, vous pouvez définir une catégorie OLTP et une catégorie DSS. Si le nom de la catégorie n&rsquo;est pas précisé, les plans d&rsquo;exécution prédéfinis sont placés dans la catégorie DEFAULT.<br />
<strong>• Paramètre CREATE_STORED_OUTLINES </strong><br />
Lorsque vous affectez la valeur TRUE ou un nom de catégorie au paramètre CREATE_STORED_OUTLINES, Oracle crée automatiquement des plans d&rsquo;exécution prédéfinis pour toutes les instructions SQL exécutées. Lorsque la valeur est TRUE, la catégorie utilisée est DEFAULT. Vous pouvez désactiver le processus en affectant la valeur FALSE au paramètre. Lorsque ce paramètre est utilisé, les noms de plan sont également générés automatiquement.<br />
<strong>• Commande CREATE OUTLINE </strong><br />
Vous pouvez également créer des plans d&rsquo;exécution prédéfinis pour une instruction spécifique à l&rsquo;aide de la commande CREATE OUTLINE. L&rsquo;un des avantages est que vous pouvez attribuer un nom au plan d&rsquo;exécution prédéfini.</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">SQL&amp;gt; alter session<br />
&nbsp; 2 &nbsp;set CREATE_STORED_OUTLINES = train;<br />
SQL&amp;gt; select … from … ;<br />
SQL&amp;gt; select … from … ;</div></div>
<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">SQL&amp;gt; create or replace OUTLINE co_cl_join<br />
&nbsp; 2 &nbsp;FOR CATEGORY train ON<br />
&nbsp; 3 &nbsp;select co.crs_id, ...<br />
&nbsp; 4 &nbsp;from &nbsp; courses co,<br />
&nbsp; 5 &nbsp; &nbsp; &nbsp; &nbsp;classes cl<br />
&nbsp; 6 &nbsp;where &nbsp;co.crs_id = cl.crs_id;</div></div>
<p><strong>6. Utiliser les plans d&rsquo;exécution prédéfinis </strong><br />
Si le paramètre USE_STORED_OUTLINES a la valeur TRUE, les plans d&rsquo;exécution utilisés sont ceux de la catégorie DEFAULT. Si un nom de catégorie est affecté au paramètre USE_STORED_OUTLINES, les plans d&rsquo;exécution utilisés sont ceux de cette catégorie. Si cette catégorie ne contient pas de plan d&rsquo;exécution correspondant, celui contenu dans la catégorie DEFAULT, le cas échéant, est utilisé.<br />
Le texte de l&rsquo;instruction doit être identique à celui de l&rsquo;instruction figurant dans le plan d&rsquo;exécution prédéfini. Une comparaison est effectuée à l&rsquo;aide de la méthode de comparaison de curseurs dans la zone de mémoire partagée. Les conseils inclus dans le plan d&rsquo;exécution prédéfini doivent donc être utilisés dans le texte de l&rsquo;instruction, afin que la correspondance soit établie. Les valeurs des variables attachées (bind variables) ne doivent pas obligatoirement être identiques.<br />
Pour définir le plan d&rsquo;exécution d&rsquo;une instruction SQL, Oracle9i utilise la logique suivante :<br />
• L&rsquo;instruction est comparée aux instructions qui se trouvent dans la zone de mémoire partagée afin de vérifier la concordance du texte et la catégorie du plan d&rsquo;exécution prédéfini.<br />
• En l&rsquo;absence d&rsquo;instruction concordante, le serveur interroge le dictionnaire de données, afin de rechercher un plan d&rsquo;exécution prédéfini correspondant.<br />
• S&rsquo;il trouve un plan d&rsquo;exécution prédéfini concordant, Oracle9i l&rsquo;intègre à l&rsquo;instruction et crée le plan d&rsquo;exécution.<br />
• S&rsquo;il ne trouve aucun plan d&rsquo;exécution prédéfini, l&rsquo;instruction est exécutée à l&rsquo;aide des méthodes normales (sans plan d&rsquo;exécution prédéfini).<br />
Si un plan d&rsquo;exécution prédéfini prévoit l&rsquo;utilisation d&rsquo;un objet qui ne peut être utilisé (par exemple, s&rsquo;il fait référence à un index qui n&rsquo;existe plus), l&rsquo;instruction ne tient pas compte du conseil. Pour vérifier si un plan d&rsquo;exécution prédéfini est utilisé, l&rsquo;outil Explain Plan d&rsquo;une instruction doit être comparé lors d&rsquo;exécutions avec et sans USE_STORED_OUTLINES. </p>
<p><strong>7. Utiliser des plans d&rsquo;exécution privés</strong><br />
Le paramètre USE_PRIVATE_OUTLINES vous permet de contrôler l&rsquo;utilisation de plans d&rsquo;exécution privés. Un plan d&rsquo;exécution privé n&rsquo;est visible que dans la session active et ses données résident dans le schéma d&rsquo;analyse en cours. Les modifications effectuées dans un plan d&rsquo;exécution de ce type ne sont visibles par aucune autre session sur le système. En outre, un plan d&rsquo;exécution privé ne peut être utilisé que dans la session en cours pour compiler une instruction et avec l&rsquo;aide du paramètre USE_PRIVATE_OUTLINES. Vos modifications ne peuvent être vues par les autres utilisateurs que si vous les enregistrez explicitement dans la zone publique. Une copie du plan d&rsquo;exécution est enregistrée dans le schéma de l&rsquo;utilisateur au début de la session de modification du plan d&rsquo;exécution prédéfini. Toutes les modifications suivantes sont effectuées sur cette copie jusqu&rsquo;à ce que l&rsquo;utilisateur soit satisfait du résultat et décide de le publier. Tant qu&rsquo;elles ne sont pas explicitement enregistrées, les modifications effectuées par l&rsquo;utilisateur n&rsquo;affectent pas les autres utilisateurs, qui continuent d&rsquo;utiliser la version publique du plan d&rsquo;exécution. Lorsqu&rsquo;un plan d&rsquo;exécution privé est créé, une erreur est renvoyée si les tables du plan d&rsquo;exécution requises, destinées à contenir les données du plan n&rsquo;existent pas dans le schéma local. Ces tables peuvent être créées à l&rsquo;aide de la procédure DBMS_OUTLN_EDIT.CREATE_EDIT_TABLES. </p>
<p>• Conditions préalables pour utiliser les plans d&rsquo;exécution privés<br />
Lorsque le paramètre USE_PRIVATE_OUTLINES est activé et qu&rsquo;une instruction SQL figurant dans un plan d&rsquo;exécution est exécutée, l&rsquo;optimiseur extrait le plan d&rsquo;exécution de la zone privée de la session. Si vous utilisez le paramètre USE_STORED_OUTLINES, le plan est extrait de la zone publique. Si la zone privée de la session ne contient pas de plan d&rsquo;exécution, l&rsquo;optimiseur s&rsquo;en dispensera pour compiler l&rsquo;instruction. </p>
<p><strong>Gérer les plans d&rsquo;exécution prédéfinis </strong><br />
Utilisez les procédures du package OUTLN_PKG pour gérer les plans d&rsquo;exécution prédéfinis ainsi que leurs catégories. Ces procédures sont les suivantes :<br />
• Drop_unused : supprime les plans d&rsquo;exécution prédéfinis qui n&rsquo;ont pas été utilisés depuis leur création.<br />
• Drop_by_cat : supprime les plans d&rsquo;exécution prédéfinis associés au nom de catégorie indiqué.<br />
• Update_by_cat : réaffecte les plans d&rsquo;exécution prédéfinis d&rsquo;une catégorie à une autre.<br />
Les plans d&rsquo;exécution prédéfinis peuvent également être gérés à l&rsquo;aide des commandes ALTER/DROP OUTLINE.<br />
Vous pouvez exporter et importer des plans en exportant le schéma OUTLN, dans lequel sont stockés tous les plans d&rsquo;exécution prédéfinis. Vous pouvez interroger les plans d&rsquo;exécution prédéfinis à partir des tables du schéma :<br />
• OL$ : nom du plan d&rsquo;exécution prédéfini, catégorie, horodatage de création du plan et texte de l&rsquo;instruction<br />
• OL$HINTS : conseils relatifs aux plans d&rsquo;exécution prédéfinis figurant dans OL$<br />
Les vues du dictionnaire de données équivalentes sont DBA_OUTLINES et DBA_OUTLINE_HINTS.<br />
<strong>Remarque :</strong> OUTLN étant automatiquement créé avec la base de données, son mot de passe doit être modifié. </p>
<p><strong>8. Utiliser des conseils dans une instruction SQL </strong><br />
Vous possédez peut-être des informations relatives à vos données que l&rsquo;optimiseur ne connaît pas. Par exemple, vous savez peut-être qu&rsquo;un certain index est plus sélectif pour certaines interrogations. Compte tenu de cette information, vous êtes mieux placé que l&rsquo;optimiseur pour choisir un plan d&rsquo;exécution efficace. Dans ce cas, utilisez des conseils pour contraindre l&rsquo;optimiseur à utiliser le meilleur plan d&rsquo;exécution.<br />
<strong>• Exemple </strong><br />
Dans l&rsquo;exemple ci-dessous, la colonne cust_gender de la table customers est indexée. L&rsquo;instruction est exécutée plus rapidement à l&rsquo;aide de l&rsquo;index gen_idx, car le nombre de clients masculins est très faible. Un conseil permet de contraindre l&rsquo;optimiseur à utiliser l&rsquo;index.</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">SQL&amp;gt; CREATE index gen_idx on customers &nbsp;(cust_gender);</div></div>
<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">SQL&amp;gt; SELECT /*+ INDEX(customers gen_idx)*/ <br />
2 &nbsp; &nbsp;cust_last_name, cust_street_address, &nbsp;<br />
3 &nbsp; &nbsp;cust_postal_code &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
4 &nbsp; &nbsp;FROM sh.customers &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
5 &nbsp; &nbsp;WHERE UPPER (cust_gender) = ‘M';</div></div>
<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">9. Présentation des outils de diagnostic</div></div>
<p>De nombreux outils de diagnostic permettent d&rsquo;évaluer les performances des instructions SQL et des modules PL/SQL. Chacun d&rsquo;entre eux fournit aux développeurs ou aux administrateurs de base de données un niveau variable d&rsquo;informations.<br />
• STATSPACK : cet utilitaire collecte des informations concernant les statistiques de base de données et les instructions SQL.<br />
• EXPLAIN PLAN : cet outil est exécuté au cours d&rsquo;une session, pour le diagnostic d&rsquo;une instruction SQL.<br />
• SQL Trace : cet utilitaire fournit des informations détaillées sur l&rsquo;exécution des instructions SQL.<br />
• TKPROF : cet utilitaire du système d&rsquo;exploitation convertit la sortie d&rsquo;une session SQL TRACE dans un format lisible.<br />
• AUTOTRACE : il s&rsquo;agit d&rsquo;une fonction SQL*Plus. AUTOTRACE génère un plan d&rsquo;exécution pour une instruction SQL et fournit des statistiques relatives au traitement de cette instruction.<br />
• Oracle SQL Analyze : cet outil fait partie d&rsquo;Oracle Enterprise Manager Tuning Pack. Il offre une puissante interface utilisateur pour le réglage des instructions SQL.<br />
<strong>10. Etats SQL dans STATSPACK </strong><br />
STATSPACK fournit quatre vues différentes, basées sur des instructions SQL stockées dans la zone de mémoire partagée du cliché (snapshot) de début ou de fin. Ces instructions SQL sont rapportées dans quatre sections différentes de l&rsquo;état :<br />
• SQL ordered by gets<br />
• SQL ordered by reads<br />
• SQL ordered by executions<br />
• SQL ordered by parse calls<br />
Ces vues peuvent être examinées pour voir quelles instructions SQL ont l&rsquo;impact le plus fort sur les performances de la base de données. Il est préférable de régler ces instructions, car elles sont susceptibles d&rsquo;améliorer considérablement les performances.<br />
<strong>11. EXPLAIN PLAN </strong><br />
Vous pouvez utiliser l&rsquo;instruction EXPLAIN PLAN de SQL*Plus sans la fonction de trace. Vous devez créer une table nommée plan_table à l&rsquo;aide du script utlxplan.sql fourni. Les colonnes les plus utiles sont operation, options et object_name.<br />
Pour utiliser l&rsquo;outil Explain Plan pour une interrogation, utilisez la syntaxe suivante :</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">EXPLAIN PLAN [SET STATEMENT_ID = ‘...’] [INTO &nbsp; my_plan_table]<br />
&nbsp; &nbsp; FOR SELECT ….</div></div>
<p><strong>Exemple :</strong></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">SQL&amp;gt; Explain plan for<br />
&nbsp; 2 &nbsp;select last_name from hr.employees;</div></div>
<p>Interrogez ensuite la table plan_table pour vérifier le plan d&rsquo;exécution. Cette table vous indique comment l&rsquo;instruction serait exécutée à cet instant. Notez que si vous effectuez des modifications (création d&rsquo;un index par exemple) avant d&rsquo;exécuter l&rsquo;instruction, l&rsquo;exécution risque d&rsquo;être différente. De plus, si vous n&rsquo;utilisez pas de paramètre STATEMENT_ID dans l&rsquo;instruction EXPLAIN PLAN, vous pouvez vider la table PLAN_TABLE avant de générer un autre plan d&rsquo;exécution. Le paramètre STATEMENT_ID permet d&rsquo;appliquer un marqueur à une instruction particulière dans la table PLAN_TABLE, en particulier s&rsquo;il risque d&rsquo;exister plusieurs versions de la même instruction.<br />
<strong>• Interroger la table PLAN_TABLE </strong><br />
Vous pouvez interroger la table directement ou exécuter le script utlxpls.sql ou utlxplp.sql (selon que les statistiques Parallel Query sont requises ou non). Ces scripts indiquent les colonnes les plus fréquemment sélectionnées de la table plan_table. </p>
<p><strong>12. Utiliser SQL Trace et TKPROF </strong><br />
Une procédure spécifique doit être suivie pour évaluer correctement les performances des instructions SQL à l&rsquo;aide de SQL Trace et de TKPROF :<br />
• La première étape consiste à définir les paramètres d&rsquo;initialisation de façon appropriée. Cette définition peut s&rsquo;effectuer au niveau de l&rsquo;instance, mais il est possible également de définir certains paramètres au niveau de la session.<br />
• Vous devez appeler SQL Trace soit au niveau de l&rsquo;instance, soit au niveau de la session. En règle générale, il est conseillé de l&rsquo;appeler au niveau de la session.<br />
• Exécutez l&rsquo;application ou l&rsquo;instruction SQL à diagnostiquer.<br />
• Arrêtez SQL Trace pour pouvoir fermer correctement le fichier trace au niveau du système d&rsquo;exploitation.<br />
• Utilisez TKPROF pour rendre lisible le fichier trace généré au cours de la session de trace. Si le fichier de sortie n&rsquo;est pas lisible, il est très difficile d&rsquo;interpréter les résultats.<br />
• Pour diagnostiquer les performances de l&rsquo;instruction SQL, utilisez les résultats de TKPROF. </p>
<p><strong>• Bref :</strong><br />
Pour utiliser SQL trace et TKPROF :<br />
• Définissez les paramètres d&rsquo;initialisation.<br />
• Alter session set SQL_Trace = true<br />
• Démarrez l&rsquo;application.<br />
• Alter session set SQL_Trace = false<br />
• Rendez le fichier trace lisible à l&rsquo;aide de TKPROF.<br />
• Interprétez les résultats. </p>
<p><strong>• Paramètres d&rsquo;initialisation</strong><br />
Deux paramètres du fichier init.ora gèrent la taille et la destination du fichier de sortie généré par l&rsquo;utilitaire SQL Trace :<br />
<em>	max_dump_file_size = n </em><br />
Ce paramètre est exprimé en octets s&rsquo;il porte la mention Ko ou Mo, ou, à défaut, en nombre de blocs du système d&rsquo;exploitation. La valeur par défaut est de 10000 blocs de système d&rsquo;exploitation.<br />
Lorsqu&rsquo;un fichier trace dépasse la taille définie par la valeur de ce paramètre, le message suivant s&rsquo;affiche à la fin du fichier : *** Trace file full ***<br />
Le paramètre suivant détermine la destination du fichier trace :<br />
user_dump_dest = directory</p>
<p>Vous devez définir un troisième paramètre pour obtenir les statistiques temporelles :<br />
	<strong>timed_statistics = TRUE </strong><br />
La résolution des statistiques temporelles s&rsquo;effectue au centième de seconde.<br />
Le paramètre TIMED_STATISTICS peut également être défini de manière dynamique au niveau de la session, à l&rsquo;aide de la commande ALTER SESSION.</p>
<p><strong>Activer et désactiver SQL Trace </strong><br />
SQL Trace peut être activé ou désactivé à l&rsquo;aide de différentes méthodes, au niveau de l&rsquo;instance ou de la session. </p>
<p><strong>Au niveau de l&rsquo;instance : </strong><br />
La définition du paramètre SQL_TRACE au niveau de l&rsquo;instance constitue l&rsquo;une des méthodes d&rsquo;activation de la fonction de trace. Toutefois, l&rsquo;instance doit être arrêtée, puis redémarrée une fois que la fonction de trace n&rsquo;est plus utilisée. En outre, le taux de performance doit être élevé, car toutes les sessions de l&rsquo;instance font l&rsquo;objet d&rsquo;un suivi d&rsquo;exécution.<br />
<strong>Au niveau de la session :</strong><br />
L&rsquo;utilisation de la fonction de trace au niveau de la session requiert un taux de performance moindre, car le suivi peut porter sur des sessions spécifiques. Vous pouvez activer ou désactiver SQL Trace :<br />
• à l&rsquo;aide de la commande ALTER SESSION, qui permet d&rsquo;exécuter la fonction de trace pendant toute la durée de la session ou jusqu&rsquo;à ce que la valeur FALSE soit définie,<br />
• en utilisant la procédure DBMS_SESSION.SET_SQL_TRACE pour la session,<br />
• en utilisant la procédure DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION pour activer la fonction de trace dans une session différente de la session actuelle.<br />
<strong>Exemple :</strong></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">SQL&amp;gt; alter session set SQL_TRACE = {true|false};<br />
SQL&amp;gt; execute DBMS_SESSION.SET_SQL_TRACE &nbsp;{true|false});<br />
SQL&amp;gt; execute DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp;2 &nbsp;(session_id, serial_id, {true|false});</div></div>
<p><strong>13. Rendre le fichier trace lisible à l&rsquo;aide de TKPROF </strong><br />
Utilisez TKPROF pour rendre le fichier trace lisible :<br />
tkprof tracefile outputfile [sort=option] [print=n] [explain=username/password] [insert=filename] [sys=NO] [record=filename] [table=schema.tablename]</p>
<p><strong>Exemple  :</strong></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">$ tkprof tracefile.trc output.txt [options]</div></div>
<p>Le fichier trace est créé dans le répertoire indiqué à l&rsquo;aide du paramètre USER_DUMP_DEST et la sortie est placée dans le répertoire indiqué par le nom du fichier de sortie.<br />
SQL Trace permet également de collecter des statistiques sur les instructions SQL récursives. Vous ne pouvez pas modifier directement la quantité d&rsquo;instructions SQL récursives exécutées par le serveur ; par conséquent, ces statistiques vous sont d&rsquo;une grande utilité. Utilisez l&rsquo;option SYS=NO de TKPROF pour supprimer la sortie de ces statistiques.<br />
Lorsque vous définissez le paramètre EXPLAIN, l&rsquo;utilitaire TKPROF se connecte à la base de données à l&rsquo;aide du nom utilisateur et du mot de passe fournis. Il étudie ensuite le chemin d&rsquo;accès de chaque instruction SQL concernée par la fonction de trace et inclut ces informations dans la sortie. Dans la mesure où TKPROF se connecte à la base de données, il utilise les informations disponibles lors de son exécution et non au moment où les statistiques de trace ont été générées. Cette distinction peut s&rsquo;avérer importante si, par exemple, un index a été créé ou supprimé après l&rsquo;exécution de la fonction de trace sur une instruction.<br />
TKPROF signale également les échecs dans le cache &laquo;&nbsp;library&nbsp;&raquo;. Ces échecs indiquent le nombre de fois où l&rsquo;instruction n&rsquo;a pas été trouvée dans le cache &laquo;&nbsp;library&nbsp;&raquo;. </p>
<p><strong>• Options de l&rsquo;utilitaire TKPROF </strong><br />
<a href="http://blog.developpez.com/zakaria-elhamdaoui/files/2012/10/1.jpg"><img src="http://blog.developpez.com/zakaria-elhamdaoui/files/2012/10/1-300x193.jpg" alt="" width="300" height="193" class="alignleft size-medium wp-image-31" /></a></p>
<p>Pour obtenir la liste de toutes les options et sorties disponibles, entrez tkprof à l&rsquo;invite du système d&rsquo;exploitation.<br />
<strong>Remarque :</strong> Les options de tri sont les suivantes : <a href="http://blog.developpez.com/zakaria-elhamdaoui/files/2012/10/2.jpg"><img src="http://blog.developpez.com/zakaria-elhamdaoui/files/2012/10/2-300x210.jpg" alt="" width="300" height="210" class="alignleft size-medium wp-image-32" /></a></p>
<p><strong>14. Statistiques de TKPROF </strong><br />
TKPROF collecte les statistiques suivantes :<br />
• Count : nombre d&rsquo;analyses ou d&rsquo;exécutions de l&rsquo;instruction et nombre d&rsquo;appels &laquo;&nbsp;fetch&nbsp;&raquo; émis pour cette instruction<br />
• CPU : durée de traitement pour chaque phase, en secondes. Si l&rsquo;instruction figurait dans la zone de mémoire partagée ou si le temps nécessaire à l&rsquo;analyse était inférieur à 1/100e de seconde, cette valeur est égale à 0.<br />
• Elapsed : temps écoulé exprimé en secondes (en règle générale, cette information n&rsquo;est pas très utile, car d&rsquo;autres processus ont une incidence sur le temps écoulé).<br />
• Disk : Nombre de blocs de données physiques lus dans les fichiers de base de données (en général, ce nombre est peu élevé si les données se trouvaient en mémoire tampon).<br />
• Query : Mémoires tampon logiques extraites pour une lecture cohérente (généralement pour les instructions SELECT)<br />
• Current : mémoires tampon logiques extraites en mode courant (généralement pour les instructions LMD)<br />
• Rows : lignes traitées par l&rsquo;instruction externe (pour les instructions SELECT, le nombre de lignes est affiché pour la phase de &laquo;&nbsp;fetch&nbsp;&raquo; ; pour les instructions LMD, il est affiché pour la phase d&rsquo;exécution).<br />
La somme des statistiques Query et Current représente le nombre total de mémoires tampon logiques utilisées. </p>
<p><strong>15. SQL*Plus AUTOTRACE </strong><br />
Vous pouvez utiliser SQL*Plus AUTOTRACE à la place de SQL Trace. L&rsquo;utilisation d&rsquo;AUTOTRACE présente l&rsquo;avantage suivant : vous n&rsquo;êtes pas obligé de rendre lisible le fichier trace et le plan d&rsquo;exécution de l&rsquo;instruction SQL est automatiquement affiché.<br />
Toutefois, AUTOTRACE analyse et exécute l&rsquo;instruction, tandis que l&rsquo;outil Explain Plan ne fait que l&rsquo;analyser.<br />
Pour utiliser AUTOTRACE, procédez comme suit :<br />
<em>1.  Créez la table Plan_table à l&rsquo;aide du script utlxplan.sql.</em><br />
<em>2.  Créez le rôle Plustrace en exécutant le script plustrce.sql. Cela permet d&rsquo;accorder au rôle des privilèges SELECT sur les vues V$ et d&rsquo;accorder le rôle Plustrace au rôle DBA. Octroyez le rôle Plustrace aux utilisateurs qui ne possèdent pas le rôle DBA.<br />
3.  Choisissez le niveau souhaité pour AUTOTRACE : </em><br />
&#8211; OFF : AUTOTRACE est désactivée (option par défaut).<br />
&#8211; ON : inclut le chemin d&rsquo;exécution de l&rsquo;optimiseur et les statistiques d&rsquo;exécution des instructions SQL.<br />
&#8211; ON EXPLAIN : affiche uniquement le chemin d&rsquo;exécution de l&rsquo;optimiseur.<br />
&#8211; ON STATISTICS : affiche uniquement les statistiques d&rsquo;exécution des instructions SQL.<br />
&#8211; TRACEONLY : identique à ON, mais supprime les résultats de l&rsquo;interrogation de l&rsquo;utilisateur. </p>
<p><strong>Exemple : </strong></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">SQL&amp;gt; @$ORACLE_HOME/sqlplus/admin/plustrce.sql<br />
SQL&amp;gt; grant plustrace to scott;</div></div>
<p>Puis :</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">set autotrace [ off | on | traceonly ] [ explain | statistics ]</div></div>
<p><strong>16. Nombre de blocs et de blocs vides </strong><br />
Un repère high-water mark est contenu dans le bloc d&rsquo;en-tête de segment de chaque table. Ce repère indique le dernier bloc utilisé pour cette table. Lorsque le serveur Oracle effectue des balayages complets de table, il lit tous les blocs jusqu&rsquo;au repère high-water mark. Notez que ce repère n&rsquo;est pas réinitialisé lorsque des lignes sont supprimées de la table.<br />
La procédure DBMS_SPACE.UNUSED_SPACE peut être utilisée pour rechercher le repère high-water mark et le nombre de blocs situés au-dessus de ce repère, si l&rsquo;analyse d&rsquo;une table est impossible ou n&rsquo;est pas souhaitée. </p>
<p><strong>Exemple :</strong></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">SQL&amp;gt; exec DBMS_SPACE.UNUSED_SPACE(‘SH', ‘ORDERS', -<br />
&nbsp; 2 &nbsp;'TABLE', :total_blocks, :total_bytes,:unused_blocks,-<br />
&nbsp; 3 &nbsp;:unused_bytes, :lastextf, :last_extb, :lastusedblock);</div></div>
<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">SQL&amp;gt; select num_rows,blocks,empty_blocks,<br />
&nbsp; 2 &nbsp; &nbsp; &nbsp; avg_space,avg_row_len, sample_size<br />
&nbsp; 3 &nbsp;from &nbsp; dba_tables<br />
&nbsp; 4 where &nbsp;table_name = ‘ORDERS' and owner = ‘SH’;<br />
<br />
NUM_ROW | SBLOCKS | EMPTY_BLOCKS | AVG_SPACE | AVG_ROW_LEN | SAMPLE_SIZE<br />
------- ------- ------------&nbsp; &nbsp; --------- ----------- &nbsp; ----------- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<br />
15132 &nbsp; &nbsp; &nbsp;434&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;225&nbsp; &nbsp; &nbsp; 48&nbsp; &nbsp; &nbsp; 1064</div></div>
<p><strong>17. Statistiques relatives aux index</strong><br />
Le facteur de regroupement dans l&rsquo;index constitue un type de statistiques d&rsquo;index important pour l&rsquo;optimiseur basé sur le coût, puisqu&rsquo;il permet d&rsquo;évaluer les coûts de balayage d&rsquo;index. Il donne une indication du nombre d&rsquo;accès aux blocs de données (logiques) nécessaire pour extraire toutes les lignes de la table via l&rsquo;index. Si les entrées d&rsquo;index suivent l&rsquo;ordre des lignes de la table, cette valeur est proche du nombre de blocs de données (un seul accès par bloc) ; en revanche, si les entrées d&rsquo;index pointent de façon aléatoire sur différents blocs de données, le facteur de regroupement peut être proche du nombre de lignes. </p>
<p><strong>Exemple : </strong></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">SQL&amp;gt; exec DBMS_SPACE.UNUSED_SPACE(‘SH', ‘SALES_PK', ‘INDEX', -<br />
&nbsp; 2 &nbsp;:total_blocks, :total_bytes,:unused_blocks, -<br />
&nbsp; 3 &nbsp;:unused_bytes, :lastextf, :last_extb, :lastusedblock);</div></div>
<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">SQL&amp;gt; select blevel, leaf_blocks, distinct_keys,<br />
&nbsp; 2 &nbsp;clustering_factor<br />
&nbsp; 3 &nbsp;from &nbsp; dba_indexes<br />
&nbsp; 4 &nbsp;where &nbsp;index_name = ‘SALES_PK' and owner = ‘SH’;<br />
<br />
BLEVEL | LEAF_BLOCKS |DISTINCT_KEYS | CLUSTERING_FACTOR<br />
-------- -----------&nbsp; &nbsp; ------------- &nbsp; -----------------<br />
&nbsp; &nbsp;2&nbsp; &nbsp; &nbsp; 682 &nbsp; &nbsp; &nbsp; 56252 &nbsp; &nbsp; &nbsp; &nbsp;21349</div></div>
<p><strong>18. Modèle de coût d&rsquo;un optimiseur </strong><br />
Un optimiseur d&rsquo;interrogation a pour mission de générer le meilleur plan d&rsquo;exécution pour une interrogation donnée. Ce processus inclut la sélection de chemins d&rsquo;accès à des tables uniques, les méthodes de jointure et l&rsquo;ordre des jointures si plusieurs tables sont concernées par l&rsquo;interrogation.<br />
Vous avez le choix entre l&rsquo;optimiseur basé sur les règles et l&rsquo;optimiseur basé sur le coût. Ce dernier utilise un modèle de coût pour sélectionner les chemins d&rsquo;accès ainsi que l&rsquo;ordre et les méthodes de jointures, tandis que l&rsquo;optimiseur basé sur les règles utilise un ensemble de règles simples.<br />
L&rsquo;optimiseur basé sur le coût compare plusieurs alternatives et sélectionne celle dont le coût est le plus faible. Outre le modèle de coût, il utilise un modèle de taille afin de dériver des statistiques sur des tables intermédiaires ; par exemple, la cardinalité du résultat d&rsquo;une opération de jointure.<br />
Le modèle de coût utilise des statistiques relatives aux objets manipulés par l&rsquo;interrogation. Ces statistiques sont générées à l&rsquo;aide du package DBMS_STATS et stockées dans le dictionnaire de données.<br />
La qualité du plan d&rsquo;exécution généré par l&rsquo;optimiseur dépend de la précision du modèle de coût. Le modèle proposé par Oracle8i présente certaines limites : il n&rsquo;est pas totalement précis ni complet. Par exemple, il considère que les colonnes sont indépendantes lors du calcul de la sélectivité de plusieurs prédicats sur différentes colonnes et il ne prend en compte que les activités d&rsquo;E/S. </p>
<p><strong>19. Amélioration du modèle de coût d&rsquo;un optimiseur </strong><br />
Le modèle de coût a été amélioré pour pouvoir effectuer les tâches suivantes :<br />
• Permettre aux utilisateurs ou aux développeurs de convertir le coût en informations plus significatives. Trois nouvelles colonnes ont été ajoutées à la table PLAN_TABLE :<br />
&#8211; CPU_COST : cette colonne contient le coût CPU estimé pour l&rsquo;opération à l&rsquo;aide de l&rsquo;approche basée sur le coût de l&rsquo;optimiseur. Pour les instructions qui utilisent l&rsquo;approche basée sur les règles, la valeur de cette colonne est NULL. La valeur de la colonne CPU_COST est proportionnelle au nombre de cycles requis pour l&rsquo;opération.<br />
&#8211; IO_COST : cette colonne contient le coût d&rsquo;E/S etimé pour l&rsquo;opération à l&rsquo;aide de l&rsquo;approche basée sur le coût de l&rsquo;optimiseur. Pour les instructions qui utilisent une approche basée sur les règles, la valeur de cette colonne est NULL. La valeur de la colonne IO_COST est proportionnelle au nombre de blocs de données lus par l&rsquo;opération.<br />
&#8211; TEMP_SPACE : cette colonne indique l&rsquo;espace temporaire, en octets, utilisé par l&rsquo;opération ; cet espace est estimé à l&rsquo;aide de l&rsquo;approche basée sur le coût de l&rsquo;optimiseur. Pour les instructions qui utilisent l&rsquo;approche basée sur les règles ou pour les opérations qui n&rsquo;utilisent pas d&rsquo;espace temporaire, la valeur de cette colonne est NULL. </p>
<p>• Inclure l&rsquo;utilisation de la CPU. Son estimation concerne les fonctions et les opérateurs SQL.<br />
• Prendre en compte l&rsquo;effet de la mise en mémoire cache sur les performances des jointures en boucle imbriquées (nested-loops joins).<br />
• Prendre en compte la pré-extraction des index, qui consiste à extraire plusieurs blocs feuille en une seule opération d&rsquo;E/S. </p>
<p><strong>20. Copier des statistiques d&rsquo;une base de données vers une autre </strong><br />
Pour que les opérations de réglage soient plus simples, copiez les statistiques d&rsquo;une base de données de production Oracle9i vers une base de données test, à l&rsquo;aide des procédures de package DBMS_STATS. Par exemple, pour copier les statistiques d&rsquo;un schéma, procédez comme suit : <a href="http://blog.developpez.com/zakaria-elhamdaoui/files/2012/10/3.jpg"><img src="http://blog.developpez.com/zakaria-elhamdaoui/files/2012/10/3-300x137.jpg" alt="" width="300" height="137" class="alignleft size-medium wp-image-33" /></a></p>
<p>1.  Utilisez la procédure DBMS_STATS.CREATE_STAT_TABLE de la base de données de production pour créer une table de statistiques définie par l&rsquo;utilisateur.<br />
2.  Utilisez la procédure DBMS_STATS.EXPORT_SCHEMA_STATS de la base de données de production pour copier les statistiques du dictionnaire de données vers la table de statistiques définie par l&rsquo;utilisateur à l&rsquo;étape 1.<br />
3.  Servez-vous des utilitaires Export et Import pour transférer les statistiques vers une table de statistiques définie par l&rsquo;utilisateur dans la base de données test.<br />
4. Utilisez la procédure DBMS_STATS.IMPORT_SCHEMA_STATS pour importer les statistiques dans le dictionnaire de données de la base de données test.<br />
Le package DBMS_STATS peut également être utilisé pour effectuer une sauvegarde des statistiques avant l&rsquo;analyse d&rsquo;objets. La sauvegarde peut être utilisée pour<br />
• restaurer d&rsquo;anciennes statistiques,<br />
• étudier les modifications des caractéristiques des données dans le temps.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>V$SQLTEXT</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p11364/non-classe/vsqltext</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p11364/non-classe/vsqltext#comments</comments>
		<pubDate>Mon, 01 Oct 2012 14:02:14 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=6</guid>
		<description><![CDATA[V$SQLTEXT : texte SQL complet sans troncature, affiché sur plusieurs lignes.]]></description>
				<content:encoded><![CDATA[<p>V$SQLTEXT : texte SQL complet sans troncature, affiché sur plusieurs lignes.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TUNING : REGLAGE DE LA SHARED POOL</title>
		<link>https://blog.developpez.com/zakaria-elhamdaoui/p11363/non-classe/resume-des-regles-de-tuning-oracle</link>
		<comments>https://blog.developpez.com/zakaria-elhamdaoui/p11363/non-classe/resume-des-regles-de-tuning-oracle#comments</comments>
		<pubDate>Mon, 01 Oct 2012 12:21:36 +0000</pubDate>
		<dc:creator><![CDATA[ora_home]]></dc:creator>
				<category><![CDATA[Non classé]]></category>
		<category><![CDATA[TUNING]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[shared pool]]></category>
		<category><![CDATA[tuning]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/zakaria-elhamdaoui/?p=8</guid>
		<description><![CDATA[1. REGLAGE DE LA SHARED POOL V$LIBRARYCACHE : contient des statistiques relatives à un type d&#8217;élément conservé dans le cache &#171;&#160;library&#160;&#187;. • NAMESPACE : Les éléments qui reflètent l&#8217;activité du cache &#171;&#160;library&#160;&#187; relative aux instructions SQL et aux blocs PL/SQL : SQL AREA, TABLE/PROCEDURE, BODY et TRIGGER • GETS : affiche le nombre total de demandes d&#8217;informations sur l&#8217;élément correspondant. • PINS : pour chaque zone, PINS affiche le nombre d&#8217;exécutions d&#8217;instructions ou de procédures [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><strong>1. REGLAGE DE LA SHARED POOL</strong> </p>
<p><strong>V$LIBRARYCACHE</strong> : contient des statistiques relatives à un type d&rsquo;élément conservé dans le cache &laquo;&nbsp;library&nbsp;&raquo;. </p>
<p><strong>• NAMESPACE :</strong> Les éléments qui reflètent l&rsquo;activité du cache &laquo;&nbsp;library&nbsp;&raquo; relative aux instructions SQL et aux blocs PL/SQL : SQL AREA, TABLE/PROCEDURE, BODY et TRIGGER<br />
<strong>• GETS :</strong> affiche le nombre total de demandes d&rsquo;informations sur l&rsquo;élément correspondant.<br />
<strong>• PINS :</strong> pour chaque zone, PINS affiche le nombre d&rsquo;exécutions d&rsquo;instructions ou de procédures SQL.<br />
<strong>• RELOADS :</strong> si l&rsquo;application appelle l&rsquo;exécution d&rsquo;une instruction SQL et que, dans le cache &laquo;&nbsp;library&nbsp;&raquo;, la zone SQL partagée contenant la représentation analysée de cette instruction a été libérée afin de faire de la place à une autre instruction ou en raison de l&rsquo;invalidation des objets indiqués par l&rsquo;instruction, le serveur Oracle recharge implicitement cette instruction et, par conséquent, la réanalyse. Le nombre de rechargements est calculé pour chaque espace de nom.<br />
<strong>• INVALIDATIONS </strong>: lorsqu&rsquo;un objet est modifié, il est possible qu&rsquo;il existe un meilleur chemin d&rsquo;exécution pour toutes les instructions utilisant cet objet. C&rsquo;est la raison pour laquelle le serveur Oracle marque toutes les exécutions utilisant un objet modifié comme non valides</p>
<p><strong> LIBRARY CACHE HIT RATIO &gt;90%</strong><em>:</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">SELECT SUM(PINS-ROLOADS)/SUM(PINS)*100 ‘’Library cahce HIT-Ratio’’ <br />
FROM V$LIBRARYCACHE;</div></div>
<p><strong> RELOADS TO PINS &lt;1%</strong></em></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">SELECT SUM(ROLOADS)/SUM(PINS)*100 ‘’Reload-Ratio’’ <br />
FROM V$LIBRARYCACHE;</div></div>
<p><strong> PINS TO RELOADS</strong><em></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">SELECT sum(pins), sum(reloads), sum(pins) * 100 / sum(pins+reloads) “Pin Hit%” &nbsp;FROM v$librarycache;</div></div>
<p><strong>V$SQLAREA:</strong> statistiques détaillées sur tous les curseurs partagés et 1000 premiers caractères de l&rsquo;instruction SQL.</p>
<p><strong>V$SQL :</strong> cette vue répertorie les statistiques sur la zone SQL partagée et contient une ligne pour chaque enfant du texte SQL entré à l&rsquo;origine. V$SQL est une vue similaire à V$SQLAREA, excepté le fait qu&rsquo;elle ne comporte pas de clause GROUP BY qui peut rendre l&rsquo;interrogation de la vue V$SQLAREA plus coûteuse.</p>
<p><strong>V$SQLTEXT :</strong> texte SQL complet sans troncature, affiché sur plusieurs lignes.</p>
<p><strong>V$DB_OBJECT_CACHE :</strong> objets de la base de données mis en mémoire cache, y compris les packages ; comprend également les tables et les synonymes lorsque ces objets sont référencés dans des instructions SQL.</p>
<p><strong>V$SHARED_POOL_RESERVED :</strong>Cette vue facilite le réglage du pool et de l&rsquo;espace réservés au sein de la zone de mémoire partagée.</p>
<p><strong>• FREE_SPACE :</strong>	est la quantité totale d&rsquo;espace libre dans la liste d&rsquo;espaces réservés.<br />
<strong>• AVG_FREE_SIZE :</strong> est la taille moyenne de la mémoire libre dans la liste d&rsquo;espaces réservés.<br />
<strong>• MAX_FREE_SIZE :</strong> est la taille de la plus grande zone de mémoire libre dans la liste d&rsquo;espaces réservés<br />
<strong>• REQUEST_MISSES :</strong> est le nombre de fois où la liste d&rsquo;espaces réservés ne possédait pas de mémoire libre pour satisfaire la demande et a commencé à retirer des objets de la iste LRU.<br />
<strong>• REQUEST_FAILURES : </strong>est le nombre de fois où une demande n&rsquo;a pas été satisfaite en raison de l&rsquo;insuffisance de mémoire.<br />
<strong>• LAST_FAILURE_SIZE </strong>:  est la taille de la dernière demande non satisfaite</p>
<p><strong><br />
objectif :</p>
<p></strong></em> REQUEST_FAILURES ou REQUEST_MISSES proche de 0 ou/et n’augmentent pas.<br />
SHARED_POOL_RESERVED_SIZE~=10% de SHARED_POOL_SIZE<br />
<strong> DBMS_SHARED_POOL .ABORTED_REQUEST_THRESHOLD:</strong> permet de restreindre la quantité de mémoire partagée à vider avant de signaler une erreur ORA-4031, afin de limiter l&rsquo;étendue d&rsquo;un vidage éventuellement provoqué par la présence d&rsquo;un objet volumineux.<br />
<strong>V$ROWCACHE :</strong> information sur dictionary cache :<br />
<strong>• PARAMETER :</strong> donne le nom (de categorie) du cache du dictionnaire de données faisant l&rsquo;objet de l&rsquo;état.<br />
<strong>• GETS :</strong> affiche le nombre total de demandes d&rsquo;informations sur l&rsquo;élément correspondant (par exemple, pour la ligne contenant des statistiques sur les descriptions de fichier, cette colonne indique le nombre total de demandes de données de description de fichier).<br />
<strong>• GETMISSES :</strong> affiche le nombre de demandes de données ayant échoué en mémoire cache.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
