<?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; odi / sunopsis</title>
	<atom:link href="https://blog.developpez.com/jmalkovich/pcategory/etl/odi-sunopsis/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>Sélectionner l&#8217;enregistrement max en une seule fois &#8211; la clause magique keep</title>
		<link>https://blog.developpez.com/jmalkovich/p9315/oracle/selectionner_l_enregistrement_max_en_une</link>
		<comments>https://blog.developpez.com/jmalkovich/p9315/oracle/selectionner_l_enregistrement_max_en_une#comments</comments>
		<pubDate>Thu, 23 Sep 2010 11:48:46 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[business objects]]></category>
		<category><![CDATA[odi / sunopsis]]></category>
		<category><![CDATA[optimisations]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Une problématique récurrente dans les traitements décisionnels est de récupérer le dernier enregistrement d&#8217;une série, par exemple les dernières opérations des clients en ayant en source une table contenant toutes les opérations. Avoir uniquement la dernière date d&#8217;opération est simple, &#8230; <a href="https://blog.developpez.com/jmalkovich/p9315/oracle/selectionner_l_enregistrement_max_en_une">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Une problématique récurrente dans les traitements décisionnels est de récupérer le dernier enregistrement d&rsquo;une série, par exemple les dernières opérations des clients en ayant en source une table contenant toutes les opérations.<br />
<span id="more-36"></span><br />
Avoir uniquement la dernière date d&rsquo;opération est simple, rapide et à portée de tous:</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">/* exemple ** <br />
with operations <br />
as ( &nbsp;<br />
select 1 idclient, sysdate dat, 4 val from dual union all <br />
select 1 idclient, sysdate+1 dat, 8 val from dual union all <br />
select 1 idclient, sysdate+2 dat, 7 val from dual union all <br />
select 2 idclient, sysdate dat, 2 val from dual ) */ <br />
select idclient, max(dat) from operations group by idclient</div></div>
</blockquote>
<p>Par contre si on veut récupérer d&rsquo;autres informations de cet enregistrement, il faut passer par une sous-requête :</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 idclient, &nbsp;dat, &nbsp;val <br />
from operations a <br />
where a.dat=(select max(b.dat) from operations b where b.idclient=a.idclient )</div></div>
</blockquote>
<p>Le problème est ( entre autres ) qu&rsquo;on passe 2 fois sur la table operations, ce qui dégrade les performances. </p>
<p>Oracle propose depuis la 9i les fonctions analytiques, ce qui est bien pratique pour gérer ce type de problème.<br />
On utilisera par exemple la fonction row_number(), mais on aura toujours une sous-requête :</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 idclient, dat, val from ( <br />
&nbsp; select idclient, dat, val, <br />
&nbsp; &nbsp; row_number() over(partition by idclient order by dat desc) num <br />
&nbsp; from operations <br />
) <br />
where num=1</div></div>
</blockquote>
<p>Cette solution n&rsquo;est pas forcément simple à implémenter du fait de la sous-requête. Un ETL comme Sunopsis/ODI ne gère pas les sous-requêtes, il faut passer par des vues et du coup on perdra le lien dans l&rsquo;analyse d&rsquo;impact de l&rsquo;outil.<br />
Solution miracle, on a une requête en one-shot avec la clause keep :</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 idclient, <br />
&nbsp; max(dat), <br />
&nbsp; max(val) keep (dense_rank last &nbsp;order by dat) val <br />
from operations <br />
group by idclient</div></div>
</blockquote>
<p>Cerise sur le gâteau, on peut aussi utiliser ce type de clause dans un univers Business Objects, cela évite de passer par une table dérivée ou du sql en dur.</p>
<p>Que du bonheur.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Retour d&#8217;expérience sur &#8230; Sunopsis / ODI</title>
		<link>https://blog.developpez.com/jmalkovich/p8899/oracle/retour_d_experience_sur_sunopsis_odi</link>
		<comments>https://blog.developpez.com/jmalkovich/p8899/oracle/retour_d_experience_sur_sunopsis_odi#comments</comments>
		<pubDate>Tue, 04 May 2010 12:13:30 +0000</pubDate>
		<dc:creator><![CDATA[doc malkovich]]></dc:creator>
				<category><![CDATA[etl]]></category>
		<category><![CDATA[odi / sunopsis]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Sunopsis est un ETL fondé par un français, Alain Dumas en 1998. Contrairement aux ETL qui possèdent leurs propres moteurs de transformation, Sunopsis est un génarateur de code qui repose sur une architecture d&#8217;intégration distribuée. Au lieu de transformer les &#8230; <a href="https://blog.developpez.com/jmalkovich/p8899/oracle/retour_d_experience_sur_sunopsis_odi">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Sunopsis est un ETL fondé par un français, Alain Dumas en 1998. Contrairement aux ETL qui possèdent leurs propres moteurs de transformation, Sunopsis est un génarateur de code qui repose sur une architecture d&rsquo;intégration distribuée. Au lieu de transformer les données sur un serveur spécifique, il lance les traitements directements sur les bases de données, en exploitant au mieux les spécificités de chacune. Cette architecture est aussi définie comme ELT ( Extract/Load &amp; Transform ).<br />
Sunopsis a été racheté en 2006 par Oracle et depuis a été renommé en ODI ( Oracle Data Integrator ).</p>
<p><strong>Les + :</strong></p>
<ul>
<li>les performances ( mode ELT )</li>
<li>les KM ( modules de connaissance ) qui définissent les process &laquo;&nbsp;standard&nbsp;&raquo; ETL comme la détection des doublons, des valeurs inconnues de tables de référence ( écartés dans une table d&rsquo;erreur ),<br />
 l&rsquo;alimentation des tables ( en Insert pur, Insert en delta, en SCD &#8230; )</li>
<li>pas besoin de connaitre un nouveau langage, le SQL du SGBD suffit généralement !</li>
<li>debugage facile</li>
<li>reprise d&rsquo;un plantage à partir d&rsquo;un certain point ( où ça s&rsquo;est planté, ou depuis le début, ou 3 sql avant  &#8230; )</li>
<li>optimisation orientée SGBD donc facile ( un expert ETL n&rsquo;est pas nécessaire, un DBA suffit )</li>
<li>l&rsquo;analyse d&rsquo;impact très fine</li>
<li>l&rsquo;éditeur de requête sql qui permet de construire des requêtes assez complexes</li>
<li>les contextes qui facilitent le déploiement d&rsquo;un environnement à un autre</li>
<li>la séparation modèle physique / modèle logique</li>
</ul>
<p><strong>Les &#8211; :</strong>
<ul>
<li>traitements unitaires basiques ( plusieurs tables constituent une requête qui alimente une seule table ) : il faut généralement utiliser des tables temporaires, le flux de la donnée n&rsquo;est pas visible en un seul job.</li>
<li>nécessité de connaitre les SGBD &#8230; et des fonctions complexes dans certains cas<br />
  comme pour les comparaisons relatives entre lignes,<br />
  par ex pour comparer un statut par rapport au statut précédent<br />
  &#8211;> fonctions analytiques oracle</li>
<li>la perte des dépendances pour l&rsquo;analyse d&rsquo;impact sur certains traitements</li>
<li>la prise en main &#8211; il faut bien décomposer ses traitements</li>
</ul>
<p>L&rsquo;éditeur de requête SQL permet d&rsquo;élaborer des requêtes complexes tout en gardant les références aux objets. Ainsi il n&rsquo;y a pas besoin de coder les clauses &laquo;&nbsp;where&nbsp;&raquo;, &laquo;&nbsp;group by&nbsp;&raquo; ou &laquo;&nbsp;having&nbsp;&raquo; comme dans les autres ETL, et l&rsquo;analyse d&rsquo;impact se fait à la colonne &#8230;</p>
<p><strong>Quelques astuces :</strong></p>
<ul>
<li>simuler un MINUS &#8211; je vais faire un tuto dessus bientôt &#8230;</li>
</ul>
<p><strong>En conclusion :</strong><br />
Pour moi Sunopsis/ODI fait partie des meilleurs ETL du marché, il se démarque de ses concurrents principalement par ses performances et par l&rsquo;intégration des process habituels d&rsquo;alimentation dans l&rsquo;outil. </p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
