<?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 &#187; Non classé</title>
	<atom:link href="https://blog.developpez.com/zakaria-elhamdaoui/pcategory/non-classe/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>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>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>
