<?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>Le blog de SQLpro &#187; comparaison</title>
	<atom:link href="https://blog.developpez.com/sqlpro/ptag/comparaison/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/sqlpro</link>
	<description>Le SQL pour SQL Server, PostGreSQL et tous les autres SGBDR</description>
	<lastBuildDate>Thu, 15 Oct 2020 12:59:17 +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>Modèle générique vs modèle spécifique</title>
		<link>https://blog.developpez.com/sqlpro/p13183/langage-sql-norme/modele-generique-vs-modele-specifique</link>
		<comments>https://blog.developpez.com/sqlpro/p13183/langage-sql-norme/modele-generique-vs-modele-specifique#comments</comments>
		<pubDate>Fri, 10 Aug 2018 08:04:43 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[bases de données]]></category>
		<category><![CDATA[Langage SQL (norme)]]></category>
		<category><![CDATA[Modélisation des donées]]></category>
		<category><![CDATA[comparaison]]></category>
		<category><![CDATA[enfant]]></category>
		<category><![CDATA[facilité]]></category>
		<category><![CDATA[famille]]></category>
		<category><![CDATA[générique]]></category>
		<category><![CDATA[héritage]]></category>
		<category><![CDATA[modélisation]]></category>
		<category><![CDATA[parent]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[qualité]]></category>
		<category><![CDATA[spécifique]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/sqlpro/?p=842</guid>
		<description><![CDATA[Dans le cadre d&#8217;un héritage de données ayant de multiples enfants aux caractéristiques très diverses, est-il préférable de concevoir un modèle de données générique ou un modèle de données spécifique ? De nombreux jeunes développeurs pensent naïvement qu&#8217;un modèle générique est plus facile&#8230; Mais c&#8217;est souvent une erreur qu&#8217;il faudra payer au prix fort une [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans le cadre d&rsquo;un héritage de données ayant de multiples enfants aux caractéristiques très diverses, est-il préférable de concevoir un modèle de données générique ou un modèle de données spécifique ? De nombreux jeunes développeurs pensent naïvement qu&rsquo;un modèle générique est plus facile&#8230; Mais c&rsquo;est souvent une erreur qu&rsquo;il faudra payer au prix fort une fois l&rsquo;application fonctionnelle. Démonstration&#8230;<br />
<span id="more-842"></span><br />
Je suis partit initialement de ce post :</p>
<p><a href="https://www.developpez.net/forums/d1881400/bases-donnees/langage-sql/avis-l-architecture-base-donnees-choix-l-option/" rel="noopener" target="_blank">Avis sur l&rsquo;architecture de ma base de données (choix de l&rsquo;option)</a></p>
<p>La demande étant la suivante :</p>
<p><em>J&rsquo;ai 30 familles de critères. Chaque famille comporte un nombre variable de critères pour un total d&rsquo;environ 600 critères.<br />
Chaque critère appartient à une seule famille de sorte que les 600 sont à répartir dans les 30 familles.<br />
Ma question:<br />
&#8211; devrais-je créer <strong>une table par famille</strong> et insérer dans chaque table les critères qui lui appartiennent; (solution 1)<br />
ou alors:<br />
&#8211; créer <strong>une table contenant les 30 familles et une autre contenant les 600 critères</strong>. Ensuite, créer les relations qui lient chaque famille à ses critères et/ou inversement. (solution 2)</em></p>
<p>et ma réponse :</p>
<p><em>Pour qu&rsquo;une base réponde bien en terme de performances, on doit tout faire pour minimiser les IO.<br />
&#8211; Dans votre solution 1, les performances seront bonne si la plupart des requêtes portent sur plusieurs critères d&rsquo;une même famille<br />
&#8211; Dans votre solution 2, les performances seront bonne si la plupart des requêtes portent sur un seul critère.</em></p>
<p>Cependant un jeune internaute peu avisé, affirmait avec force que :</p>
<p><em>pour moi la solution 2 est la + simple à mettre en place.<br />
et le nombre d&rsquo;enregistrements ne justifie pas la solution 1..<br />
tout dépend de votre SGBD (pas précisé..), mais dans tous les cas, il suffit de mettre des ID numérique pour que les requêtes soient optimisées. Créez vos tables avec des id uniques (sous Oracle on peux utiliser les séquences) et vous aurez des traitements optimisées au mieux&#8230; mais bon, je vous rassure, sous Oracle, même avec des clefs en Varchar, pour 600 enregistrements, y a aucun pb..<br />
si je vois bien, vous aurez donc 3 tables avec les clef suivante :<br />
&#8211; FAMILLE (Pk : ID_FAMILLE)<br />
&#8211; FAMILLE_CRITERE (Pk : ID_FAMILLE, ID_CRITERE)<br />
&#8211; CRITERE (Pk : ID_CRITERE)<br />
Relations :<br />
¤ Famille &#8211;&gt; FAMILLE_CRITERES &lt;&#8212; CRITERE<br />
famille_critere ne contenant que le couple ID_FAMILLE, ID_CRITERE (on parle de table intermédiaire)  </em></p>
<p>Ce à quoi je répondais :</p>
<p><em>La solution 2 est correcte si vous ne requêtez JAMAIS plus d&rsquo;un critère à la fois. Elle est déjà moins performante à l’insertion/la mise à jour des données&#8230;<br />
La solution 2 est imbécile, complexe et peu performantes si vous avez plusieurs critères a rechercher&#8230;<br />
En sus, elle ne permet pas facilement de typer les informations, donc, vous aurez beaucoup de problématique de contrôle de qualité&#8230; et des performances catastrophiques</em></p>
<p><strong>DÉMONSTRATION</strong></p>
<p><strong>Partons d&rsquo;une table d&rsquo;animaux :</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> T_ANIMAL_ANM<br />
<span style="color: #66cc66;">&#40;</span>ANM_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span><br />
&nbsp;ANM_DATA &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">CHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">8000</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">GO</span><br />
<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_ANIMAL_ANM <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Mytilus Edulis'</span><span style="color: #66cc66;">&#41;</span></div></div>
<p><strong></strong><br />
<strong>█ █ █ 1ere solution : une seule table pour toute une même famille :</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> T_MOLUSQUE_MSQ<br />
<span style="color: #66cc66;">&#40;</span>ANM_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> T_ANIMAL_ANM <span style="color: #66cc66;">&#40;</span>ANM_ID<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp;MSQ_CARAPACE &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp;MSQ_SYMETRIE &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp;MSQ_COULEUR &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">32</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp;MSQ_DIAMETRE_MM &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">FLOAT</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p><strong></strong><br />
<strong>█ █ █ 2e solution (pour toutes familles), des tables &laquo;&nbsp;génériques&nbsp;&raquo; :</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> T_CARATERISTIQUE_CRT<br />
<span style="color: #66cc66;">&#40;</span>CRT_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span><span style="color: #66cc66;">,</span><br />
&nbsp;CRT_LIBELLE &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">256</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> T_VALEUR_VLR<br />
<span style="color: #66cc66;">&#40;</span>ANM_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> T_ANIMAL_ANM <span style="color: #66cc66;">&#40;</span>ANM_ID<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp;CRT_ID &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">INT</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">REFERENCES</span> T_CARATERISTIQUE_CRT<span style="color: #66cc66;">&#40;</span>CRT_ID<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp;VLR_VALEUR &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">VARCHAR</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">256</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span><br />
&nbsp;<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span>ANM_ID<span style="color: #66cc66;">,</span> CRT_ID<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Ajoutons les caractéristiques identiques à celle de la solution 1</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_CARATERISTIQUE_CRT <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">111</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Carapace'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_CARATERISTIQUE_CRT <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">222</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Symétrie'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_CARATERISTIQUE_CRT <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">333</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Couleur'</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_CARATERISTIQUE_CRT <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">444</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Diamètre mm'</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p><strong></strong><br />
<strong>█ █ █ Voici maintenant les insertions :</strong></p>
<p><strong>Pour la solution 1 :</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_MOLUSQUE_MSQ <span style="color: #66cc66;">&#40;</span>ANM_ID<span style="color: #66cc66;">,</span> MSQ_CARAPACE<span style="color: #66cc66;">,</span> MSQ_SYMETRIE<span style="color: #66cc66;">,</span> MSQ_COULEUR<span style="color: #66cc66;">,</span> MSQ_DIAMETRE_MM<span style="color: #66cc66;">&#41;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'Creatine'</span><span style="color: #66cc66;">,</span> &nbsp; <span style="color: #ff0000;">'Mono'</span><span style="color: #66cc66;">,</span> &nbsp; &nbsp; &nbsp; <span style="color: #ff0000;">'Bleu'</span><span style="color: #66cc66;">,</span> &nbsp; &nbsp; &nbsp;<span style="color: #ff0000;">'82.5'</span><span style="color: #66cc66;">&#41;</span></div></div>
<p>Notez que nous n&rsquo;avons fait qu&rsquo;<strong>une seule requête</strong> d&rsquo;insertion avec correspondance caractéristique / valeur et typage des données</p>
<p><strong>Pour la solution 2 :</strong></p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_VALEUR_VLR <br />
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> CRT_ID<span style="color: #66cc66;">,</span> &nbsp; &nbsp;<span style="color: #ff0000;">'Creatine'</span> <span style="color: #993333; font-weight: bold;">FROM</span> T_CARATERISTIQUE_CRT <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;CRT_LIBELLE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Carapace'</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_VALEUR_VLR <br />
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> CRT_ID<span style="color: #66cc66;">,</span> &nbsp; &nbsp;<span style="color: #ff0000;">'Mono'</span> &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> T_CARATERISTIQUE_CRT <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;CRT_LIBELLE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Symétrie'</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_VALEUR_VLR <br />
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> CRT_ID<span style="color: #66cc66;">,</span> &nbsp; &nbsp;<span style="color: #ff0000;">'Bleu'</span> &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> T_CARATERISTIQUE_CRT <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;CRT_LIBELLE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Couleur'</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> T_VALEUR_VLR <br />
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">,</span> CRT_ID<span style="color: #66cc66;">,</span> &nbsp; &nbsp;<span style="color: #ff0000;">'82,5'</span> &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">FROM</span> T_CARATERISTIQUE_CRT <br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;CRT_LIBELLE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Diamètre mm'</span>;</div></div>
<p>Pour stocker les mêmes informations, nous avons fait <strong>4 requêtes</strong> au lieu d&rsquo;une seule&#8230;.</p>
<p><strong>█ Comparons maintenant le coût des 2 solutions au niveau de l&rsquo;insertion :</strong></p>
<p><a href="http://blog.developpez.com/sqlpro/files/2018/08/Requetes-insertion-comparaison-couts.jpg"><img src="http://blog.developpez.com/sqlpro/files/2018/08/Requetes-insertion-comparaison-couts.jpg" alt="Comparaison des plans de requêtes pour l&#039;insertion" width="1190" height="897" class="alignnone size-full wp-image-857" /></a></p>
<p>Y&rsquo;a pas à tortiller 4 requêtes coutant deux fois plus cher qu&rsquo;une seule et unique requête cela est donc <strong>8 fois plus couteux</strong>&#8230;</p>
<p><strong>█ █ █ Voyons maintenant la facilité de requêtage :</strong></p>
<p>interrogation multicritères ET avec solution 1</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span><br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp; T_ANIMAL_ANM <span style="color: #993333; font-weight: bold;">AS</span> A<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_MOLUSQUE_MSQ <span style="color: #993333; font-weight: bold;">AS</span> M<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> A<span style="color: #66cc66;">.</span>ANM_ID <span style="color: #66cc66;">=</span> M<span style="color: #66cc66;">.</span>ANM_ID<br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;MSQ_CARAPACE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Creatine'</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;MSQ_SYMETRIE <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Mono'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Double'</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;MSQ_COULEUR <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'Bleu%'</span> <span style="color: #808080; font-style: italic;">--&gt; peut être Bleue, Bleu-marine...</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;MSQ_DIAMETRE_MM <span style="color: #993333; font-weight: bold;">BETWEEN</span> <span style="color: #cc66cc;">75</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #cc66cc;">92</span>;</div></div>
<p>la requête fait <strong>8 lignes et 1 jointure</strong>. Elle en fera une de plus pour chaque critère supplémentaire avec juste quelques chose à rajouter à la clause WHERE&#8230;</p>
<p>interrogation multicritères ET avec solution 2</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span><br />
<span style="color: #993333; font-weight: bold;">FROM</span> &nbsp; T_ANIMAL_ANM <span style="color: #993333; font-weight: bold;">AS</span> A<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_VALEUR_VLR <span style="color: #993333; font-weight: bold;">AS</span> V1 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> A<span style="color: #66cc66;">.</span>ANM_ID <span style="color: #66cc66;">=</span> V1<span style="color: #66cc66;">.</span>ANM_ID<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_CARATERISTIQUE_CRT <span style="color: #993333; font-weight: bold;">AS</span> C1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> V1<span style="color: #66cc66;">.</span>CRT_ID <span style="color: #66cc66;">=</span> C1<span style="color: #66cc66;">.</span>CRT_ID<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_VALEUR_VLR <span style="color: #993333; font-weight: bold;">AS</span> V2 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> A<span style="color: #66cc66;">.</span>ANM_ID <span style="color: #66cc66;">=</span> V2<span style="color: #66cc66;">.</span>ANM_ID<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_CARATERISTIQUE_CRT <span style="color: #993333; font-weight: bold;">AS</span> C2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> V2<span style="color: #66cc66;">.</span>CRT_ID <span style="color: #66cc66;">=</span> C2<span style="color: #66cc66;">.</span>CRT_ID<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_VALEUR_VLR <span style="color: #993333; font-weight: bold;">AS</span> V3 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> A<span style="color: #66cc66;">.</span>ANM_ID <span style="color: #66cc66;">=</span> V3<span style="color: #66cc66;">.</span>ANM_ID<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_CARATERISTIQUE_CRT <span style="color: #993333; font-weight: bold;">AS</span> C3<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> V3<span style="color: #66cc66;">.</span>CRT_ID <span style="color: #66cc66;">=</span> C3<span style="color: #66cc66;">.</span>CRT_ID<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_VALEUR_VLR <span style="color: #993333; font-weight: bold;">AS</span> V4 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> A<span style="color: #66cc66;">.</span>ANM_ID <span style="color: #66cc66;">=</span> V4<span style="color: #66cc66;">.</span>ANM_ID<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #993333; font-weight: bold;">JOIN</span> T_CARATERISTIQUE_CRT <span style="color: #993333; font-weight: bold;">AS</span> C4<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #993333; font-weight: bold;">ON</span> V4<span style="color: #66cc66;">.</span>CRT_ID <span style="color: #66cc66;">=</span> C4<span style="color: #66cc66;">.</span>CRT_ID<br />
<span style="color: #993333; font-weight: bold;">WHERE</span> &nbsp;C1<span style="color: #66cc66;">.</span>CRT_LIBELLE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Carapace'</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;V1<span style="color: #66cc66;">.</span>VLR_VALEUR <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Creatine'</span> <br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;C2<span style="color: #66cc66;">.</span>CRT_LIBELLE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Symétrie'</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;V2<span style="color: #66cc66;">.</span>VLR_VALEUR <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'Mono'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'Double'</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;C3<span style="color: #66cc66;">.</span>CRT_LIBELLE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Couleur'</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;V3<span style="color: #66cc66;">.</span>VLR_VALEUR <span style="color: #993333; font-weight: bold;">LIKE</span> <span style="color: #ff0000;">'Bleu%'</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;C4<span style="color: #66cc66;">.</span>CRT_LIBELLE <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'Diamètre mm'</span><br />
&nbsp; <span style="color: #993333; font-weight: bold;">AND</span> &nbsp;V4<span style="color: #66cc66;">.</span>VLR_VALEUR <span style="color: #993333; font-weight: bold;">BETWEEN</span> <span style="color: #ff0000;">'75'</span> <span style="color: #993333; font-weight: bold;">AND</span> <span style="color: #ff0000;">'92'</span></div></div>
<p>La requête fait <strong>26 lignes avec 8 jointures</strong>&#8230; Il faudra rajouter 6 lignes à chaque critère supplémentaire, dont 4 dans la clause FROM et 2 dans le WHERE, et encore, on ne sait pas dans la clause SELECT à quelle caractéristique se réfère chacune des valeurs&#8230; Il faudrait aussi customiser la clause SELECT&#8230;</p>
<p>Y&rsquo;a pas à tortiller la solution 1 est bien plus simple en matière d’écriture&#8230;</p>
<p><strong>█ Quelles sont les performances des requêtes de recherches des deux solutions ?</strong></p>
<p><a href="http://blog.developpez.com/sqlpro/files/2018/08/Requetes-selection-comparaison-couts.jpg"><img src="http://blog.developpez.com/sqlpro/files/2018/08/Requetes-selection-comparaison-couts.jpg" alt="Comparaison des plans de requêtes pour l&#039;extraction" width="2251" height="389" class="alignnone size-full wp-image-859" /></a></p>
<p><strong>Évidemment la première solution est 4,5 fois moins couteuse&#8230;</strong></p>
<p>Mais il y a pire&#8230; J&rsquo;ai du mettre des chiffres en chaine de caractères pour le diamètre (AND  V4.VLR_VALEUR BETWEEN &rsquo;75&rsquo; AND &rsquo;92&rsquo;). Si je tente de les typer en entier ou réel (AND  V4.VLR_VALEUR BETWEEN 75 AND 92), cela provoque une erreur d&rsquo;exécution (SQL Server) :<br />
<em>Msg*245, Niveau*16, État*1, Ligne*75<br />
Échec de la conversion de la valeur varchar &lsquo;Creatine&rsquo; en type de données int.</em><br />
Logique car pour effectuer une comparaison avec une valeur numérique, il faut convertir la colonne en numérique, mais comme il y a autres chose que de purs nombres (chaines de caractères) cela se passe mal.<br />
Bref certaines requêtes seront impossible à faire !</p>
<p>Plus catastrophique encore&#8230; mettre des index ne servira quasiment à rien ! En effet un index sur une chaine de caractères n’ordonne pas les valeurs de la même façon que s&rsquo;il s&rsquo;agissait de nombre&#8230;</p>
<p>En sus rien n&rsquo;interdira à quelqu’un de saisir 8,2 au lieu de 8.2 (une virgule au lieu d&rsquo;une point) comme diamètre, dans ce modèle inepte, alors qu&rsquo;avec le bon modèle les types sont respectés&#8230;. Si tel était le cas, la valeur ne pourra pas être retrouvée !!! Il existe bien évidemment une solution pour contourner, un tout petit peu, ce modèle pourri, pour le typage. Il consiste à rajouter autant de tables de valeurs que de type&#8230; Mais il n&rsquo;est pas possible de rajouter des contraintes spécifique à chaque type (par exemple vérifier qu&rsquo;une pourcentage est bien entre 0 et 100 &#8211; notion de domaine SQL), ni, bien entendu, de rajouter des contraintes multicritères (une valeur dépendant d&rsquo;une autre) comme c&rsquo;est le cas par exemple de la chronologie des temporels de type &laquo;&nbsp;début&nbsp;&raquo; et &laquo;&nbsp;fin&nbsp;&raquo;.<br />
Et dans tous les cas, les requêtes seront encore plus complexes à élaborer et les performances encore plus lamentables&#8230;</p>
<p><strong>En guise de conclusion</strong></p>
<p>Nous vous avons démontré les performances lamentable et la complexité horrifiante d&rsquo;un tel modèle&#8230;.</p>
<li>Complexité d&rsquo;insertion des données</li>
<li>Mauvaise performances à l&rsquo;insertion des données</li>
<li>Complexité d&rsquo;écriture des recherches</li>
<li>Mauvaise performances pour la recherches de données</li>
<li>Impossibilité de typer finement (notion de domaine)</li>
<li>Impossibilité de placer des contraintes multicritères</li>
<li>Difficultés pour l&rsquo;indexation</li>
<p><strong></strong><br />
<strong></strong></p>
<p>Mais comment se fait-il que des internautes osent affirmer de pareilles stupidités ?</p>
<p>Il est amusant de voir que certains développeur incultes affirment n&rsquo;importe quoi, par ignorance, ou par bêtise, ne prenant même pas la peine de tester ce qu&rsquo;ils disent&#8230; Ensuite ces mêmes développeurs, sans aucune expérience, iront vous raconter que les SGBDR c&rsquo;est pas performant&#8230; Ils vous vendrons alors du NoSQL, ce qui, dans beaucoup de cas, sera pire encore !</p>
<p>Comme disent les américains : &laquo;&nbsp;garbage in, garbage out&nbsp;&raquo; qui peut se traduire si tu fais de la merde en entrée, tu auras de la merde en sortie ! Autrement dit, si le modèle de données est inepte, la qualité des données sera pourrie et les performances lamentables&#8230;</p>
<p><strong>Décortiquons d&rsquo;ailleurs les affirmations de l&rsquo;internate que nous avons cité :</strong><br />
&laquo;&nbsp;<em>tout dépend de votre SGBD (pas précisé..), mais dans tous les cas, il suffit de mettre des ID numérique pour que les requêtes soient optimisées. Créez vos tables avec des id uniques (sous Oracle on peux utiliser les séquences) et vous aurez des traitements optimisées au mieux&#8230; mais bon, je vous rassure, sous Oracle, même avec des clefs en Varchar, pour 600 enregistrements, y a aucun pb..</em>&nbsp;&raquo;</p>
<p><strong>Première affirmation stupide</strong> : &laquo;&nbsp;<em>tout dépend de votre SGBD (pas précisé..)</em>&nbsp;&raquo;<br />
Comme nous sommes dans un forum sur les SGBDR, sachez cher monsieur, que tout les SGBDR fonctionnent de la même façon. Certains allant plus vite que d&rsquo;autre (une Ferrari va généralement plus vite qu&rsquo;une Peugeot), certains avec plus de qualité que d&rsquo;autres (une Rolls-Royce est généralement de meilleure qualité qu&rsquo;une Dacia).</p>
<p><strong>Seconde affirmation stupide</strong> : &laquo;&nbsp;<em>il suffit de mettre des ID numérique pour que les requêtes soient optimisées</em>&nbsp;&raquo;<br />
Si c&rsquo;était le cas alors, pas besoin d&rsquo;index ni de contraintes&#8230; On se demande donc pourquoi les éditeurs de SGBDR font de tels effort en R&amp;D pour trouver de nouvelles formes d&rsquo;index toujours plus performant&#8230;  Et la plupart des informaticiens ignorent que les contraintes permettent de mieux optimiser les plans de requête&#8230; Hélas ceci est très rarement enseigné par les professeurs des universités et encore moins ceux des écoles d&rsquo;ingénieurs&#8230; (je le sais pertinemment puisque j&rsquo;en étais un&#8230;).</p>
<p><strong>Troisième affirmation stupide</strong> : &laquo;&nbsp;<em>mais bon, je vous rassure, sous Oracle, même avec des clefs en Varchar</em>&nbsp;&raquo;<br />
Et bien, non, plus une clef est longue en nombre d&rsquo;octets, plus ses performances décroissent. Pour avoir la même longueur qu&rsquo;un entier auto incrémenté il faudrait se limiter à 4 caractères&#8230; En sus certaines phénomènes apparaissent avec des clefs non numériques et en particulier pour des clefs littérales :
<li>distribution peu aléatoire (parce que concentrées sur les 26 lettres et 10 chiffres parmi les 256 caractères disponibles) induisant des statistiques d&rsquo;optimisation mal réparties (histogrammes erratiques)</li>
<li>extra-overhead lié à la gestion de la collation (sensibilité ou non à la casse, aux accents&#8230;)</li>
<li>façon de stocker physiquement les VARCHAR induisant des octets suplementaires et de la fragmentaion en cas d&rsquo;UPDATE</li>
<p><strong></strong><br />
<strong></strong></p>
<p><strong>Quatrième affirmation stupide</strong> : &laquo;&nbsp;<em>sous Oracle, même avec des clefs en Varchar, pour 600 enregistrements, y a aucun pb..</em>&nbsp;&raquo;<br />
Nous avons déjà dit précédemment que les clef littérales (VARCHAR) étaient une plaie&#8230; Mais ce qui ne va pas dans cette phrase est le terme &laquo;&nbsp;<strong>enregistrement</strong>&laquo;&nbsp;&#8230; Cet internaute sait-il au moins que les SGBDR ne travaillent pas avec des &laquo;&nbsp;enregistrement&nbsp;&raquo; propre aux bases de données de type &laquo;&nbsp;fichier&nbsp;&raquo; comme c&rsquo;était las cas dans les années 50 à 70 ? Les SGBDR structurent les lignes des tables dans des pages qui sont modifiées en mémoire et non pas directement sur le disque (notion physique d&rsquo;enregistrement). Les pages étant physiquement écrites de temps à autres quand il y en a suffisamment à écrire par un processus asynchrone travaillant en tâche de fond.</p>
<p>Bref voici q&rsquo;un internaute ne connaissant ni la modélisation des données ni les technologies des SGDB, vient donner des conseils stupides hélas parfois repris dans certaines applications&#8230;.</p>
<p><strong></strong><br />
<strong></strong></p>
<p><strong>CQFD</strong></p>
<p><strong></strong><br />
<strong></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">Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES<br />
Expert &nbsp;S.G.B.D &nbsp;relationnelles &nbsp; et &nbsp; langage &nbsp;S.Q.L<br />
Moste &nbsp;Valuable &nbsp;Professionnal &nbsp;Microsoft &nbsp;SQL Server<br />
Société SQLspot &nbsp;: &nbsp;modélisation, conseil, formation,<br />
optimisation, &nbsp;audit, &nbsp;tuning, &nbsp;administration &nbsp;SGBDR<br />
Enseignant: CNAM PACA, ISEN Toulon, CESI Aix en Prov.</div></div>
<p>L&rsquo;entreprise <a href="http://www.sqlspot.com">SQL Spot</a><br />
<strong>Le site web sur le </strong><a href="http://sqlpro.developpez.com/">SQL et les SGBDR</a></p>
<p><img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL
Server" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Oracle vs SQL Server : les options payantes qui font la différence&#8230;</title>
		<link>https://blog.developpez.com/sqlpro/p13001/ms-sql-server/oracle-vs-sql-server-les-options-payantes-qui-font-la-difference</link>
		<comments>https://blog.developpez.com/sqlpro/p13001/ms-sql-server/oracle-vs-sql-server-les-options-payantes-qui-font-la-difference#comments</comments>
		<pubDate>Fri, 26 Feb 2016 09:06:50 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[cloud]]></category>
		<category><![CDATA[comparaison]]></category>
		<category><![CDATA[fiabilité]]></category>
		<category><![CDATA[fonctionnalité]]></category>
		<category><![CDATA[Option]]></category>
		<category><![CDATA[prix]]></category>
		<category><![CDATA[securité]]></category>
		<category><![CDATA[SQL server]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/sqlpro/?p=644</guid>
		<description><![CDATA[Le monde des utilisateurs de bases de données d&#8217;Oracle commence à se faire du soucis, car la firme ayant besoin d&#8217;argent (le cours de son action baisse inexorablement depuis de nombreux mois) elle cherche par tous les moyens à racler les fonds de tiroir auprès de ses clients. L&#8217;une de ses stratégies consiste à jouer [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le monde des utilisateurs de bases de données d&rsquo;Oracle commence à se faire du soucis, car la firme ayant besoin d&rsquo;argent (le cours de son action baisse inexorablement depuis de nombreux mois) elle cherche par tous les moyens à racler les fonds de tiroir auprès de ses clients. L&rsquo;une de ses stratégies consiste à jouer sur les options payantes&#8230; Or il se trouve que chez SQL Server le concept d&rsquo;option payantes n&rsquo;existe pas&#8230; Cet article fait le point sur la pratique agressive d&rsquo;Oracle et compare les tarifs appliqués à Oracle à son principal adversaire, SQL Server de Microsoft.<br />
<span id="more-644"></span><br />
<strong>1 &#8211; Le problème</strong><br />
Dans un article de <a href="http://uk.businessinsider.com/oracle-customer-explains-audit-threats-2015-9?r=US&amp;IR=T" title="'I felt like we were being extorted': Customer says Oracle tried to strong-arm him into a cloud sale" target="_blank">&laquo;&nbsp;Business Insider&nbsp;&raquo; </a>, un client se plaignait qu&rsquo;Oracle menaçait de lui faire payer des sommes exorbitantes sauf s&rsquo;il se décidait a aller dans le cloud d&rsquo;Oracle. Pour arriver à faire cracher un volume exorbitant de licences, Oracle utilise une technique particulièrement tordue qui consiste à faire payer de nombreuses options, même si elles n&rsquo;ont jamais été utilisées en production&#8230;<br />
Explication :<br />
La base de données Oracle est dotée de nombreuses options, autrefois toutes payantes. Au fil du temps et des versions, certaines options sont devenues des fonctionnalités gratuites, sans que développeurs ni dba ne sachent vraiment lesquelles le sont et, celles qui ne le sont pas. Dans la pratique certains utilisateurs activent soit volontairement pour test, soit par inadvertance, des fonctionnalités dont quelques unes sont payantes. Malheureusement ceci est tracé et l&rsquo;activation d&rsquo;une telle fonctionnalité ouvre immédiatement droit au paiement supplémentaire même si on ne l&rsquo;utilise pas, Oracle arguant qu&rsquo;il ne lui est pas possible rétrospectivement de savoir si la fonctionnalité a été réellement utilisée, simplement testée voir même totalement inutilisée. De plus, au moment de l&rsquo;activation d&rsquo;une fonctionnalité payante, aucun message préventif n&rsquo;indique que l&rsquo;option fera l&rsquo;objet d&rsquo;une licence complémentaire ouvrant droit à subsides au profit d&rsquo;Oracle.<br />
Une fois le temps de l&rsquo;audit venu, Oracle n&rsquo;a plus qu&rsquo;a interroger les traces indélébiles de l&rsquo;activation de ces options et envoyer la note !</p>
<p><strong>2 &#8211; Pourquoi ?</strong><br />
Nous avons dit que la firme Oracle a besoin d&rsquo;argent&#8230; Il suffit de regarder les cours de bourse d&rsquo;Oracle pour constater son inexorable déclin. Dans le même temps, comparer ceux de son principal challenger Microsoft&#8230;<br />
<a href="http://blog.developpez.com/sqlpro/files/2016/02/Cours-action-Oracle-2015-2016.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/Cours-action-Oracle-2015-2016.jpg" alt="Cours action Oracle 2015 2016" width="314" height="214" class="alignnone size-full wp-image-645" /></a><a href="http://blog.developpez.com/sqlpro/files/2016/02/Cours-action-Microsoft-2015-2016.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/Cours-action-Microsoft-2015-2016.jpg" alt="Cours action Microsoft 2015 2016" width="316" height="214" class="alignnone size-full wp-image-646" /></a><br />
Comment Oracle en est-il arrivé là ? Il n&rsquo;y a pas que le prix exorbitant des licences qui font reculer les clients&#8230; D&rsquo;autres éléments clefs font rétrécir la part de marché d&rsquo;Oracle. Cela a commencé il y a plus de 10 ans, lorsqu&rsquo;est sortit la version 2005 de SQL Server de Microsoft. À l&rsquo;époque, Oracle se croyait &laquo;&nbsp;unbreakable&nbsp;&raquo;. Hélas plusieurs analystes montraient que sur le plan de la sécurité Oracle était bien moins bonne que celle de SQL Server, avec des bogues récurrents et un temps de correction anormalement lent (voir notamment <a href="https://www.nccgroup.trust/globalassets/our-research/uk/whitepapers/which_database_is_more_secure._oracle_vs_microsoft.pdf" title="Which database is more secure? Oracle vs. Microsoft" target="_blank">l&rsquo;étude de David Litchfield</a> de 2006). Sécurité qui ne s&rsquo;est pas améliorée hélas au fil du temps ou les comparaisons basées sur les failles (CVE : Common Vulnerabilities and Exposures) recensées par le NIST (National Institute of Standards and Technology) donne un avantage de plus en plus grand à SQL Server au détriment d&rsquo;Oracle sur le plan des failles de sécurité ! (voire <a href="http://www.theedison.com/pdf/Samples_MS_SQL_Server_2012_WP.pdf" title="Etude Edison comparatif oracle SQL Server" target="_blank">l&rsquo;étude Edison</a> de 2013)<br />
<div id="attachment_648" style="width: 540px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2016/02/Etude-Litchfield-comparatif-de-sécurité-entre-Oracle-et-SQL-Server-de-2000-à-2006.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/Etude-Litchfield-comparatif-de-sécurité-entre-Oracle-et-SQL-Server-de-2000-à-2006.jpg" alt="Etude Litchfield - comparatif de sécurité entre Oracle et SQL Server de 2000 à 2006" width="1060" height="880" class="size-full wp-image-648" /></a><p class="wp-caption-text">Etude Litchfield &#8211; comparatif de sécurité entre Oracle et SQL Server de 2000 à 2006</p></div><br />
<div id="attachment_651" style="width: 510px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2016/02/Etude-Edison-CVE-NIST-historique-vulnérabilités-Oracle-vs-SQL-Server.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/Etude-Edison-CVE-NIST-historique-vulnérabilités-Oracle-vs-SQL-Server.jpg" alt="Etude Edison - CVE NIST historique des vulnérabilités Oracle vs SQL Server" width="715" height="473" class="size-full wp-image-651" /></a><p class="wp-caption-text">Etude Edison &#8211; CVE NIST historique des vulnérabilités Oracle vs SQL Server</p></div><br />
Enfin, les enquêtes de satisfaction donnent un réel avantage à SQL Server (voir les enquêtes &laquo;&nbsp;<a href="http://reports.informationweek.com/abstract/81/12155/Business-Intelligence-and-Information-Management/Research:-2014-State-of-Database-Technology.html?download=true&amp;fwp=true#error" title="State on Database Technology 2014 - InformationWeek" target="_blank">State on Database Technology</a>&nbsp;&raquo; d&rsquo;Information Week ou encore les différentes <a href="http://itic-corp.com/blog/2011/02/itic-reliabiity-survey-oracle-users-anxiousangry-over-service-support-slippage/" title="ITIC Reliabiity Survey: Oracle Users Anxious/Angry Over Service, Support Slippage" target="_blank">études ITC</a>).<br />
<div id="attachment_654" style="width: 560px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2016/02/InformationWeek-State-of-Database-Technologie-Mission-Critical.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/InformationWeek-State-of-Database-Technologie-Mission-Critical.jpg" alt="Bases de données les plus utilisées pour les missions critiques (source Information Week - State of Database Technologie 2016)" width="790" height="500" class="size-full wp-image-654" /></a><p class="wp-caption-text">Bases de données les plus utilisées pour les missions critiques (source Information Week &#8211; State of Database Technologie 2016)</p></div><br />
Quant au cout global d&rsquo;utilisation, il est depuis bien longtemps en faveur de SQL Server (simplicité des commandes, facilité de l&rsquo;IHM, documentation exceptionnelle&#8230;) malgré les nombreux papiers dont Oracle inonde le web afin de tenter de prouver le contraire ! Il suffit de demander à des dba ayant la double casquette ce qu&rsquo;ils en pense&#8230; (voire par exemple <a href="http://thuvienso.edu.vn/microsoft-sql-server-and-oracle-database-a-comparative-study-on-total-cost-of-administration-tca/" title="Microsoft SQL Server and Oracle Database: A Comparative Study on Total Cost of Administration (TCA)" target="_blank">l&rsquo;étude Alinean</a> de 2015).</p>
<p>Outre ces éléments il y a un facteur majeur qui rentre en ligne de compte sur le long terme. <strong>Le cloud</strong> (infonuagique) !&#8230; Larry Ellison y a longtemps été peu favorable et indécis. Le résultat est sans appel. Microsoft y existe et s&rsquo;en trouve être un des leader derrière Amazon. Oracle n&rsquo;existe pas sur ce marché. Les enquêtes du Gartner Group (Magic Quadrant pour le cloud) le montre bien&#8230;<br />
<div id="attachment_657" style="width: 529px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2016/02/Gartner-2014-MQ-CLOUD.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/Gartner-2014-MQ-CLOUD.jpg" alt="Gartner Magic Quadrant 2014 for Cloud Infrastructure as a Service" width="519" height="524" class="size-full wp-image-657" /></a><p class="wp-caption-text">Gartner Magic Quadrant 2014 for Cloud Infrastructure as a Service</p></div><div id="attachment_658" style="width: 526px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2016/02/Gartner-2015-MQ-CLOUD.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/Gartner-2015-MQ-CLOUD.jpg" alt="Gartner Magic Quadrant 2015 for Cloud Infrastructure as a Service" width="516" height="520" class="size-full wp-image-658" /></a><p class="wp-caption-text">Gartner Magic Quadrant 2015 for Cloud Infrastructure as a Service</p></div></p>
<p><strong>2 &#8211; Des pratiques scandaleuses</strong><br />
Dans l&rsquo;article de Business Insider une pratique s&rsquo;apparente à du chantage. Oracle consent à réduire l&rsquo;addition, si le client passe dans le cloud. Or nous venons de le voir, les clients sont loin de se précipiter dans l&rsquo;infonuagique à la sauce Oracle, lui préférant de loin Amazon lorsqu&rsquo;ils restent Oracleur ou Azure lorsqu&rsquo;ils passent à SQL Server.<br />
Un autre article (&laquo;&nbsp;<a href="http://www.lemondeinformatique.fr/actualites/lire-comment-se-deroule-un-audit-logiciel-avec-oracle-tres-mal-chez-mars-63664.html" title="Comment se déroule un audit logiciel avec Oracle" target="_blank">Comment se déroule un audit logiciel avec Oracle&#8230;</a>&nbsp;&raquo; du Monde Informatique) montrent à quel point les pratiques d&rsquo;Oracle sont scandaleuses et frisent le hors la Loi&#8230; &laquo;&nbsp;<em>Oracle réclame des informations qu’elle n’est pas supposée demander contractuellement sur les serveurs sur lesquels ne tournent pas de logiciel Oracle et sur le personnel de Mars qui n’utilise pas les logiciels d’Oracle</em>&laquo;&nbsp;. Imaginez quelles sont les implications d&rsquo;une telle intrusion dans vos serveurs ou auprès de vos employés !<br />
D’où les conseils distillés par certains juriste et économistes, d&rsquo;intégrer les risques de coûts associés aux audits d&rsquo;Oracle comme charges supplémentaire aux offres commerciales, ce qui a pour effet de gonfler la note finale d’acquisition des licences Oracle !</p>
<p><strong>3 &#8211; les options payantes</strong><br />
Je me suis livré à une comparaisons des options payantes dans oracle et gratuites dans SQL Server. Microsoft n&rsquo;offre d&rsquo;ailleurs pas d&rsquo;options payantes, mais les fonctionnalités dépendant des versions (comme dans Oracle d&rsquo;ailleurs). De plus, il existe de nombreux outils complémentaires gratuits pour SQL Server disponible sur le site web communautaire codeplex.<br />
Voici un tableau résumant la chose :<br />
<div id="attachment_660" style="width: 710px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2016/02/Tableau-option-Oracle-SQL-Server.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/Tableau-option-Oracle-SQL-Server.jpg" alt="Comparaison des fonctionnalités Oracle (payantes) et SQL Server (gratuites)" width="1405" height="941" class="size-full wp-image-660" /></a><p class="wp-caption-text">Comparaison des fonctionnalités Oracle (payantes) et SQL Server (gratuites)</p></div></p>
<p><strong>4 &#8211; Le prix&#8230;</strong><br />
De la même manière, j&rsquo;ai étudié le montant comparatif des licences à payer pour l&rsquo;équivalence d&rsquo;Oracle avec SQL Server, basé sur la version Enterprise. Le résultat est édifiant&#8230;<br />
Prix des options Oracle (21 juin 2016) &laquo;&nbsp;Processor Licence&nbsp;&raquo; :</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">Active Data Guard &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 11 500 $<br />
Database In-Memory &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;23 000 $<br />
Diagnostics Pack &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 7 500 $<br />
Tuning Pack &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;5 000 $<br />
Partitionning &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 11 500 $<br />
Advanced compression &nbsp; &nbsp; &nbsp; &nbsp;11 500 $<br />
OLAP &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;23 000 $<br />
Advanced Analytics &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;23 000 $<br />
Spatial &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 17 500 $<br />
Multitenant &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 17 500 $<br />
TOTAL : &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;139 500 $</div></div>
<p><strong><br />
Prix des licences Oracle édition Enterprise : 47 500 $</strong><br />
Le prix des licences Oracle s&rsquo;établie pour 2 processeurs. Par exemple sur une machine quadriprocesseur ayant des CPU comportant 12 coeurs, le facteur de licence est donc de 24 (4 x 12 / 2).</p>
<p><strong>Prix des licences SQL Server édition Enterprise : 27 496 $</strong><br />
Le prix des licences SQL Server s&rsquo;établie pour 4 processeurs. Par exemple sur une machine quadriprocesseur ayant des CPU comportant 12 coeurs, le facteur de licence est donc de 12 (4 x 12 / 4).</p>
<p>Comparaison basé sur le prix au processeur : (47 500 / 2) / (27 496 / 4) = 4<br />
<strong>Oracle, sans aucune option payante, est donc naturellement 4 fois plus cher que SQL Server </strong></p>
<p>Avec notre machine exemple (quadriprocesseur ayant des CPU comportant 12 coeurs) et toutes les options, nous arrivons à la différence suivante :<br />
Oracle : 24 x ( 47 500 + 139 500 ) = 4 488 000 $<br />
SQL Server : 12 x 27 496 = 329 952 $<br />
<strong>À ce stade, Oracle est 13,6 fois plus cher&#8230;</strong> </p>
<p>Mais vous pouvez négocier !</p>
<ul>
<li>les remises maximales chez Oracle vont jusqu&rsquo;à 70%, vous passez donc à : 1 346 400 $</li>
<li>les remises maximales chez Microsoft vont jusqu&rsquo;à 40%, vous passez donc à : 197 971 $</li>
</ul>
<p>De plus si vous avez misé sur des serveur dotés de processeurs OPTERON d&rsquo;AMD, alors Microsoft accorde un facteur de réfaction supplémentaire de 25%. La note passe donc à 148 478 $<br />
<strong>Après négociation et utilisation de processeurs Opteron d&rsquo;AMD, au final, Oracle s&rsquo;avère 9 fois plus cher&#8230;</strong></p>
<p><strong>En conclusion</strong></p>
<p>Comme je le mentionnait dans un article précédent &laquo;&nbsp;<a href="http://blog.developpez.com/sqlpro/p12653/bases-de-donnees/le-declin-oracle" target="_blank">le déclin d&rsquo;Oracle</a>&nbsp;&raquo; la firme de Redwood Shores est en sérieuse perte de vitesse. Elle n&rsquo;est même plus le champion de l&rsquo;avancée technologique. Par exemple elle s&rsquo;est faite grillée sur le &laquo;&nbsp;In Memory&nbsp;&raquo; par SAP avec HanaDB, puis par SQL Server&#8230;<br />
Sur les performances la plupart des benchmarks effectués par les utilisateurs montre quelle est plus gourmande à performances équivalente que la plupart de ses challengers ou si l&rsquo;on prend l&rsquo;autre bout de la lorgnette, qu&rsquo;elle est moins performantes sur une même machine. Mais Oracle interdisant de publier le moindre benchmark concernant le produit, vous ne trouverez pas d&rsquo;étude sérieuses sur le sujet. Reste les benchmarks officiels du TPC, mais là c&rsquo;est une autre histoire&#8230; Oracle ne publie que les résultats du <a href="http://www.tpc.org/tpcc/results/tpcc_perf_results.asp" title="Résultat TCP-C" target="_blank">TCP-C</a> datant de 1992 donc sur une base de données datée de 23 ans comportant en tout et pour tout <a href="http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-c_v5.11.0.pdf" title="TPC-C documentation" target="_blank">8 tables et des jointures limitées à 2 tables sans aucune sous requête</a> ! Et même dans ce cas, SQL AnyWhere de SAP (anciennement Syabse) la bât sur le coût&#8230;<br />
En revanche SQL Server se sert du <a href="http://www.tpc.org/tpce/results/tpce_perf_results.asp" title="TPC-E Résultats" target="_blank">TPC-E</a> plus récent (2007) et plus réaliste, comportant 33 tables des jointures avec 7 tables et de multiples sous requêtes. Et là curieusement, Oracle n&rsquo;y a jamais présenté un seul résultat de benchmark !<br />
Et ce déclin est bien constaté par d&rsquo;inexorables chiffres. Par exemple celui comparant, pour un organisme de formation bien connu pour son indépendance, le nombre de stagiaires formés sur chacune des deux plateformes&#8230;<br />
<div id="attachment_666" style="width: 610px" class="wp-caption alignnone"><a href="http://blog.developpez.com/sqlpro/files/2016/02/Formation-professionnelle-évotion-2005-2015-Oracle-vs-SQL-Server.jpg"><img src="http://blog.developpez.com/sqlpro/files/2016/02/Formation-professionnelle-évotion-2005-2015-Oracle-vs-SQL-Server.jpg" alt="Formation professionnelle - évolution 2005-2015 Oracle vs SQL Server" width="1147" height="618" class="size-full wp-image-666" /></a><p class="wp-caption-text">Formation professionnelle &#8211; évolution 2005-2015 Oracle vs SQL Server</p></div></p>
<p><em>Pas la peine de vous faire un dessin !</em></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Benchmark PostgreSQL vs SQL Server&#8230; comment biaiser !</title>
		<link>https://blog.developpez.com/sqlpro/p12959/langage-sql-norme/benchmark-postgresql-vs-sql-server-comment-biaiser</link>
		<comments>https://blog.developpez.com/sqlpro/p12959/langage-sql-norme/benchmark-postgresql-vs-sql-server-comment-biaiser#comments</comments>
		<pubDate>Tue, 17 Nov 2015 22:25:52 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[Langage SQL (norme)]]></category>
		<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[PostGreSQL]]></category>
		<category><![CDATA[SQL Server 2008]]></category>
		<category><![CDATA[Benchmark]]></category>
		<category><![CDATA[comparaison]]></category>
		<category><![CDATA[SQL server]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/sqlpro/?p=626</guid>
		<description><![CDATA[La mauvaise foi règne encore chez les aficionados de PostGreSQL&#8230; L&#8217;entreprise Red Hat, que je croyais sérieuse, à effectué un benchmark entre PostGreSQL et SQL Server stupéfiant de mauvaise foi&#8230; Voici mes remarques. À noter, ce comparatif porte sur une version payante de PostGreSQL ! On trouvera le benchmark dont je parle &#171;&#160;Comparing BenchmarkSQL Performance [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La mauvaise foi règne encore chez les aficionados de PostGreSQL&#8230; L&rsquo;entreprise Red Hat, que je croyais sérieuse, à effectué un benchmark entre PostGreSQL et SQL Server stupéfiant de mauvaise foi&#8230; Voici mes remarques. À noter, ce comparatif porte sur une version payante de PostGreSQL !<br />
<span id="more-626"></span><br />
On trouvera le benchmark dont je parle &laquo;&nbsp;Comparing BenchmarkSQL Performance on Red Hat® Enterprise Linux 5 to Windows Server Enterprise&nbsp;&raquo; à l&rsquo;URL :<br />
<a href="https://www.redhat.com/pdf/rhel/bmsql-postgres-sqlsrvr-v1.0-1.pdf" title="Comparing BenchmarkSQL Performance on Red Hat® Enterprise Linux 5 to Windows Server Enterprise" target="_blank">https://www.redhat.com/pdf/rhel/bmsql-postgres-sqlsrvr-v1.0-1.pdf</a></p>
<p>Passons sur le choix du benchmark : le TPC-C qui date de 1992 (soit 23 ans&#8230;) est constitué d&rsquo;une base de données qui comporte 9 tables et dont on peut trouver le détail à l&rsquo;URL :<br />
<a href="http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-c_v5-11.pdf" title="Détail du benchmark TPC-C" target="_blank">http://www.tpc.org/tpc_documents_current_versions/pdf/tpc-c_v5-11.pdf</a>. Qui aujourd&rsquo;hui utilise en production une base composée au plus de 9 tables ? En revanche il existe un benchmark plus moderne, le TPC-E composé de 33 tables nettement plus réaliste !</p>
<p><strong>TUNING DES OS</strong></p>
<p>À la page 10 dudit benchmark on trouve le paragraphe <em>3.3.1 (Operating System)</em> qui montre comment à été optimisé Linux.</p>
<p><a href="http://blog.developpez.com/sqlpro/files/2015/11/PostGreSQL-vs-SQL-Server-OS-Tuning.jpg"><img src="http://blog.developpez.com/sqlpro/files/2015/11/PostGreSQL-vs-SQL-Server-OS-Tuning.jpg" alt="PostGreSQL vs SQL Server OS Tuning" width="829" height="621" class="alignnone size-full wp-image-630" /></a></p>
<p>On y voit clairement que <strong>seul l&rsquo;OS Linux a été optimisé</strong>. Quelles optimisations ont été faites pour Windows ? <strong>Aucune !</strong></p>
<p>Or il est bien évident qu&rsquo;une installation standard de Windows pour héberger SQL Server n&rsquo;est pas optimale sans certains réglages :<br />
&#8211; désactivation des services inutiles (ce qui a été fait pour Linux et pas pour Windows)<br />
&#8211; désactivation du système d&rsquo;économie d’énergie (qui n&rsquo;existe pas sous Linux.. pas écolo les linuxiens !)<br />
&#8211; activation de Turbo Boost<br />
&#8211; activation de l&rsquo;Instant File Initialization pour le service SQL Server<br />
&#8211; activation du Lock Page in Memory pour SQL Server<br />
&#8230;</p>
<p><strong>TUNING DES SGBDR</strong></p>
<p>À la page 11 figure le paragraphe 3.3.3 (Database) qui montre comment a été optimisé PostGreSQL.</p>
<p><a href="http://blog.developpez.com/sqlpro/files/2015/11/PostGreSQL-vs-SQL-Server-database-Tuning.jpg"><img src="http://blog.developpez.com/sqlpro/files/2015/11/PostGreSQL-vs-SQL-Server-database-Tuning.jpg" alt="PostGreSQL vs SQL Server database Tuning" width="819" height="563" class="alignnone size-full wp-image-631" /></a></p>
<p>On y voit clairement que <strong>seul PostGreSQL a été optimisé</strong>. Red Hat revendique même sa tromperie : &laquo;&nbsp;<em>&#8230;no specific SQL Server tuning was performed</em>&nbsp;&raquo; !</p>
<p>Or il est bien évident que plusieurs optimisations sont nécessaires :<br />
&#8211; la ventilation du stockage des fichiers de données de la base tempdb (objets temporaires) en autant de fichiers d&rsquo;égales longueur que de CPU (donc au moins 2);<br />
&#8211; le dimensionnement correct des fichiers de la base de données à 40 Go pour les données et 10 Go pour les transactions avec à nouveau au moins 2 fichiers pour les données<br />
&#8211; la limitation de la RAM utilisée par SQL Server à au moins 44 Go (max server memory);<br />
&#8211; la limitation du parallélisme des requêtes à 4 (du fait que le serveur présente 2 CPU Quad Core et 4 LUN par agrégats RAID) et hausse du seuil de déclenchement à 12 (cost threshold for parallelism);<br />
&#8211; le positionnement du paramètre &laquo;&nbsp;optimize for ad hoc workloads&nbsp;&raquo; à 1 sinon les plans de requête ne sont pas mis en cache !<br />
&#8211; l&rsquo;élévation du délai de report des écritures physique de données (checkpoint), paramètre &laquo;&nbsp;recovery interval&nbsp;&raquo;, à 60 minutes pour coller au paramètre &laquo;&nbsp;checkpoint_timeout &nbsp;&raquo; positionné à 1 heure dans PostGreSQL (un délai tout à fait anormal entre nous, car cela pourrait s&rsquo;avérer dangereux en production&#8230;)<br />
&#8230;</p>
<p><strong>POSTGRESQL PLUS</strong></p>
<p>Très discrètement, le document montre que la version testée de PostGreSQL n&rsquo;est pas la version gratuite Open Source, mais la version payante fabriquée par EntrepriseDB et nommée &laquo;&nbsp;PostGreSQL PLUS.<br />
Nous n&rsquo;avons pas pu obtenir le prix d&rsquo;une telle version directement sur le site d&rsquo;EntrepriseDB, mais <a href="https://assets.digitalmarketplace.service.gov.uk/documents/93566/5258173757784064-pricing-document.pdf" title="PostGreSQL PLUS prix des licences" target="_blank">sur un autre document, provenant probablement du gouvernement britannique</a> ce prix apparait être 3 265 £ par CPU (socket), soit environ 4 700 €&#8230;<br />
En comparaison, SQL Server 2008 R2 version Web, suffisante pour ce benchmark, coute 4 246,41&#8230;</p>
<p><strong>LES RÉSULTATS</strong></strong></p>
<p>Comme on s&rsquo;y attendait, avec un tel paramétrage, PostGreSQL bât haut la main SQL Server ! <em>haut la main ?</em> <strong>pas si sûr&#8230;</strong></p>
<p><a href="http://blog.developpez.com/sqlpro/files/2015/11/PostGreSQL-vs-SQL-Server-Resultats.jpg"><img src="http://blog.developpez.com/sqlpro/files/2015/11/PostGreSQL-vs-SQL-Server-Resultats.jpg" alt="PostGreSQL vs SQL Server Resultats" width="731" height="645" class="alignnone size-full wp-image-632" /></a></p>
<p>Il faut vraiment y aller à la loupe pour voir la différence. En mesurant après impression avec une règle, j&rsquo;ai constaté un écart relatif de 3 à 5 % mesuré sur les entrées 40 et 140 de l&rsquo;histogramme&#8230;</p>
<p>Bref, il est très probable qu&rsquo;avec les réglages manquants pour Windows et SQL Server, Red Hat n&rsquo;aurait jamais publié un tel benchmark tant il aurait été défavorable à PostGreSQL fût-il PLUS !</p>
<p>Ce qui me navre c&rsquo;est que je croyais naïvement que Red Hat était une entreprise sérieuse !</p>
<p>***</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">Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES<br />
Expert &nbsp;S.G.B.D &nbsp;relationnelles &nbsp; et &nbsp; langage &nbsp;S.Q.L<br />
Moste &nbsp;Valuable &nbsp;Professionnal &nbsp;Microsoft &nbsp;SQL Server<br />
Société SQLspot &nbsp;: &nbsp;modélisation, conseil, formation,<br />
optimisation, &nbsp;audit, &nbsp;tuning, &nbsp;administration &nbsp;SGBDR<br />
Enseignant: CNAM PACA, ISEN Toulon, CESI Aix en Prov.</div></div>
<p>L&rsquo;entreprise <a href="http://www.sqlspot.com">SQL Spot</a><br />
<strong>Le site web sur le </strong><a href="http://sqlpro.developpez.com/">SQL et les SGBDR</a></p>
<p><img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL
Server" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Comparatif des fonctionnalités PostGreSQL 9.2 SQL Server 2012</title>
		<link>https://blog.developpez.com/sqlpro/p11859/langage-sql-norme/comparatif-des-fonctionnalites-postgresql-9-2-sql-server-2012</link>
		<comments>https://blog.developpez.com/sqlpro/p11859/langage-sql-norme/comparatif-des-fonctionnalites-postgresql-9-2-sql-server-2012#comments</comments>
		<pubDate>Tue, 26 Mar 2013 09:24:49 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[bases de données]]></category>
		<category><![CDATA[Langage SQL (norme)]]></category>
		<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[PostGreSQL]]></category>
		<category><![CDATA[comparaison]]></category>
		<category><![CDATA[comparatif]]></category>
		<category><![CDATA[fonctionnalité]]></category>
		<category><![CDATA[SQL Sever]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/sqlpro/?p=268</guid>
		<description><![CDATA[Voici une étude comparant les fonctionnalités de Microsoft SQL Server version 2012 et de PostGreSQL version 9.2. Dans ce comparatif des fonctionnalités de nombreuses sources et explication sont fournies. Comparaison PostGreSQL 9.2 Microsoft SQL Server 2012 fonctionnalités Le site web sur le SQL et les SGBDR Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES Expert &#160;S.G.B.D [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Voici une étude comparant les fonctionnalités de Microsoft SQL Server version 2012 et de PostGreSQL version 9.2.<br />
Dans ce comparatif des fonctionnalités de nombreuses sources et explication sont fournies.<br />
<a href="http://blog.developpez.com/sqlpro/files/2013/03/Comparaison-PostGreSQL-9.2-Microsoft-SQL-Server-2012-fonctionnalités.pdf">Comparaison PostGreSQL 9.2 Microsoft SQL Server 2012 fonctionnalités</a></p>
<p><strong>Le site web sur le </strong><a href="http://sqlpro.developpez.com/">SQL et les SGBDR</a><br />
<img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL Server" /></p>
<pre>

<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">Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES<br />
Expert &nbsp;S.G.B.D &nbsp;relationnelles &nbsp; et &nbsp; langage &nbsp;S.Q.L<br />
Moste &nbsp;Valuable &nbsp;Professionnal &nbsp;Microsoft &nbsp;SQL Server<br />
Société SQLspot &nbsp;: &nbsp;modélisation, conseil, formation,<br />
optimisation, &nbsp;audit, &nbsp;tuning, &nbsp;administration &nbsp;SGBDR<br />
Enseignant: CNAM PACA, ISEN Toulon, CESI Aix en Prov.</div></div>

</pre>
<p>L&rsquo;ntreprise <a href="http://www.sqlspot.com">SQL Spot</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Le coût d&#8217;exploitation d&#8217;un SGBDR.. Oracle vs Microsoft SQL Server</title>
		<link>https://blog.developpez.com/sqlpro/p11825/ms-sql-server/le-cout-dexploitation-dun-sgbdr-oracle-vs-microsoft-sql-server</link>
		<comments>https://blog.developpez.com/sqlpro/p11825/ms-sql-server/le-cout-dexploitation-dun-sgbdr-oracle-vs-microsoft-sql-server#comments</comments>
		<pubDate>Sat, 09 Mar 2013 10:03:40 +0000</pubDate>
		<dc:creator><![CDATA[SQLpro]]></dc:creator>
				<category><![CDATA[bases de données]]></category>
		<category><![CDATA[MS SQL Server]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[comparaison]]></category>
		<category><![CDATA[coût]]></category>
		<category><![CDATA[exploitation]]></category>
		<category><![CDATA[SQLServer]]></category>
		<category><![CDATA[tarif]]></category>
		<category><![CDATA[TCA]]></category>
		<category><![CDATA[TCO]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/sqlpro/?p=266</guid>
		<description><![CDATA[La sté Alinean a effectuée une étude comparant le coût d&#8217;exploitation des serveurs de bases de données Oracle et Microsoft SQL Server. Le résultat est sans appel&#8230; Avec ses licences aux tarifs exorbitant et du fait de sa complexité d’administration, Oracle est 4,6 fois plus cher à solutions comparables. Les gains de productivité sont aussi [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>La sté Alinean a effectuée une étude comparant le coût d&rsquo;exploitation des serveurs de bases de données Oracle et Microsoft SQL Server.<br />
Le résultat est sans appel&#8230; Avec ses licences aux tarifs exorbitant et du fait de sa complexité d’administration, Oracle est 4,6 fois plus cher à solutions comparables.<br />
<span id="more-266"></span><br />
Les gains de productivité sont aussi énormes. Ainsi l&rsquo;étude montre qu&rsquo;un DBA SQL Server peut administrer en moyenne 214 bases tandis que son confrère en Oraclien n&rsquo;en administre que 31 (à volumétrie égale sur le plan transactionnel comme sur le plan données)<br />
Le temps de déploiement d&rsquo;une base de données a aussi été mesuré. Avec Oracle on est en moyenne à 357 minutes par base. Avec SQL Server à 88. Soit 4 fois plus rapide&#8230;<br />
Les temps passés sont aussi très intéressants : un DBA Oracle passe presque deux fois plus de temps en résolution des problèmes et en tuning que son confrère sur SQL Server. De même les temps des tâches de sécurité et de sauvegarde sont de plus d&rsquo;un tiers plus longues à effectuer sous Oracle que sous MS SQL Server&#8230;</p>
<p>À lire donc : <a href="http://alinean.com/PDFs/Microsoft_SQL_Server_and_Oracle-Alinean_TCA_Study_2010.pdf">Microsoft SQL Server and Oracle® Database : A Comparative Study on Total Cost of Administration (TCA)</a> </p>
<p><strong>Le site web sur le </strong><a href="http://sqlpro.developpez.com/">SQL et les SGBDR</a></p>
<p><img src="http://blog.developpez.com/media/Microsoft_MVP_logo_vertical Brouard 400.jpg" width="400" height="135" alt="MVP Microsoft SQL Server" /></p>
<pre>

<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">Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES<br />
Expert &nbsp;S.G.B.D &nbsp;relationnelles &nbsp; et &nbsp; langage &nbsp;S.Q.L<br />
Moste &nbsp;Valuable &nbsp;Professionnal &nbsp;Microsoft &nbsp;SQL Server<br />
Société SQLspot &nbsp;: &nbsp;modélisation, conseil, formation,<br />
optimisation, &nbsp;audit, &nbsp;tuning, &nbsp;administration &nbsp;SGBDR<br />
Enseignant: CNAM PACA, ISEN Toulon, CESI Aix en Prov.</div></div>

</pre>
<p>L&rsquo;ntreprise <a href="http://www.sqlspot.com">SQL Spot</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
