<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Oracle - Concepts et Exemples &#187; Greg Rahn</title>
	<atom:link href="https://blog.developpez.com/pachot/category/traductions/greg-rahn/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/pachot</link>
	<description>Les fonctionalités et concepts d&#039;Oracle à partir de traductions et de démos</description>
	<lastBuildDate>Sun, 03 Apr 2016 20:36:21 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Les principes fondamentaux d&#8217;un datawarehouse &#8211; traitement batch, par Greg Rahn</title>
		<link>https://blog.developpez.com/pachot/gr_batch/</link>
		<comments>https://blog.developpez.com/pachot/gr_batch/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 21:07:14 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Greg Rahn]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cet article est la traduction d&#8217;un article de Greg Rahn publié sur son blog. L&#8217;article original en anglais est: The Core Performance Fundamentals Of Oracle Data Warehousing – Set Processing vs Row Processing. Cet article fait partie d&#8217;une série sur &#8230; <a href="https://blog.developpez.com/pachot/gr_batch/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p><ins>Cet article est la traduction d&rsquo;un article de Greg Rahn publié sur son blog. L&rsquo;article original en anglais est: <a href="http://structureddata.org/2010/07/20/the-core-performance-fundamentals-of-oracle-data-warehousing-%E2%80%93-set-processing-vs-row-processing/">The Core Performance Fundamentals Of Oracle Data Warehousing – Set Processing vs Row Processing</a>. Cet article fait partie d&rsquo;une série sur les principes fondamentaux des datawarehouse, mais s&rsquo;applique à tous les traitements de type batch.<br />
</ins></p></blockquote>
<p>Durant 6 ans à faire des <i>Proof Of Concept</i> et des <i>Benchmarks</i> sur des datawarehouse pour les clients, il y a un domaine qui s&rsquo;est toujours montré problématique: les traitements par lots (<i>batch</i>). La plupart du temps, ces <i>batchs</i> prennent la forme de procédures et packages PL/SQL, qui font du chargement de donnée, de la transformation, du traitement, ou quelque chose de similaire.<br />
La raison pour laquelle c&rsquo;est souvent problématique, c&rsquo;est que les développeurs y ont codé en dur la lenteur du traitement. Je suis certain que les développeurs ne savaient pas qu&rsquo;ils faisaient cela, lorsqu&rsquo;ils ont codé leur PL/SQL, mais en tout cas, c&rsquo;est ce qui est arrivé.</p>
<p><b>Alors comment ont-ils codé &lsquo;en dur&rsquo; cette lenteur en PL/SQL ?</b><br />
<span id="more-45"></span></p>
<p>En général, c&rsquo;est parce que au lieu d&rsquo;avoir lu les spécifications métiers en étudiant l&rsquo;état &lsquo;avant&rsquo; et &lsquo;après&rsquo; des données, puis d&rsquo;en avoir déterminé la manière la plus efficace de faire ces modifications de données, les développeurs PL/SQL ont fait une traduction littérale de chaque règle/exigence lues dans les specs, une par une. On devine cela lorsqu&rsquo;on voit du code qui parcours un curseur ligne par ligne, mais aussi dans du PL/SQL qui ne fait qu&rsquo;exécuter une série de requêtes SQL souvent mal concues.</p>
<p><b>Etude de cas de la lenteur codée &lsquo;en dur&rsquo;</b></p>
<p><em>La suite est basée sur une histoire vécue. Seuls les noms ont été modifiés pour protéger les innocents.</em></p>
<p>Voici un extrait de pseudo-code que j&rsquo;ai rencontré dans un POC:</p>
<pre>
{truncate de toutes les tables intermédiaires}
insert into temp1 select * from t1 where create_date = hier;
insert into temp1 select * from t2 where create_date = hier;
insert into temp1 select * from t3 where create_date = hier;
insert into temp2 select * from temp1 where {conditions};
insert into target_table select * from temp2;
pour chacune des  20 colonnes
loop
  update target_table t
    set t.column_name =
      (select column_name
       from t4
       where t.id=t4.id )
    where i.column_name is null
