<?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; Hints</title>
	<atom:link href="https://blog.developpez.com/pachot/tag/hints/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>Tous les Hints disponibles</title>
		<link>https://blog.developpez.com/pachot/ref_sql_features_hints/</link>
		<comments>https://blog.developpez.com/pachot/ref_sql_features_hints/#comments</comments>
		<pubDate>Mon, 30 Sep 2013 06:00:09 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>
		<category><![CDATA[Hints]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=688</guid>
		<description><![CDATA[La vue V$SQL_HINT donne tous les hints disponibles avec la version où ils sont apparus et le hint inverse. Assicié à v$sql_feature_hierarchy et v$sql_feature on a une indication de ce qu&#8217;ils font. Attention, beaucoup sont non documentés (et donc peuvent &#8230; <a href="https://blog.developpez.com/pachot/ref_sql_features_hints/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>La vue V$SQL_HINT donne tous les hints disponibles avec la version où ils sont apparus et le hint inverse.<br />
Assicié à  v$sql_feature_hierarchy et v$sql_feature on a une indication de ce qu&rsquo;ils font. Attention, beaucoup sont non documentés (et donc peuvent avoir des effets non désirés)</p>
<p><ins datetime="2013-10-14T20:50:30+00:00">La <a href="http://ora-demo.pachot.net/ref_sql_features_hints.html" title="demo" target="_blank">demo</a> montre cette liste pour la 12c.<br />
</ins></p>
<p>le nouveaux hints documentés pour la 12c sont:</p>
<ul>
<li>GATHER_OPTIMIZER_STATISTICS/NO_GATHER_OPTIMIZER_STATISTICS pour la fonctionnalité de calcul de statistiques lors de du chargement
</li>
<li>PQ_CONCURRENT_UNION/NO_PQ_CONCURRENT_UNION pour la fonctionnalité de parallelisme des UNION.
</li>
<li>PQ_SKEW/NO_PQ_SKEW pour préciser la distribution des colonnes de jointure en parallel query.
</li>
<li>PQ_FILTER pour définir la distribution en paralle query pour les sous-requêtes
</li>
<li>USE_CUBE/NO_USE_CUBE pour le nouveau type de jointure entre cubes.
</li>
</ul>
<p>Et tous les nouveaux hints pour la 12c (attention beaucoup sont non documentés):</p>
<table>
<tr>
<th>Hint</th>
<th>Description</th>
</tr>
<tr>
<td>WITH_PLSQL</td>
<td>Nécessaire lorsque une fonction pl/sql est dans une clause <a href="http://blog.developpez.com/pachot/12c_udf_pragma/">WITH </a>qui n&rsquo;est pas au début de la requête</td>
</tr>
<tr>
<td>(NO_)CLUSTER_BY_ROWID</td>
<td>Hint du CBO</td>
</tr>
<tr>
<td>BITMAP_AND</td>
<td>Bitmap tree access path</td>
</tr>
<tr>
<td>(NO_)AUTO_REOPTIMIZE</td>
<td>Automatic reoptimization (utilise les statistiques de la première exécution pour reoptimiser le plan)</td>
</tr>
<tr>
<td>DISABLE_PARALLEL_DML,ENABLE_PARALLEL_DML</td>
<td>Equivallent de ENABLE PARALLEL DML pour une requête</td>
</tr>
<tr>
<td>(NO_)USE_CUBE, CUBE_AJ , CUBE_SJ </td>
<td>Nouvelle methode de jointure Cube Join</td>
</tr>
<tr>
<td>(NO_)PARTIAL_JOIN</td>
<td><a href="http://blog.developpez.com/pachot/12c_partial_join_evaluation/ ‎">Partial Join Evaluation</a> (transformation lorsque on n&rsquo;a pas besoin de toutes les lignes retournées par la jointure car il y a un distinct à appliquer ensuite)</td>
</tr>
<tr>
<td>USE_HIDDEN_PARTITIONS</td>
<td>Fonctionalité non documentée &lsquo;hidden partition&rsquo;</td>
</tr>
<tr>
<td>(NO_)PARTIAL_ROLLUP_PUSHDOWN</td>
<td>Hint Parallel Query</td>
</tr>
<tr>
<td>(NO_)PQ_CONCURRENT_UNION</td>
<td>Parallel Query &#8211; parallélisme pour les UNION</td>
</tr>
<tr>
<td>PQ_DISTRIBUTE_WINDOW</td>
<td>Hint Parallel Query</td>
</tr>
<tr>
<td>PQ_FILTER</td>
<td>Hint Parallel Query</td>
</tr>
<tr>
<td>(NO_)PQ_SKEW</td>
<td>Hint Parallel Query</td>
</tr>
<tr>
<td>(NO_)PX_FAULT_TOLERANCE</td>
<td>Hint Parallel Query</td>
</tr>
<tr>
<td>(NO_)PQ_REPLICATE</td>
<td>&lsquo;<a href="http://blog.developpez.com/pachot/12c_pq_replicate/" title="12c: Parallel Query ‘replicate’ au lieu de ‘broadcast’ pour les petites tables">replicate small tables</a>&lsquo; en Parallel Query</td>
</tr>
<tr>
<td>(NO_)GATHER_OPTIMIZER_STATISTICS</td>
<td><a href="http://blog.developpez.com/pachot/12c_sqltun_onlinestatisticsgathering/">Collection des statistiques</a> lors d&rsquo;un chargement direct-path sur une table vide</td>
</tr>
<tr>
<td>DATA_SECURITY_REWRITE_LIMIT</td>
<td>XS Data Security Rewrite</td>
</tr>
<tr>
<td>NO_DATA_SECURITY_REWRITE</td>
<td>XS Data Security Rewrite</td>
</tr>
<tr>
<td>(NO_)DECORRELATE</td>
<td>View Decorrelation (transformation pour les jointures LATERAL ?)</td>
</tr>
<tr>
<td>(NO_)ZONEMAP</td>
<td>materialized zonemap (Exadata) &#8211; ressemble aux Storage Indexes mais stocké comme vues matérialisées</td>
</tr>
<tr>
<td>(NO_)BATCH_TABLE_ACCESS_BY_ROWID</td>
<td>Batching de l&rsquo;accès par index à une table</td>
</tr>
<tr>
<td>(NO_)CLUSTERING</td>
<td>table clustering clause (Exadata) &#8211; contrôle l&rsquo;ordre physique des lignes.</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fixer les jointures avec les hints USE_HASH, USE_NL, USE_MERGE</title>
		<link>https://blog.developpez.com/pachot/hinting_joins/</link>
		<comments>https://blog.developpez.com/pachot/hinting_joins/#comments</comments>
		<pubDate>Mon, 09 Sep 2013 19:57:28 +0000</pubDate>
		<dc:creator><![CDATA[pachot]]></dc:creator>
				<category><![CDATA[MicroLearning]]></category>
		<category><![CDATA[Hints]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/pachot/?p=674</guid>
		<description><![CDATA[Il n&#8217;est pas conseillé d&#8217;utiliser des hints pour forcer l&#8217;optimiseur. Il est préférable de laisser le CBO trouver le bon plan d&#8217;exécution en lui donnant de bonnes statistiques. Mais quelquefois, cette tâche est longue et complexe alors qu&#8217;on connaît d&#8217;emblée &#8230; <a href="https://blog.developpez.com/pachot/hinting_joins/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Il n&rsquo;est pas conseillé d&rsquo;utiliser des hints pour forcer l&rsquo;optimiseur. Il est préférable de laisser le CBO trouver le bon plan d&rsquo;exécution en lui donnant de bonnes statistiques.<br />
Mais quelquefois, cette tâche est longue et complexe alors qu&rsquo;on connaît d&rsquo;emblée le plan d&rsquo;exécution optimal.<br />
L&rsquo;autre cas où j&rsquo;utilise souvent des hints pour forcer un plan, c&rsquo;est pour vérifier un plan que je pense être meilleur: en le forçant, je vois d&rsquo;abord s&rsquo;il est possible, et ensuite s&rsquo;il est optimal. Il ne reste plus alors qu&rsquo;à voir comment arriver plus proprement à ce plan&#8230;</p>
<p>Si l&rsquo;on doit forcer la méthode de jointure, il faut par contre faire attention à définir complètement le plan, et cela nécessite plusieurs hints. Sinon, on risque de provoquer un plan ni voulu ni optimal.</p>
<p>La première chose, c&rsquo;est de définir l&rsquo;ordre dans lequel vont se faire les jointures, avec LEADING. Il y aura toutes les tables dans LEADING.<br />
Puis, pour chacune de ces tables, sauf la première il y aura l&rsquo;un des hints suivants:</p>
<ul>
<li>USE_NL(<em>alias</em>) pour faire un Nested Loop join: pour chaque ligne du résultat précédent, on va aller voir la table précisée dans le hint (<em>alias</em>)<br />
l&rsquo;accés à <em>alias</em> se fera autant de fois qu&rsquo;il y a de ligne venant de la table précédente.
</li>
<li>USE_HASH(<em>alias</em>) pour faire un Hash Join. Il faut alors rajouter un autre hint pour préciser quelle est la source qui va être hachée:
<ul>
<li>USE_HASH(<em>alias</em>) NO_SWAP_JOIN_INPUTS(alias)</li>
<p> Le résultat précédent va être haché, puis on va lire <em>alias</em> et pour chaque ligne aller voir la table de hachage</p>
<li>USE_HASH(<em>alias</em>) SWAP_JOIN_INPUTS(<em>alias</em>)</li>
<p> C&rsquo;est la nouvelle table qu&rsquo;on va voir (<em>alias</em>) qui va être hachée, et interrogée pour chaque ligne du résultat précédent
</ul>
</li>
<li>USE_MERGE(<em>alias</em>) pour faire un Sort Merge join: le résultat précédent est trié (si ce n&rsquo;est pas déjà dans le bon ordre), <em>alias</em> est lu et trié (dans tous les cas) puis la jointure est faite en parcourant les deux. Le résultat suit la même tri.
</li>
<li>USE_MERGE_CARTESIAN(<em>alias</em>)</li>
<p> pour faire une jointure où la plupart des lignes de <em>alias</em> vont satisfaire la jointure pour la plupart des lignes du résultat précédent.<br />
Dans ce cas, pas de tri, pas de hachage, mais simplement un buffer (qui peut aller en tempfile) pour ne pas avoir à accéder plusieurs fois à alias (comme le ferait un Nested Loop par exemple)
</ul>
<p>Lorsque je parle du résultat précédent, c&rsquo;est celui qui vient des jointures des tables de gauche dans le hint LEADING.</p>
<p><ins datetime="2013-09-09T14:10:45+00:00">Dans la <a href="https://googledrive.com/host/0Bxhrc9V4eGzdd3liTDMwdmFmM2s/hinting_joins.html" title="demo" target="_blank">demo</a>, en faisant varier les cardinalités de 3 tables, on voit les risque d&rsquo;avoir d&rsquo;autres plans si on ne précise pas tous les alias nécessaires.</ins></p>
<p>Pourquoi SWAP_JOIN_INPUTS ? pour faire passer la table hachée au dessus du plan d&rsquo;exécution, car c&rsquo;est la première opération fille d&rsquo;un HASH JOIN dans le plan d&rsquo;exécution (parce qu&rsquo;il faut avoir lu cette table avant de parcourir l&rsquo;autre). Avec NESTED LOOPS, c&rsquo;est l&rsquo;inverse: la table qui est parcourue se trouve en premier. Avec LEADING on liste l&rsquo;ordre des tables du plan d&rsquo;exécution. Avec SWAP_JOIN_INPUTS pour Hash Join seulement, on change l&rsquo;ordre.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
