<?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>Dans la tête de Doc Malkovich &#187; oracle</title>
	<atom:link href="https://blog.developpez.com/jmalkovich/pcategory/oracle/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/jmalkovich</link>
	<description>Réflexions et humeurs sur la Business Intelligence</description>
	<lastBuildDate>Tue, 26 Aug 2014 11:54:41 +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>Oracle 12c : (enfin) l&#8217;option In-Memory !</title>
		<link>https://blog.developpez.com/jmalkovich/p12659/oracle/oracle-12c-inmemory</link>
		<comments>https://blog.developpez.com/jmalkovich/p12659/oracle/oracle-12c-inmemory#comments</comments>
		<pubDate>Sun, 29 Jun 2014 19:25:57 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[hana]]></category>
		<category><![CDATA[innovation / veille]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/jmalkovich/?p=144</guid>
		<description><![CDATA[Enfin, Oracle sort une option &#171;&#160;InMemory&#160;&#187; pour fournir une base vectorielle digne de ce nom à sa base transactionnelle classique. Comment ça marche ? On garde le stockage en ligne classique et on apporte une couche supplémentaire de stockage en &#8230; <a href="https://blog.developpez.com/jmalkovich/p12659/oracle/oracle-12c-inmemory">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p><img src="http://fc00.deviantart.net/fs8/i/2005/361/e/3/brain_by_Mateu.jpg" alt="" /></p>
<p>Enfin, Oracle sort une option &laquo;&nbsp;InMemory&nbsp;&raquo; pour fournir une base vectorielle digne de ce nom à sa base transactionnelle classique.</p>
<p><strong>Comment ça marche ?</strong><br />
<span id="more-144"></span></p>
<p>On garde le stockage en ligne classique et on apporte une couche supplémentaire de stockage en colonnes et en mémoire. En fonction de la requête SQL qui est exécutée, le moteur Oracle va chercher les données sur le stockage classique en lignes ou en mémoire dans un stockage en colonnes.<br />
Ce stockage en mémoire et colonnes rappelle celui de solutions déjà existantes, comme Qlikview, Microsoft PowerPivot, SAP HANA et bien d&rsquo;autres.<br />
Comme la mémoire est limitée seules certaines tables seront montées en mémoire. C&rsquo;est au DBA ou à l&rsquo;architecte/concepteur BI de sélectionner les tables candidates. A priori on peut aussi ne choisir que certaines partitions.</p>
<p><img src="http://www.oracle.com/us/assets/cw20v1-315892-social1-2214805.jpg" alt="" /></p>
<p><strong>Le résultat</strong></p>
<p>Les requêtes sont bien plus rapides sur des volumétries importantes, ce qui n&rsquo;est pas étonnant quand on compare avec les solutions similaires.<br />
Mais les requêtes transactionnelles gagnent aussi en rapidité ! En effet certains index ne sont plus d&rsquo;utilité et sont donc supprimés (a priori les index bitmap).</p>
<p><strong>Les contraintes</strong></p>
<ul>
<li>C&rsquo;est une option, ce n&rsquo;est donc pas gratuit. Mais comme pour le partitionnement c&rsquo;est une option obligatoire pour une base décisionnelle.</li>
<li>Il faut une base en 12c, donc il est probable qu&rsquo;il faudra monter de version les bases existantes &#8230;</li>
</ul>
<p><strong>Le reste de la famille</strong></p>
<p>Exalytics est une appliance qui jouait le rôle de cette couche inmemory pour analyser les données rapidement. Le packaging est différent, mais ça fait doublon.<br />
Cela signe aussi la fin des cubes Oracle (Essbase ou OLAP) si le temps de réponse est satisfaisant avec le inmemory.</p>
<p>Pour les autres (TimesTen, Big Data) le terrain de jeu n&rsquo;est pas le même.</p>
<p><strong>Et le reste du monde</strong></p>
<p>SAP HANA est clairement visée. Il est vrai que SAP vend sa base comme LA base pour l&rsquo;analytique et le transactionnel, et marchait sur les plate-bandes d&rsquo;Oracle.<br />
Ce dernier a vite mis en ligne un comparatif entre les deux bases de données, à son avantage évidemment.<br />
SAP a vite rétorqué en commentant directement dans <a href="http://www.saphana.com/servlet/JiveServlet/download/38-14398/Get%20the%20Facts%20Straight.pdf">le document incriminé</a>.</p>
<p><img src="http://www.oracle.com/us/assets/c82-dbim-comp-chart-2215823.jpg" alt="" /></p>
<p>Loin de cette querelle fratricide on retiendra juste que :</p>
<ul>
<li>Oracle 12c inmemory n&rsquo;est pas une base gérée totalement en mémoire comme HANA, c&rsquo;est plus ce qu&rsquo;on appellera &laquo;&nbsp;un cache&nbsp;&raquo; pour l&rsquo;analytique.</li>
<li>HANA n&rsquo;est disponible que sur appliance ou cloud, ce qui est normal car il faut un matériel de compétition pour la faire tourner. Ce n&rsquo;est pas le cas d&rsquo;Oracle.</li>
</ul>
<p>Les deux bases sont bien différentes, le choix va être difficile &#8230;</p>
<p><strong>Oui mais &#8230;</strong></p>
<p>L&rsquo;idée est intéressante sur le papier. On bénéficie des deux modes de stockage, les applications transactionnelles et analytiques cohabitent sans problème. On peut récupérer instantanément tout un enregistrement en ligne pour une application transactionnelle, et on pourra calculer des agrégats complexes sur des volumétries importantes en un clin d&rsquo;oeil.<br />
L&rsquo;application idéale semble le reporting opérationnel en temps réel, soit des états qui attaquent directement une base transactionnelle de production avec un temps de réponse instantané.</p>
<p>Pourtant quand on connait les bases en colonnes existantes, on sait qu&rsquo;il existe un goulot d&rsquo;étranglement quand on ajoute ou modifie une seule ligne. Or c&rsquo;est ce qui se passe tout le temps sur une base transactionnelle classique. Alors comment va réagir la base Oracle inmemory ? Y a-t-il un temps de latence pour prendre en compte ces ajouts/modifications de ligne ? A-t-on vraiment du temps réel ?</p>
<p>Néanmoins il faut avouer que c&rsquo;est une excellente pour le monde BI, les bases Oracle étant bien implantées dans notre univers.</p>
<p>cf <a href="http://www.developpez.com/actu/72089/Oracle-presente-sa-solution-in-memory-pour-concurrencer-SAP-et-Microsoft-l-option-sera-disponible-avec-Oracle-Database-12c-dans-un-mois/" title="l'actu oracle sur developpez">l&rsquo;actu oracle sur developpez</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fonction LISTAGG</title>
		<link>https://blog.developpez.com/jmalkovich/p11058/oracle/fonction_listagg</link>
		<comments>https://blog.developpez.com/jmalkovich/p11058/oracle/fonction_listagg#comments</comments>
		<pubDate>Thu, 31 May 2012 11:36:47 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[A partir de Oracle 11g Release 2 une nouvelle fonction analytique LISTAGG est disponible pour concaténer les données réparties sur plusieurs lignes. Auparavant il fallait créer une fonction. Certes ce n&#8217;était pas très difficile à faire mais maintenant c&#8217;est intégré &#8230; <a href="https://blog.developpez.com/jmalkovich/p11058/oracle/fonction_listagg">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>A partir de Oracle 11g Release 2 une nouvelle fonction analytique <strong>LISTAGG</strong> est disponible pour concaténer les données réparties sur plusieurs lignes.<br />
<span id="more-7"></span><br />
Auparavant il fallait créer une fonction. Certes ce n&rsquo;était pas très difficile à faire mais maintenant c&rsquo;est intégré dans la base !</p>
<p>Exemple :</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">With emp as ( <br />
&nbsp; select 20 deptno, 'SMITH' ename from dual UNION ALL <br />
&nbsp; select 30 deptno, 'ALLEN' ename from dual UNION ALL <br />
&nbsp; select 30 deptno, 'WARD' ename from dual UNION ALL <br />
&nbsp; select 20 deptno, 'JONES' ename from dual UNION ALL <br />
&nbsp; select 30 deptno, 'MARTIN' ename from dual UNION ALL <br />
&nbsp; select 30 deptno, 'BLAKE' ename from dual UNION ALL <br />
&nbsp; select 10 deptno, 'CLARK' ename from dual UNION ALL <br />
&nbsp; select 20 deptno, 'SCOTT' ename from dual UNION ALL <br />
&nbsp; select 10 deptno, 'KING' ename from dual UNION ALL <br />
&nbsp; select 30 deptno, 'TURNER' ename from dual UNION ALL <br />
&nbsp; select 20 deptno, 'ADAMS' ename from dual UNION ALL <br />
&nbsp; select 30 deptno, 'JAMES' ename from dual UNION ALL <br />
&nbsp; select 20 deptno, 'FORD' ename from dual UNION ALL <br />
&nbsp; select 10 deptno, 'MILLER' ename from dual ) <br />
SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees <br />
FROM emp <br />
GROUP BY deptno; <br />
&nbsp;<br />
&nbsp; &nbsp; DEPTNO EMPLOYEES <br />
---------- -------------------------------------------------- <br />
&nbsp; &nbsp; &nbsp; &nbsp; 10 CLARK,KING,MILLER <br />
&nbsp; &nbsp; &nbsp; &nbsp; 20 SMITH,FORD,ADAMS,SCOTT,JONES <br />
&nbsp; &nbsp; &nbsp; &nbsp; 30 ALLEN,BLAKE,MARTIN,TURNER,JAMES,WARD</div></div>
</blockquote>
<p>La syntaxe est assez simple, en 1er paramètre on a la colonne à concaténer et en 2ème on a le séparateur.<br />
La clause WITHIN GROUP() spécifie le tri à appliquer.<br />
La clause OVER() permet de rajouter une partition, comme pour les autres fonctions analytiques.</p>
<p>Liens :<br />
<a href="http://docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm">Documentation Oracle sur la fonction</a><br />
<a href="http://www.oracle-base.com/articles/misc/StringAggregationTechniques.php">Autres techniques d&rsquo;agrégation pour les versions antérieures</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Générer x lignes à partir de dual facilement</title>
		<link>https://blog.developpez.com/jmalkovich/p10840/oracle/generer_x_lignes_a_partir_de_dual_facile</link>
		<comments>https://blog.developpez.com/jmalkovich/p10840/oracle/generer_x_lignes_a_partir_de_dual_facile#comments</comments>
		<pubDate>Thu, 15 Mar 2012 11:46:26 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Une astuce sympa pour générer plein de lignes à partir sans avoir besoin de table derrière &#8230; Pour générer des lignes on utilise souvent la table DUAL, par exemple pour simuler une table de dimension contenant un nombre limité de &#8230; <a href="https://blog.developpez.com/jmalkovich/p10840/oracle/generer_x_lignes_a_partir_de_dual_facile">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Une astuce sympa pour générer plein de lignes à partir sans avoir besoin de table derrière &#8230;<br />
<span id="more-6"></span></p>
<p>Pour générer des lignes on utilise souvent la table DUAL, par exemple pour simuler une table de dimension contenant un nombre limité de valeurs :</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 'a' code_famille, 'audio' libelle_famille from dual UNION ALL <br />
select 'v' , 'video' &nbsp;from dual UNION ALL <br />
select 'm' , 'multimedia' from dual</div></div>
<p>On peut aussi utiliser cette méthode pour générer des séquences de chiffres, mais il faut dans ce cas écrire autant de lignes qu&rsquo;on veut de valeurs :</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">-- 10000 lignes : <br />
select 1 x from dual UNION ALL <br />
select 2 from dual UNION ALL <br />
select 3 from dual UNION ALL <br />
select 4 from dual UNION ALL <br />
select 5 from dual UNION ALL <br />
........................... <br />
select 10000 from dual</div></div>
<p>Dans ce cas il vaut mieux passer par une boucle en PL/SQL, mais ça devient compliqué &#8230;<br />
On peut simplifier en une seule ligne en détournant les requêtes hiérarchiques, et le code précédent se résume alors à :</p>
<p><code class="codecolorer text default"><span class="text">SELECT level FROM dual connect BY level &lt;= 10000</span></code></p>
<p>Les utilisations sont diverses et variées, on peut par exemple :</p>
<p>- générer des données de test pour des tests de perf :</p>
<p><code class="codecolorer text default"><span class="text">SELECT 1 FROM dual connect BY level &lt;= 1000000</span></code></p>
<p>ou aléatoires pour des tests :</p>
<p><code class="codecolorer text default"><span class="text">select dbms_random.random() from dual connect BY level &lt;= 1000</span></code></p>
<p>- incrémenter une séquence de manière élégante <img src="http://www.developpez.net/forums/images/smilies/icon_cool.gif" alt=":-o" /></p>
<p><code class="codecolorer text default"><span class="text">select sequence.nextval FROM dual connect BY level &lt;= 1000</span></code></p>
<p>
&#8211; simuler une dimension temps sans avoir de table calendrier sous la main :</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">-- les 100 derniers jours : <br />
select trunc(sysdate)-level &nbsp;FROM dual connect BY level &lt;= 100</div></div>
<p>
Simple non ?</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Copier une table Oracle sans dblink</title>
		<link>https://blog.developpez.com/jmalkovich/p9617/oracle/copier_une_table_oracle_sans_dblink</link>
		<comments>https://blog.developpez.com/jmalkovich/p9617/oracle/copier_une_table_oracle_sans_dblink#comments</comments>
		<pubDate>Fri, 31 Dec 2010 16:56:16 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[oracle]]></category>
		<category><![CDATA[toad]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il est fréquent de vouloir copier une table de production en environnement de recette ou de développement pour effectuer des tests. La solution la plus simple est d&#8217;utiliser les dblinks qui font les passerelles entre différentes instances. Cependant les dblinks &#8230; <a href="https://blog.developpez.com/jmalkovich/p9617/oracle/copier_une_table_oracle_sans_dblink">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il est fréquent de vouloir copier une table de production en environnement de recette ou de développement pour effectuer des tests. La solution la plus simple est d&rsquo;utiliser les dblinks qui font les passerelles entre différentes instances.<br />
Cependant les dblinks n&rsquo;existent pas toujours, car les environnements sont isolés / ne se voient pas ou car les DBA ont interdit cette fonctionnalité.<br />
<span id="more-5"></span><br />
Donc pour copier des données il reste comme possibilités :</p>
<ul>
<li>créer les ordres <code class="codecolorer text default"><span class="text">INSERT INTO</span></code>, Toad le fait très bien ( via un Save as &#8230; ), mais quand il faut copier des tables de milliers de lignes on peut passer la journée :p</li>
<li>passer par des export/import, mais généralement ces outils sont réservés aux DBA &#8230;</li>
</ul>
<p>Un autre utilitaire existe depuis Oracle 9i, la commande <code class="codecolorer text default"><span class="text">copy</span></code> sous Sql*Plus.</p>
<p>La syntaxe est la suivante :</p>
<blockquote><p><code class="codecolorer text default"><span class="text">copy from &lt;cnxsrc&gt; insert &lt;tabdst&gt; using select &lt;col&gt; from &lt;tabsrc&gt;;</span></code></p></blockquote>
<p>ordre SQL à lancer sur l&rsquo;instance de destination, où</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">&lt;cnxsrc&gt; = la connexion source <br />
&lt;tabdst&gt; = table de destination <br />
&lt;col&gt; &nbsp; &nbsp;= les colonnes <br />
&lt;tabsrc&gt; = table source ( sur la source )</div></div>
<blockquote><p>Exemple :<br />
<code class="codecolorer text default"><span class="text">copy from userprod/pwdprod@prod insert dwh.ventes using select * from dwh.ventes;</span></code><br />
récupérer les données de la table ventes de prod en dev</p>
<p>Sortie:</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">Taille tableau extrait/lié est 15. (taille du tableau est 15) <br />
Sera validé après opération. (COPYCOMMIT = 0) <br />
Taille maximum (LONG) est 80. (longueur est 80) <br />
&nbsp; &nbsp;371225 lignes sélectionnées à partir de userprod@prod. <br />
&nbsp; &nbsp;371225 lignes insérées dans DWH.VENTES. <br />
&nbsp; &nbsp;371225 lignes validées en DWH.VENTES lors de la connexion DEFAULT HOST</div></div>
</blockquote>
<p>Remarques :</p>
<ul>
<li>le commit est automatique</li>
<li>à lancer sous Sql*Plus, ça ne marche pas sous Toad <img src="https://blog.developpez.com/jmalkovich/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /></li>
<li>il faut préciser les colonnes dans le select si la structure est différente</li>
<li>il faut ajouter des &#8211; en fin de ligne si on est sur plusieurs lignes</li>
</ul>
<blockquote><p>Exemple :</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">copy from userprod/pwdprod@prod - <br />
insert dwh.ventes using - <br />
select * from dwh.ventes;</div></div>
</blockquote>
<p>Voir la doc Oracle pour plus d&rsquo;infos comdab <img src="https://blog.developpez.com/jmalkovich/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Toad et sqlplus</title>
		<link>https://blog.developpez.com/jmalkovich/p9527/oracle/toad_et_sqlplus</link>
		<comments>https://blog.developpez.com/jmalkovich/p9527/oracle/toad_et_sqlplus#comments</comments>
		<pubDate>Tue, 23 Nov 2010 12:19:05 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[oracle]]></category>
		<category><![CDATA[toad]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Je commence ici une petite liste de billets sur TOAD. TOAD est un outil merveilleux pour tout décisionneux oraclien qui se respecte, mais j&#8217;ai pu remarquer qu&#8217;il n&#8217;était pas utilisé à 100% de ses possibilités, et c&#8217;est dommage. J&#8217;avoue bien &#8230; <a href="https://blog.developpez.com/jmalkovich/p9527/oracle/toad_et_sqlplus">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Je commence ici une petite liste de billets sur TOAD.</p>
<p>TOAD est un outil merveilleux pour tout décisionneux oraclien qui se respecte, mais j&rsquo;ai pu remarquer qu&rsquo;il n&rsquo;était pas utilisé à 100% de ses possibilités, et c&rsquo;est dommage.<br />
J&rsquo;avoue bien sûr ne pas connaître tout ce que peut donner l&rsquo;outil, mais je vais livrer ici quelques astuces bien utiles au quotidien.</p>
<p>Je vais commencer par l&rsquo;ajout d&rsquo;un raccourci vers sqlplus.<br />
<span id="more-4"></span><br />
On peut être amené à lancer sqlplus quand on veut utiliser certaines fonctionnalités comme le spool, ou quand la sécurité bloque certains ordres SQL comme update et delete &#8211; c&rsquo;est là qu&rsquo;on a le fameux message</p>
<blockquote><p>This version of TOAD provides READONLY access !</p></blockquote>
<p>Par défaut la barre d&rsquo;outils ressemble à ça :<br />
<img src="http://blog.developpez.com/media/toad_sqlplus1.png" width="773" height="71" alt="" /><br />
On va y rajouter un bouton Sql*plus</p>
<p>En allant dans le menu <strong>Utilities / External Tools / Configure<br />
</strong> on a la fenêtre TOAD Tool Options :<br />
<img src="http://blog.developpez.com/media/toad_sqlplus2.png" width="391" height="376" alt="" /></p>
<p>Cliquons sur le bouton &laquo;&nbsp;Add &#8230;&nbsp;&raquo; et rajoutons les paramètres suivants :<br />
<img src="http://blog.developpez.com/media/toad_sqlplus3.png" width="530" height="407" alt="" /></p>
<p><em>Bien sûr, les répertoires peuvent changer en fonction de votre installation &#8230;</em></p>
<p>Voilà, on a un bouton sqlplus dans la barre d&rsquo;outils et quand on clique dessus une session se lance sous sqlplus <strong>avec la même connexion Oracle que sous TOAD sans devoir saisir ni le login, ni le mot de passe</strong> !!!</p>
<p><img src="http://blog.developpez.com/media/toad_sqlplus4.png" width="780" height="47" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Raccourcis clavier sous Toad</title>
		<link>https://blog.developpez.com/jmalkovich/p9593/oracle/raccourcis_clavier_sous_toad</link>
		<comments>https://blog.developpez.com/jmalkovich/p9593/oracle/raccourcis_clavier_sous_toad#comments</comments>
		<pubDate>Mon, 20 Dec 2010 12:15:50 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[oracle]]></category>
		<category><![CDATA[toad]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Version : 9.6.1.1 Petite astuce aujourd&#8217;hui sur les raccourcis clavier sous TOAD. On tape régulièrement les mêmes ordres SQL dans l&#8217;éditeur, comme les SELECT FROM- quel manque de temps ! Avec les raccourcis clavier il suffit de taper quelques lettres &#8230; <a href="https://blog.developpez.com/jmalkovich/p9593/oracle/raccourcis_clavier_sous_toad">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Version : 9.6.1.1</p>
<p>Petite astuce aujourd&rsquo;hui sur les raccourcis clavier sous TOAD.<br />
On tape régulièrement les mêmes ordres SQL dans l&rsquo;éditeur, comme les <code class="codecolorer text default"><span class="text">SELECT FROM</span></code>- quel manque de temps !</p>
<p>Avec les raccourcis clavier il suffit de taper quelques lettres et le tour est joué.<br />
<span id="more-38"></span><br />
Par exemple j&rsquo;ai configuré un raccourci spécial pour le &laquo;&nbsp;<code class="codecolorer text default"><span class="text">SELECT * FROM</span></code>&nbsp;&raquo; que j&rsquo;utilise au quotidien.</p>
<p><img src="http://blog.developpez.com/media/toad_raccourci1.gif" width="210" height="698" alt="" /></p>
<p>Pour cela, dans l&rsquo;éditeur un petit clic droit fait apparaître un menu contextuel dans lequel il faut aller sur &laquo;&nbsp;Editing Options&nbsp;&raquo;. Dans Editor/Behavior on a 2 possibilités :</p>
<ul>
<li>les Code templates, qui sont appelés en appuyant sur la combinaison Ctrl + Espace.</li>
<li>les Auto replace, qui remplacent automatiquement certains mots</li>
</ul>
<p><img src="http://blog.developpez.com/media/toad_raccourci2b.gif" width="753" height="667" alt="" /></p>
<p>A fortiori on utilise les Code template pour des modèles de Code PL/SQL ou de requête SQL, alors qu&rsquo;on utilise les auto replace pour les jours où on a des moufles et qu&rsquo;on ne sait pas taper sur le clavier.<br />
Pour ma part je préfère les Code templates, allez on clique sur le bouton.</p>
<p>On atterrit sur une liste de raccourcis, comme vous le voyez pas mal de squelettes sont déjà définis.<br />
On rajoute la ligne sf avec &laquo;&nbsp;<code class="codecolorer text default"><span class="text">SELECT * FROM</span></code>&laquo;&nbsp;.</p>
<p><img src="http://blog.developpez.com/media/toad_raccourci3.gif" width="838" height="570" alt="" /></p>
<p>Maintenant dans l&rsquo;éditeur si on commence la ligne par sf et qu&rsquo;on tape sur Control et Espace en même temps le mot sf est remplacé par &laquo;&nbsp;<code class="codecolorer text default"><span class="text">SELECT * FROM</span></code>&nbsp;&raquo; &#8230; Magique<br />
Avec le temps cette astuce rend bien des services.</p>
<p>On peut en rajouter d&rsquo;autres, moi j&rsquo;ai rajouté<br />
sat pour </p>
<blockquote>
<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 * FROM ALL_TABLES <br />
WHERE (1=1) <br />
AND TABLE_NAME LIKE '%' <br />
--AND TABLE_OWNER=''</div></div>
</blockquote>
<p>satc pour</p>
<blockquote>
<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 * <br />
FROM ALL_TAB_COLUMNS <br />
WHERE (1=1) <br />
&nbsp; AND OWNER LIKE '%' <br />
&nbsp; AND TABLE_NAME LIKE '%' <br />
&nbsp; AND COLUMN_NAME LIKE '%'</div></div>
</blockquote>
<p>A personnaliser bien sûr !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Optimisation du Refresh d&#8217;une Vue Matérialisée</title>
		<link>https://blog.developpez.com/jmalkovich/p9499/oracle/optimisation_du_refresh_d_une_vue_materi</link>
		<comments>https://blog.developpez.com/jmalkovich/p9499/oracle/optimisation_du_refresh_d_une_vue_materi#comments</comments>
		<pubDate>Tue, 16 Nov 2010 12:45:26 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[optimisations]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Etrange &#8230; Pour optimiser le refresh des vues matérialisées en refresh full, il vaut mieux les supprimer et les recréer que de les rafraîchir &#8230;( en 10g ) Ainsi un refresh d&#8217;une VM prend 1h, alors que la suppression / &#8230; <a href="https://blog.developpez.com/jmalkovich/p9499/oracle/optimisation_du_refresh_d_une_vue_materi">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Etrange &#8230;</p>
<p>Pour optimiser le refresh des vues matérialisées en refresh full, il vaut mieux les supprimer et les recréer que de les rafraîchir &#8230;( en 10g )<br />
Ainsi un refresh d&rsquo;une VM prend 1h, alors que la suppression / création prend moins de 10 minutes <img src="http://www.developpez.net/forums/images/smilies/calim2.gif" /> !</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calculs prévisionnels sous Oracle et BO</title>
		<link>https://blog.developpez.com/jmalkovich/p9269/oracle/calculs_previsionnels_sous_oracle_et_bo</link>
		<comments>https://blog.developpez.com/jmalkovich/p9269/oracle/calculs_previsionnels_sous_oracle_et_bo#comments</comments>
		<pubDate>Thu, 14 Oct 2010 12:50:44 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[business objects]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Il existe différentes manières d&#8217;effectuer des prévisions / estimations dans le futur. Certains logiciels facilitent ce type de calcul, notamment ceux spécialisés en datamining ou/et en calculs statistiques comme SAS, Par contre d&#8217;autres comme Business Objects ne le permettent pas. &#8230; <a href="https://blog.developpez.com/jmalkovich/p9269/oracle/calculs_previsionnels_sous_oracle_et_bo">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il existe différentes manières d&rsquo;effectuer des prévisions / estimations dans le futur.<br />
Certains logiciels facilitent ce type de calcul, notamment ceux spécialisés en datamining ou/et en calculs statistiques comme SAS,<br />
Par contre d&rsquo;autres comme Business Objects ne le permettent pas.<br />
Mais on peut s&rsquo;en passer dans des cas assez simples.<br />
Je propose ici d&rsquo;utiliser certaines fonctions d&rsquo;Oracle qui répondent à ce besoin, et de voir comment les implémenter sous BO.</p>
<p><span id="more-1"></span></p>
<blockquote><p>Problématique :<br />
On a un indicateur annuel, on connait un certain historique et on aimerait estimer les valeurs de cet indicateur dans le futur.</p></blockquote>
<p>Exemple :</p>
<blockquote><p><code class="codecolorer text default"><span class="text">select * from test_regr</span></code></p></blockquote>
<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">ANNEE &nbsp;Y <br />
2007 &nbsp;2 <br />
2008 &nbsp;4 <br />
2009 &nbsp;6 <br />
2010 &nbsp;8</div></div>
<p>Ici on ajoute 2 à Y chaque année, donc on peut prévoir qu&rsquo;en 2011 on aurait Y=10, en 2012 Y=12 etc &#8230;<br />
Evidemment ici on a une suite logique, c&rsquo;est un exemple parfait. </p>
<p>Dans la vraie vie ce n&rsquo;est pas si facile, par exemple on aurait :</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">ANNEE &nbsp;Y <br />
2007 &nbsp;1.8 <br />
2008 &nbsp;4.2 <br />
2009 &nbsp;5.7 <br />
2010 &nbsp;8.8</div></div>
<p>On n&rsquo;a pas ici la même différence entre 2 années successives, On ne peut déduire la valeur de 2011 ou 2012 simplement. </p>
<p>Oracle propose des fonctions permettant de calculer une droite de régression. En résumé il s&rsquo;agit d&rsquo;établir une droite qui représenterait la courbe d&rsquo;évolution de l&rsquo;indicateur. </p>
<p><em>Séquence Nostalgie des cours de stats : La méthode s&rsquo;appuie sur le calcul des moindres carrés, je ne vais pas rentrer dans les détails, d&rsquo;autres le faisant mieux que moi comme sur <a href="http://fr.wikipedia.org/wiki/R%C3%A9gression_lin%C3%A9aire">wikipedia</a>.</em><br />
<img src="http://blog.developpez.com/media/regression2.gif" width="300" height="300" alt="graphe_regression" /></p>
<p>L&rsquo;équation de cette droite est du type y= p x + y0, p étant la pente et y0 l&rsquo;ordonnée à l&rsquo;origine.<br />
Sous Oracle la fonction REGR_SLOPE donne la pente, et REGR_INTERCEPT y0.<br />
Une fois qu&rsquo;on les a déterminés on peut estimer une valeur dans le futur en remplaçant x dans l&rsquo;équation.</p>
<p>&#8212; ce qui donne avec l&rsquo;exemple</p>
<blockquote>
<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">with v as <br />
&nbsp; ( &nbsp; select 2010 annee, 8 y from dual <br />
union select 2009, 6 from dual <br />
union select 2008, 4 from dual <br />
union select 2007, 2 from dual ) <br />
SELECT regr_slope( y, annee ) p, regr_intercept( y, annee ) y0 from v; <br />
&nbsp;<br />
-- p=2 et y0=-4012</div></div>
</blockquote>
<p>estimation pour 2011 :</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">y= p * &nbsp;x &nbsp; + &nbsp; y0 <br />
&nbsp;= 2 * 2011 + -4012 <br />
&nbsp;= 10</div></div>
<p>ou en sql :</p>
<blockquote>
<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">with v as <br />
&nbsp; ( &nbsp; select 2010 annee, 8 y from dual <br />
union select 2009, 6 from dual <br />
union select 2008, 4 from dual <br />
union select 2007, 2 from dual ) <br />
SELECT regr_slope( y, annee )*2011 + regr_intercept( y, annee ) from v;</div></div>
</blockquote>
<p>et le tout en one-shot :</p>
<blockquote>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">with a as <br />
&nbsp; ( select to_char(sysdate,'YYYY') annee from dual union <br />
&nbsp; &nbsp; select to_char(add_months(sysdate,-12),'YYYY') annee from dual union <br />
&nbsp; &nbsp; select to_char(add_months(sysdate,-24),'YYYY') annee from dual union <br />
&nbsp; &nbsp; select to_char(add_months(sysdate,-36),'YYYY') annee from dual union <br />
&nbsp; &nbsp; select to_char(add_months(sysdate,+12),'YYYY') annee from dual union <br />
&nbsp; &nbsp; select to_char(add_months(sysdate,+24),'YYYY') annee from dual union <br />
&nbsp; &nbsp; select to_char(add_months(sysdate,+36),'YYYY') annee from dual <br />
&nbsp; ), v as <br />
&nbsp; ( &nbsp; select 2010 annee, 8 y from dual <br />
union select 2009, 6 from dual <br />
union select 2008, 4 from dual <br />
union select 2007, 2 from dual ) <br />
select <br />
&nbsp; a.annee, &nbsp;<br />
&nbsp; v.y &nbsp;volume, &nbsp;<br />
&nbsp; s.p * a.annee + s.y0 estim <br />
from <br />
&nbsp; v, <br />
&nbsp; ( select regr_slope( y, annee ) p, regr_intercept( y, annee ) y0 from v ) s, <br />
&nbsp; a <br />
where v.annee(+)=a.annee <br />
order by a.annee;</div></div>
</blockquote>
<p>Remarques :</p>
<ul>
<li>intuitivement on a une progression linéaire,<br />
ce qui veut dire que si on sortait le graphe on pourrait tracer une ligne droite pour représenter l&rsquo;évolution de l&rsquo;indicateur.<br />
Sinon les estimations ne donnent pas les bons résultats</li>
<li>les fonctions regr sont des fonctions analytiques, on peut les utiliser comme telles avec la clause over( &#8230; )<br />
cela réduit le nombre de passages sur la table d&rsquo;historique et peut jouer sur les performances</li>
</ul>
<p><strong>SOUS Business Objects :</strong></p>
<p>On trouve bien les fonctions REGR_% dans l&rsquo;éditeur des objets BO du designer<br />
<img src="http://blog.developpez.com/media/regr_editeur_sql_designer.png" width="846" height="408" alt="fonction regr sous BO" /></p>
<p>Mais les contraintes réduisent le champ d&rsquo;action :</p>
<ul>
<li>on peut avoir des sum() en paramètre ( ex : regr_slope( sum( montant ), annee) ), mais la gestion est assez complexe, on mélange 2 fonctions d&rsquo;agrégation et souvent cela pose problème car il manque une colonne dans le GROUP BY du select généré par BO.<br />
On oublie donc cela, et on a déjà des tables agrégées dans l&rsquo;univers.</li>
<li>quand on rajoute des dimensions ( dans l&rsquo;éditeur SQL du rapport ) il faudrait les mettre dans la clause over(partition by (dimensions)) de la formule de l&rsquo;objet dans Designer.<br />
Il faut donc être synchro entre l&rsquo;éditeur de rapport et l&rsquo;univers.</li>
<li>il faut avoir des tables agrégées au grain de la dimension en x. Cela signifie qu&rsquo;on doit avoir une seule valeur dans la table pour un x donné.</li>
</ul>
<p>Par exemple si on a 10 opérations pour une année, on n&rsquo;aura pas d&rsquo;erreur mais les fonctions se feront sur une sorte de moyenne des indicateurs ( au lieu de la somme ).</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">annee &nbsp; montant <br />
2010 &nbsp; &nbsp; &nbsp;2 <br />
2010 &nbsp; &nbsp; &nbsp;4 <br />
2010 &nbsp; &nbsp; &nbsp;6 <br />
2009 &nbsp; &nbsp; &nbsp;4 <br />
--&gt; au lieu de sommer pour 2010 et d'avoir 12, les fonctions regr_%() vont traiter les 4 binômes et donc renvoyer une ligne plate ( y=4 )</div></div>
<p>Cela implique :</p>
<ul>
<li>il faut des tables agrégées au grain de la dimension en x. On peut s&rsquo;en arranger avec des vues ou des tables dérivées qui font les sommes.</li>
<li>il faut exactement les mêmes dimensions dans le fournisseur de données que celles utilisées pour les objets de régression.</li>
<li>si on utilise d&rsquo;autres objets la requête tombera en erreur<br />
Cela peut donc multiplier le nombre de tables et d&rsquo;objets dans l&rsquo;univers.<br />
Il est donc important de bien connaître les besoins au départ, de se limiter à ce périmètre et d&rsquo;expliquer les contraintes aux utilisateurs finaux.</li>
</ul>
<p>En conclusion l&rsquo;implémentation des fonctions Oracle de régression dans BO pour établir un modèle prévisionnel est assez limitée.<br />
Il faut définir l&rsquo;état final et à partir de là définir les objets de l&rsquo;univers en utilisant les fonctions <code class="codecolorer text default"><span class="text">regr_slope()</span></code> et <code class="codecolorer text default"><span class="text">regr_intercept().</span></code><br />
L&rsquo;univers utilisé est un univers technique, on ne pourra créer facilement d&rsquo;autres états prévisionnels à partir de celui-ci. Il faudra généralement à chaque fois créer de nouveaux objets.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Un hint dans BO</title>
		<link>https://blog.developpez.com/jmalkovich/p9387/oracle/un_hint_dans_bo</link>
		<comments>https://blog.developpez.com/jmalkovich/p9387/oracle/un_hint_dans_bo#comments</comments>
		<pubDate>Thu, 14 Oct 2010 12:19:59 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[business objects]]></category>
		<category><![CDATA[optimisations]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Des fois les plans d&#8217;exécution adoptés par le moteur d&#8217;Oracle ne sont pas forcément les meilleurs. Même si les stats à jour, une requête peut mettre un certain temps, voire ne jamais se terminer ! La solution made in DBA &#8230; <a href="https://blog.developpez.com/jmalkovich/p9387/oracle/un_hint_dans_bo">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Des fois les plans d&rsquo;exécution adoptés par le moteur d&rsquo;Oracle ne sont pas forcément les meilleurs.<br />
Même si les stats à jour, une requête peut mettre un certain temps, voire ne jamais se terminer !</p>
<p>La solution made in DBA consiste généralement à rajouter un hint, c&rsquo;est à dire une petite ligne de code pour forcer le plan d&rsquo;exécution.<br />
<span id="more-17"></span></p>
<p>Exemple :</p>
<blockquote>
<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 /*+ FULL(SALES) */ <br />
&nbsp; ... <br />
FROM &nbsp;<br />
&nbsp; SALES, &nbsp;<br />
&nbsp; .... <br />
-- ici on ne passe par les index, on lit la table complètement</div></div>
</blockquote>
<p>Pour coder ce hint dans Business Objects, on peut :</p>
<ul>
<li>modifier le sql généré<br />
C&rsquo;est dommage, on perd la fonctionnalité de sql dynamique de BO, avec tous les inconvénients que cela engendre : maintenance difficile, désynchronisation de la requête avec l&rsquo;univers.</li>
<li>modifier la propriété hint de la connexion.<br />
Mais toutes les requêtes seront impactées, ou il faut créer une nouvelle connexion.</li>
<li>créer un nouvel objet</li>
</ul>
<p>Cette dernière solution est à privilégier.<br />
Il suffit de créer un objet technique pointant sur une constante ( 0, 1 ou NULL ), à mettre en 1ère position dans l&rsquo;éditeur de requête.</p>
<p><img src="http://blog.developpez.com/media/bo_hint.gif" width="475" height="401" alt="bo_hint" /></p>
<p>La formule de l&rsquo;objet est </p>
<blockquote><p><code class="codecolorer text default"><span class="text">/*+ FULL(SALES) */ 0</span></code></p></blockquote>
<p>Et on le définit sur la table SALES ( bouton Tables &#8230; ) pour éviter les alertes lors de la vérification de l&rsquo;intégrité de l&rsquo;univers.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Update Oracle 10g massif optimisé / Merge</title>
		<link>https://blog.developpez.com/jmalkovich/p9339/oracle/update_oracle_10g_massif_optimise_merge</link>
		<comments>https://blog.developpez.com/jmalkovich/p9339/oracle/update_oracle_10g_massif_optimise_merge#comments</comments>
		<pubDate>Fri, 01 Oct 2010 12:08:20 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[optimisations]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Oracle 10g apportait dans son lot de nouveautés l&#8217;instruction MERGE qui correspond à un INSERT or UPDATE, mode d&#8217;alimentation bien connu de nos chers ETL. Les ETL gérant ce mode très bien, j&#8217;avoue n&#8217;en avoir jamais vu l&#8217;utilité, à part &#8230; <a href="https://blog.developpez.com/jmalkovich/p9339/oracle/update_oracle_10g_massif_optimise_merge">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Oracle 10g apportait dans son lot de nouveautés l&rsquo;instruction MERGE qui correspond à un INSERT or UPDATE, mode d&rsquo;alimentation bien connu de nos chers ETL.<br />
Les ETL gérant ce mode très bien, j&rsquo;avoue n&rsquo;en avoir jamais vu l&rsquo;utilité, à part la simplification d&rsquo;écriture dans un script SQL quand on n&rsquo;a pas d&rsquo;ETL sous la main.<br />
Jusqu&rsquo;à ce que je tombe sur un Update somme toute assez classique mais qui durait des plombes.<br />
<span id="more-3"></span><br />
On a une table &laquo;&nbsp;echeancier&nbsp;&raquo; avec un identifiant, une date et un montant.<br />
L&rsquo;update fait la somme des montants à venir :</p>
<blockquote>
<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">UPDATE avenir <br />
SET montant=(SELECT sum(montant) FROM echeancier <br />
WHERE echeancier.id=avenir.id <br />
AND echeancier.datecheance &gt; :dateparametre <br />
AND ( autres filtres ) ;</div></div>
</blockquote>
<p>Oracle utilise bien les index, mais comme la volumétrie est importante, la mise à jour est très longue ( 1h15 ).</p>
<p>La solution classique est de passer par une table temporaire, puis de faire l&rsquo;update. Mais il faut pouvoir créer une table, voire gérer les droits &#8230; Bref, pas très pratique.</p>
<p>Le Merge permet de faire un update massif, sans passer par une table intermédiaire.</p>
<p>Le sql transformé donne :</p>
<blockquote>
<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 avenir &nbsp;<br />
USING &nbsp;<br />
( SELECT id, sum(montant) montant <br />
FROM echeancier <br />
WHERE echeancier.datecheance &gt; :dateparametre <br />
AND ( autres filtres ) &nbsp; ) x <br />
ON ( avenir.id = x.id ) <br />
WHEN MATCHED THEN UPDATE SET montant=x.montant;</div></div>
</blockquote>
<p>Oracle n&rsquo;utilise plus les index, mais on passe de 1h 15 à 2&prime; 20.<br />
( 2&rsquo;40 en passant par une table temporaire )</p>
<p>Que du bonheur</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