end loop
update target_table t set {liste de 50 columns} = select {50 colonnes} from t5 where t.id=t5.id;
</pre>
<p>Je m&rsquo;arrête ici car la suite risquerait de vous faire pleurer.<br />
J&rsquo;hésite un peu à poser la question, mais n&rsquo;est-ce pas évident ce qu&rsquo;il y a de pas correct dans ce traitement ?<br />
Voici les principales raisons que je vois à cette inefficacité:</p>
<ul>
<li>Pourquoi insérer toutes les données dans temp1, et ne les filtrer que lorsqu&rsquo;on remplit temp2 ? Si vous n&rsquo;avez jamais entendu le conseil <strong>&lsquo;filtrez les données au plus tôt&rsquo;</strong> alors vous avez des devoirs à faire.</li>
<li>Pourquoi publier dans la table cible, puis faire 20 update d&rsquo;une seule colonne chacun, suivi d&rsquo;un update de 50 colonnes ? Meilleure question: pourquoi faire des update de masse ? <strong>Les update (et delete) de masse sont à proscrire</strong>, il faut les éviter à tout prix.</li>
</ul>
<p>Et alors, comme beaucoup de client qui font un POC (preuve de concept) sur une machine Exadata, ils n&rsquo;ont pas du tout envie de modifier leur code, ils veulent juste voir quelle performance la plateforme Exadata peur leur délivrer. Et pour leur plus grand bonheur, ils ont réduit la durée du traitement de 2.5 jours (batch de week-end qui commence le vendredi après midi et n&rsquo;est toujours pas terminé le lundi matin) à 10 heures, gagnant ainsi plus de 2 jours. Maintenant, le batch peut planter et ils auront le temps de le relancer avant l&rsquo;ouverture aux utilisateurs du lundi matin. Eh, je suppose que je serais aussi très exité si je gagnait 24 heures sur un traitement de 38 heures. Mais ce n&rsquo;est pas le cas lorsque je suis un ingénieur de performance de base de données qui sait qu&rsquo;il y a encore plus de performance à gagner.</p>
<p>Comme je n&rsquo;était pas satisfait par cela, j&rsquo;ai pris sur moi de prouver que de re-designer le code peut avoir un retour très intéressant sur la plateforme Exadata, et j&rsquo;ai codé complètement un flux de donnée qui travaille de manière ensembliste, avec juste une poignée de requêtes SQL (et pas de PL/SQL). Le résultat: le traitement d&rsquo;une semaine complète de données (plusieurs centaines de millions de lignes) prend maintenant 12 minutes. C&rsquo;est exact: 7 jours de données nettoyées, transformées, enrichies et publiées en 12 minutes seulement.</p>
<p>Lorsque j&rsquo;ai annoncé la nouvelle au client, qu&rsquo;il était possible de charger une semaine de données en seulement 12 minutes, ils étaient très excités, c&rsquo;est le moins que l&rsquo;on puisse dire. En fait, il y en a un qui a même dit, un peu hors du contexte, que maintenant une seule journée de données pourrait être chargées en 2 minutes, et que cela donnerait un autre niveau de fraîcheur  aux données, ce qui permettrait au métier de prendre des décision meilleures et plus rapides, grâce aux données actualisées plus souvent. Ma réponse: CQFD ! Le client voit maintenant ce qu&rsquo;il est possible de faire avec Exadata, et qui était impossible avant.</p>
<p><b>C&rsquo;est pas obligatoire, mais c&rsquo;est souhaitable</b></p>
<p>Je ne vais pas changer ma casquette d&rsquo;ingénieur base de données en vendeur de produit, pas maintenant, et probablement jamais, mais c&rsquo;est le réalité telle qu&rsquo;elle existe. Les boites informatiques ont démarré avec des faibles volumes de données, et une logique de programmation sur des petits volumes, et cela a fonctionné un certain temps. Pourquoi ? Parce que le traitement peu efficace d&rsquo;un faible volume de données est seulement <strong>un peu inefficace</strong> Mais la même logique de développement sur un gros volume de données devient alors <strong>très inefficace</strong>.<br />
C&rsquo;est pourquoi j&rsquo;ai déjà dit: pour exploiter à fond la plateforme Exadata (ou n&rsquo;importe quelle plateforme actuelle), il faut changer le code. Ne me faites pas dire ce que je n&rsquo;ai pas dit: je ne dis pas qu&rsquo;il est nécessaire revoir le code de l&rsquo;application pour Exadata. Je dis que vous pouvez choisir de revoir le code pour Exadata parce que l&rsquo;application n&rsquo;est tout simplement pas conçue pour profiter du traitement massivement parallèle que Exadata permet. Il est temps que les décisions de design de l&rsquo;application soient basées sur les technologies d&rsquo;aujourd&rsquo;hui, et non sur celles sur lesquelles l&rsquo;application a été faite. Avance rapide vers aujourd&rsquo;hui.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Les principes fondamentaux d&#8217;un datawarehouse &#8211; Le Partitionnement, par Greg Rahn</title>
		<link>https://blog.developpez.com/pachot/gr_partitioning/</link>
		<comments>https://blog.developpez.com/pachot/gr_partitioning/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 20:59:02 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[Greg Rahn]]></category>
		<category><![CDATA[datawarehouse]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Cet article est la traduction d&#8217;un article de Greg Rahn publié sur son blog. L&#8217;article original en anglais est:The Core Performance Fundamentals Of Oracle Data Warehousing – Partitioning. Cet article fait partie d&#8217;une série sur les principes fondamentaux des datawarehouse. &#8230; <a href="https://blog.developpez.com/pachot/gr_partitioning/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<blockquote><p><ins>Cet article est la traduction d&rsquo;un article de Greg Rahn publié sur son blog. L&rsquo;article original en anglais est:<a href="http://structureddata.org/2010/01/25/the-core-performance-fundamentals-of-oracle-data-warehousing-partitioning/">The Core Performance Fundamentals Of Oracle Data Warehousing – Partitioning</a>. Cet article fait partie d&rsquo;une série sur les principes fondamentaux des datawarehouse.<br />
</ins></p></blockquote>
<p>Le partitionnement est une fonctionnalité majeure pour les performance d&rsquo;un <i>datawarehouse</i> sous Oracle, car l&rsquo;élagage des partition (<i>partition pruning</i>) va la plupart du temps faire en sorte qu&rsquo;il y ait moins de données à lire sur une table. Le résultat, c&rsquo;est qu&rsquo;il y a besoin de moins de ressources système, et que les requêtes sont plus performantes.<br />
Quelqu&rsquo;un m&rsquo;a dit un jour <i><b>&laquo;&nbsp;les I/O les plus rapides sont ceux que l&rsquo;on ne fait jamais&nbsp;&raquo;</b></i> C&rsquo;est précisément la raison pour laquelle le partitionnement est ce qu&rsquo;il y a de mieux pour un <i>datawarehouse</i>: il permet de réduire les I/O.<br />
Je parle souvent de l&rsquo;élagage des partitions (<i>partition pruning</i>) comme d&rsquo;un anti-index. Un index est utilisé pour trouver la faible quantité de données qui <u>est</u> nécessaire, alors que le partitionnement est utilisé pour éliminer une grande quantité de données qui <u>n&rsquo;est pas</u> nécessaire.</p>
<p><b>Principales utilisations du partitionnement</b></p>
<p>Je vois quatre raisons pour l&rsquo;utilisation du partitionnement dans un datawarehouse Oracle:</p>
<ul>
<li>Élimination de données</li>
<li>Jointures partition par partition (<i>Partition-Wise Joins</i>)</li>
<li>Maintenabilité (chargements par échange de partitions, indexes locaux, etc.)</li>
<li>Cycle de vie des données (I<i>nformation Lifecycle Management &#8211; ILM</i>)</li>
</ul>
<p><span id="more-44"></span></p>
<p><b>Les bases du partitionnement</b></p>
<p>Le partitionnement par RANGE (ou INTERVAL) des tables de faits sur une colonne date/heure et le pattern le plus courant dans un datawarehouse Oracle. Alors le <i>partition pruning</i> (élagage) va éliminer les données qui ne sont pas dans la fenêtre de temps désirée, telle que définie dans la requête. </p>
<p>Par exemple: J&rsquo;ai une table de faits qui contient les informations des points de vente, chaque ligne a un <i>timestamp</i> qui correspond à l&rsquo;heure où l&rsquo;article est passé à la caisse. Disons que cette valeur est stockée dans la colonne EVENT_TS, qui du type DATE ou TIMESTAMP. Dans la plupart des cas, il serait logique de partitionner par range sur EVENT_TS, en ayant une partition par jour Cela signifie que toutes les requêtes qui utilisent un prédicat de filtre sur EVENT_TS (donc probablement dans la plupart des cas) vont pouvoir éliminer des quantités importantes de données, celles qui ne sont pas satisfaites par le prédicat de la requête.  Si vous voulez regarder les chiffres des ventes d&rsquo;hier, il n&rsquo;est pas nécessaire de ramener les enregistrements de la semaine dernière ou du mois dernier !</p>
<p><b>Options de sous-partitionnement</b></p>
<p>En fonction du votre modèle de données de votre datawarehouse, vous pouvez également choisir de sous-partitionner une table. Cela permet d&rsquo;aller plus loin dans le partitionnement d&rsquo;une table et de permettre l&rsquo;élimination d&rsquo;un plus grand volume de données. Et cela peut permettre aussi les jointure partition par partition (<i>partition-wise</i> <i>join</i>) qui permettent de réduire les ressources CPU et mémoire utilisées, en réduisant la quantité de données échangées entre les processus parallèle. </p>
<p>Pour cette raison, il est très avantageux d&rsquo;utiliser le partitionnement ou le sous-partitionnement par HASH sur des modèles en troisième forme normale (3NF) pour permette les jointures partitions par partitions (<i>partition-wise joins</i>). </p>
<p>Les modèles dimensionnels ( modèles en étoile &#8211; <i>star schema </i>) peuvent également bénéficier du sous-partitionnement par HASH et des jointures <i>partition-wise</i>.<br />
En général il est préférable de sous-partitionner par HASH sur une colonne qui est une clé étrangère (<i>foreign</i> <i>key</i>) vers une grosse table de dimension, comme une table CLIENTS par exemple, alors la <i>partition-wise</i> <i>join</i> pourra être utilisée pour une jointure entre la table de faits et cette grosse table.</p>
<p><b>Maintenabilité</b></p>
<p>Pour différentes raisons, la gestions des des objets volumineux peut être difficile, et c&rsquo;est là que le partitionnement d&rsquo;Oracle permet de faire de nombreuses opérations soit au niveau global, soit au niveau des partitions ou sous-partitions.  Cela rend plus facile les opérations sur des grosses tables ou indexes. </p>
<p>De plus le partitionnement est transparent pour les applications, ce qui signifie que les requêtes SQL faites sur un objet partitionné se comportent de la même manière que sur un objet non-partitionné.  Les principales fonctionnalités comprennent:</p>
<ul>
<li><b>Chargement par échange de partition (<i>partition exchange</i>)</b>: Les données peuvent être chargées «hors ligne» puis échangées avec une partition de la table (<code class="codecolorer text default"><span class="text">ALTER TABLE ... EXCHANGE PARTITION ...</span></code>).</li>
<li><b>Des index locaux</b> &#8211; La construction des index locaux est plus rapide qu&rsquo;avec des indexes globaux.</li>
<li><b>Compression</b> &#8211; Peut être appliqué au niveau du segment donc il est possible d&rsquo;avoir un mélange partitions compressées et non compressées.</li>
<li><b>Move, Rebuild, Truncate et Drop</b> &#8211; Chaque partition (ou sous-partition) est un segment et peut faire l&rsquo;objet d&rsquo;une opération de maintenance de manière isolée et indépendante des autres partitions de la table.</li>
<li><b>Cycle de vie des données (<i>ILM</i>)</b> &#8211; Le partitionnement permet d&rsquo;implémenter une stratégie de gestion du cycle de vie des données (archivage, purge, &#8230;)</li>
</ul>
<p><b>Résumé</b></p>
<p>Pour les raisons décrites ci-dessus, aussi bien de performance que de maintenabilité, je dirais que le partitionnement est une fonctionnalité indispensable pour un datawarehouse sous Oracle. Le partitionnement devrait permettre de réduire le temps de réponse des requêtes, ainsi que l&rsquo;utilisation des ressources, pour faire des accès aux données plus intelligents (en n&rsquo;allant voir que les données dont la requête a besoin). Il existe d&rsquo;autres cas d&rsquo;utilisation du partitionnement, et ils sont expliqués dans la documentation Oracle, avec des exemples.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
