<?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>Performance&amp;Tuning &#8211; Furushima</title>
	<atom:link href="https://furushima.com.br/blog/tag/performancetuning/feed/" rel="self" type="application/rss+xml" />
	<link>https://furushima.com.br</link>
	<description>- Consultoria de Banco de Dados &#124; Furushima</description>
	<lastBuildDate>Wed, 19 Mar 2025 19:33:46 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://furushima.com.br/wp-content/uploads/2024/02/cropped-favicon-32x32.png</url>
	<title>Performance&amp;Tuning &#8211; Furushima</title>
	<link>https://furushima.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Como usar Hint no Oracle?</title>
		<link>https://furushima.com.br/blog/como-usar-hint-no-oracle/</link>
					<comments>https://furushima.com.br/blog/como-usar-hint-no-oracle/#respond</comments>
		
		<dc:creator><![CDATA[Matsuo]]></dc:creator>
		<pubDate>Mon, 07 Apr 2025 19:31:00 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[ORACLE]]></category>
		<category><![CDATA[Performance&Tuning]]></category>
		<category><![CDATA[TUNING]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2662</guid>

					<description><![CDATA[Super Dicionário de Hints do Oracle Quando trabalhamos com Oracle, um ponto importante para otimizar o desempenho das consultas SQL é entender como orientar o otimizador a escolher determinados planos de execução. É exatamente para isso que servem os hints. Ao inserir hints (dicas) diretamente na consulta, podemos influenciar o Cost Based Optimizer (CBO) a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1 class="wp-block-heading"><strong>Super Dicionário de Hints do Oracle</strong></h1>



<p>Quando trabalhamos com Oracle, um ponto importante para otimizar o desempenho das consultas SQL é entender como orientar o otimizador a escolher determinados planos de execução. É exatamente para isso que servem os <em>hints</em>. </p>



<p>Ao inserir <em>hints</em> (dicas) diretamente na consulta, podemos influenciar o Cost Based Optimizer (CBO) a tomar decisões mais adequadas em situações específicas. </p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">O que são Hints?</h2>



<p>Os <em>hints</em> são instruções especiais escritas em comentários dentro de uma consulta SQL, que afetam o plano de execução escolhido pelo Oracle. O formato geral é:</p>



<pre class="wp-block-preformatted"></pre>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT /*+ HINT_EXEMPLO */ coluna1, coluna2
FROM tabela
WHERE condicao;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #6A9955">/*+ HINT_EXEMPLO */</span><span style="color: #D4D4D4"> coluna1, coluna2</span></span>
<span class="line"><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> tabela</span></span>
<span class="line"><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> condicao;</span></span></code></pre></div>



<ul class="wp-block-list">
<li><strong>Comentário especial</strong>: O Oracle reconhece a estrutura <code>/*+ ... */</code> após o <code>SELECT</code>.</li>



<li><strong>Case sensitive</strong>: Tecnicamente, o texto do <em>hint</em> não faz distinção entre maiúsculas e minúsculas, mas é fundamental que a sintaxe e o nome do <em>hint</em> estejam corretos para que ele seja reconhecido.</li>



<li><strong>Uso do CBO</strong>: Qualquer <em>hint</em> (exceto o <code>RULE</code>) instrui o Oracle a usar o <strong>Cost Based Optimizer</strong>. Se a sintaxe do <em>hint</em> estiver incorreta, ele é simplesmente ignorado.</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-eb8d26691779070bcb8d87108bbff7bd">A</h2>



<h3 class="wp-block-heading">AND_EQUAL</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força o otimizador a fazer um “merge scan” de vários índices de coluna única.</li>



<li><strong>Sintaxe</strong>: <code>AND_EQUAL(tabela índice1 índice2 ...)</code></li>



<li><strong>Status</strong>: Depreciado no Oracle 10g e versões posteriores.</li>
</ul>



<h3 class="wp-block-heading">APPEND</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Em instruções <code>INSERT</code>, faz uma inserção em <em>direct path</em>, ignorando espaço livre no bloco. Pode reduzir o volume de <em>redo</em> gerado quando a tabela está em modo <code>NOLOGGING</code>.</li>



<li><strong>Sintaxe</strong>: <code>INSERT /*+ APPEND */ INTO tabela ...</code></li>



<li><strong>Observação</strong>: Exige que a tabela não seja indexada de forma a impedir o uso de <em>bulk inserts</em>, e que não haja triggers ou constraints que impeçam <em>direct path load</em>.</li>



<li><strong>Status</strong>: Suportado em várias versões. Continua válido.</li>
</ul>



<h3 class="wp-block-heading">APPEND_VALUES</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Similar ao <code>APPEND</code>, mas para instruções <code>INSERT ... VALUES</code>, introduzido em versões mais recentes (por volta do Oracle 12c+).</li>



<li><strong>Sintaxe</strong>: <code>INSERT /*+ APPEND_VALUES */ INTO tabela VALUES (...)</code></li>



<li><strong>Observação</strong>: Otimiza a inserção de linhas únicas em modo de <em>direct path</em>. Útil quando não se está usando <code>INSERT SELECT</code>.</li>
</ul>



<h3 class="wp-block-heading">ALL_ROWS</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Otimiza a consulta para melhor <em>throughput</em> (menor consumo total de recursos).</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ ALL_ROWS */ ...</code></li>



<li><strong>Status</strong>: Válido e muito comum.</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-75474df6ad63a4dc6c74a1d8edfb284e">B</h2>



<h3 class="wp-block-heading">BITMAP</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força o uso de um índice Bitmap para acessar a tabela.</li>



<li><strong>Sintaxe</strong>: <code>BITMAP(tabela índice_bitmap)</code></li>



<li><strong>Status</strong>: Em algumas versões é considerado obsoleto ou pouco suportado, pois a detecção automática de bitmap normalmente funciona bem.</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-c88d9af5cb9bcce17f04b1d1bb824ee0">C</h2>



<h3 class="wp-block-heading">CACHE / NOCACHE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Controla como os blocos lidos são colocados no Buffer Cache em caso de <em>full table scan</em>.</li>



<li><strong>Sintaxe</strong>: <code>CACHE(tabela)</code> / <code>NOCACHE(tabela)</code></li>
</ul>



<h3 class="wp-block-heading">CHOOSE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Permite ao otimizador escolher entre <em>rule-based</em> e <em>cost-based</em> baseado na presença de estatísticas.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ CHOOSE */ ...</code></li>



<li><strong>Status</strong>: Muito antigo, raramente usado hoje. A partir do 10g, o Oracle praticamente só usa <em>CBO</em>.</li>
</ul>



<h3 class="wp-block-heading">CLUSTER</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força um cluster scan para a tabela.</li>



<li><strong>Sintaxe</strong>: <code>CLUSTER(tabela)</code></li>
</ul>



<h3 class="wp-block-heading">CURSOR_SHARING_EXACT</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Desativa a substituição de literais por binds, mesmo que <code>CURSOR_SHARING</code> esteja habilitado no banco.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ CURSOR_SHARING_EXACT */ ...</code></li>
</ul>



<h3 class="wp-block-heading">CARDINALITY</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Informa ao otimizador uma estimativa do número de linhas esperadas da tabela ou subquery.</li>



<li><strong>Sintaxe</strong>: <code>CARDINALITY(tabela ou subquery, linhas)</code></li>



<li><strong>Observação:</strong> Pode ser útil quando as estatísticas não representam corretamente o volume real de dados.</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-bcc12ff8a21a32be46ee06df58fb38a3">D</h2>



<h3 class="wp-block-heading">DISTRIBUTE / DISTRIBUTE_JOIN</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força a distribuição específica no join paralelo, semelhante ao PQ_DISTRIBUTE, mas usado principalmente em ambientes Exadata ou ambientes paralelos sofisticados.</li>



<li><strong>Sintaxe</strong>: <code>DISTRIBUTE_JOIN(tabela, método)</code></li>



<li><strong>Observação:</strong> Os métodos mais comuns são BROADCAST, PARTITION, NONE.</li>
</ul>



<h3 class="wp-block-heading">DRIVING_SITE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Em ambientes distribuídos, força a execução remota de parte da query em um site específico.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ DRIVING_SITE(tabela_ou_alias) */ ...</code></li>
</ul>



<h3 class="wp-block-heading">DYNAMIC_SAMPLING</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Controla a coleta de estatísticas dinâmicas em tempo de compilação para melhorar estimativas de seletividade.</li>



<li><strong>Sintaxe</strong>: <code>DYNAMIC_SAMPLING(nível)</code> ou <code>DYNAMIC_SAMPLING(tabela, nível)</code></li>



<li><strong>Valores</strong>: De 0 a 11. Quanto maior, mais esforço (e potencial custo de compilação) para coletar estatísticas. (11 não é documentado , mas ele trabalha como AUTO, legal né? mas trabalha mal.)</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-af7d4726b6ff0e7a1131f279db1a9e55">E</h2>



<h3 class="wp-block-heading">EXPAND_GSET_TO_UNION</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força a expansão de conjuntos (GROUPING SETS) para instruções <code>UNION ALL</code>.</li>



<li><strong>Status</strong>: Depreciado no Oracle 10g.</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-a3405e994ad1dc4c70dfa3cc45144c5d">F</h2>



<h3 class="wp-block-heading">FACT / NO_FACT</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Em <em>star transformations</em>, indica se a tabela é ou não considerada <em>fact table</em>.</li>



<li><strong>Sintaxe</strong>: <code>FACT(tabela)</code> / <code>NO_FACT(tabela)</code></li>
</ul>



<h3 class="wp-block-heading">FIRST_ROWS(n)</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Otimiza para resposta rápida dos primeiros <code>n</code> registros.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ FIRST_ROWS(10) */ ...</code></li>
</ul>



<h3 class="wp-block-heading">FULL</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força um <em>full table scan</em> na tabela especificada.</li>



<li><strong>Sintaxe</strong>: <code>FULL(tabela)</code></li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-d4e3a30f6c66b144f2eefcc9c72803d5">G</h2>



<h3 class="wp-block-heading">GATHER_PLAN_STATISTICS</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Faz o Oracle coletar estatísticas detalhadas de execução para aquela query, que podem ser visualizadas com <code>DBMS_XPLAN.DISPLAY_CURSOR</code>.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ GATHER_PLAN_STATISTICS */ ...</code></li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-a6bff913ee9b04b67767043a722d5461">H</h2>



<h3 class="wp-block-heading">HASH</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força <em>hash scan</em> (normalmente para tabelas em clusters hash).</li>



<li><strong>Sintaxe</strong>: <code>HASH(tabela)</code></li>
</ul>



<h3 class="wp-block-heading">HASH_AJ</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Transforma subconsulta <code>NOT IN</code> em <em>hash anti-join</em>.</li>



<li><strong>Sintaxe</strong>: <code>HASH_AJ(tabela)</code></li>



<li><strong>Status</strong>: Depreciado no 10g.</li>
</ul>



<h3 class="wp-block-heading">HASH_SJ</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força <em>hash semi-join</em> ou <em>hash anti-join</em>.</li>



<li><strong>Sintaxe</strong>: <code>HASH_SJ(tabela)</code></li>



<li><strong>Status</strong>: Antigo e pouco utilizado em versões modernas.</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-279226d7df95ca463b8520465033f853">I</h2>



<h3 class="wp-block-heading">INDEX</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força o uso de um índice específico ou conjunto de índices.</li>



<li><strong>Sintaxe</strong>: <code>INDEX(tabela índice)</code> ou <code>INDEX(tabela índice1 índice2 ...)</code></li>
</ul>



<h3 class="wp-block-heading">INDEX_ASC / INDEX_DESC</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força <em>index range scan</em> em ordem ascendente ou descendente.</li>



<li><strong>Sintaxe</strong>: <code>INDEX_ASC(tabela índice)</code> / <code>INDEX_DESC(tabela índice)</code></li>
</ul>



<h3 class="wp-block-heading">INDEX_COMBINE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força o otimizador a usar uma combinação de índices Bitmap.</li>



<li><strong>Sintaxe</strong>: <code>INDEX_COMBINE(tabela índice1 índice2 ...)</code></li>
</ul>



<h3 class="wp-block-heading">INDEX_FFS</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força <em>fast full index scan</em>, em vez de <em>full table scan</em>.</li>



<li><strong>Sintaxe</strong>: <code>INDEX_FFS(tabela índice)</code></li>
</ul>



<h3 class="wp-block-heading">INDEX_JOIN</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força o <em>index join</em> de várias combinações de índices para cobrir todas as colunas necessárias.</li>



<li><strong>Sintaxe</strong>: <code>INDEX_JOIN(tabela índice1 índice2 ...)</code></li>
</ul>



<h3 class="wp-block-heading">INDEX_SS / INDEX_SS_ASC / INDEX_SS_DESC</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força (ou impede) o <em>index skip scan</em> em ordem ascendente/descendente.</li>



<li><strong>Status</strong>: Oracle 10g+.</li>



<li><strong>Sintaxe</strong>: <code>INDEX_SS(tabela índice)</code>, <code>INDEX_SS_ASC(tabela índice)</code>, <code>INDEX_SS_DESC(tabela índice)</code></li>
</ul>



<h3 class="wp-block-heading">NO_INDEX / NO_INDEX_FFS / NO_INDEX_SS</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Desabilitam uso de índice em geral, <em>fast full index scan</em> ou <em>skip scan</em>, respectivamente.</li>



<li><strong>Sintaxe</strong>: <code>NO_INDEX(tabela índice)</code>, <code>NO_INDEX_FFS(tabela)</code>, <code>NO_INDEX_SS(tabela índice)</code></li>
</ul>



<h3 class="wp-block-heading">INVISIBLE (NO_USE_INVISIBLE_INDEXES / USE_INVISIBLE_INDEXES)</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Controla se o Otimizador pode ou não considerar índices marcados como invisíveis.</li>



<li><strong>Sintaxe</strong>: <code>USE_INVISIBLE_INDEXES</code> / <code>NO_USE_INVISIBLE_INDEXES</code></li>



<li><strong>Status</strong>: Disponível a partir do Oracle 11g R2+ (quando índices invisíveis foram introduzidos).</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-0847033c8f07ab19b2391aa4e33e5d3f">L</h2>



<h3 class="wp-block-heading">LEADING</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Define a tabela ou a sequência de tabelas que o Oracle deve usar primeiro em <em>joins</em>.</li>



<li><strong>Sintaxe</strong>: <code>LEADING(t1 t2 t3 ...)</code></li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-756b3f72a50a3b7a8d810abb64f77a2a">M</h2>



<h3 class="wp-block-heading">MERGE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força a fusão de <em>views</em> no plano de execução.</li>



<li><strong>Sintaxe</strong>: <code>MERGE(tabela/view)</code></li>
</ul>



<h3 class="wp-block-heading">MERGE_AJ</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Transforma subconsulta <code>NOT IN</code> em <em>merge anti-join</em>.</li>



<li><strong>Status</strong>: Depreciado no 10g.</li>
</ul>



<h3 class="wp-block-heading">MONITOR / NO_MONITOR</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Ativa ou desativa o monitoramento de query em tempo de execução (para V$SQL_MONITOR).</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ MONITOR */ ...</code> ou <code>SELECT /*+ NO_MONITOR */ ...</code></li>



<li><strong>Status</strong>: Introduzido no Oracle 11g para melhor monitoramento de SQL em tempo real.</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-4828f3b5101eb988fffee4dde0c3145f">N</h2>



<h3 class="wp-block-heading">NL_AJ / NL_SJ</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Forçam <em>nested loop anti-join</em> ou <em>nested loop semi-join</em>.</li>



<li><strong>Status</strong>: Obsoletos em algumas versões.</li>
</ul>



<h3 class="wp-block-heading">NO_EXPAND</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Impede a expansão de consultas com OR ou IN-lists em <code>UNION ALL</code>.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ NO_EXPAND */ ...</code></li>
</ul>



<h3 class="wp-block-heading">NO_MERGE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Impede a fusão de <em>views</em>.</li>



<li><strong>Sintaxe</strong>: <code>NO_MERGE(tabela/view)</code></li>
</ul>



<h3 class="wp-block-heading">NO_PARALLEL / NOPARALLEL</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Desativa a execução paralela, mesmo que a tabela tenha atributo <code>PARALLEL</code>.</li>



<li><strong>Sintaxe</strong>: <code>NO_PARALLEL(tabela)</code></li>
</ul>



<h3 class="wp-block-heading">NO_PARALLEL_INDEX</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Evita <em>parallel index scan</em>.</li>



<li><strong>Sintaxe</strong>: <code>NO_PARALLEL_INDEX(tabela índice)</code></li>
</ul>



<h3 class="wp-block-heading">NO_PUSH_PRED / NO_PUSH_SUBQ</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Impede que predicados ou subconsultas sejam “empurrados” para etapas anteriores do plano de execução.</li>



<li><strong>Sintaxe</strong>: <code>NO_PUSH_PRED</code>, <code>NO_PUSH_SUBQ</code></li>
</ul>



<h3 class="wp-block-heading">NO_QUERY_TRANSFORMATION</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Desabilita transformações internas de consulta (por exemplo, unnesting, etc.).</li>



<li><strong>Sintaxe</strong>: <code>NO_QUERY_TRANSFORMATION</code></li>
</ul>



<h3 class="wp-block-heading">NO_REWRITE / NOREWRITE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Desabilita o uso de <em>materialized views</em> para reescrever a query.</li>



<li><strong>Sintaxe</strong>: <code>NO_REWRITE</code> (renomeado a partir de <code>NOREWRITE</code> no 10g)</li>
</ul>



<h3 class="wp-block-heading">NO_STAR_TRANSFORMATION</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Impede que o otimizador faça a transformação <em>star</em>.</li>



<li><strong>Sintaxe</strong>: <code>NO_STAR_TRANSFORMATION</code></li>
</ul>



<h3 class="wp-block-heading">NO_USE_HASH / NO_USE_MERGE / NO_USE_NL</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Forçam o otimizador a <strong>não</strong> usar <em>hash join</em>, <em>merge join</em> ou <em>nested loops</em>.</li>



<li><strong>Sintaxe</strong>: <code>NO_USE_HASH(tabela)</code>, <code>NO_USE_MERGE(tabela)</code>, <code>NO_USE_NL(tabela)</code></li>
</ul>



<h3 class="wp-block-heading">NOCACHE</h3>



<ul class="wp-block-list">
<li>Ver <strong>CACHE</strong> / <strong>NOCACHE</strong>.</li>
</ul>



<h3 class="wp-block-heading">NOAPPEND</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Desabilita inserção via <em>direct path</em>, mesmo se <code>APPEND</code> estiver setado como default.</li>



<li><strong>Sintaxe</strong>: <code>NOAPPEND</code></li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-ac22bc5c29f8cb43e502802923f82011">O</h2>



<h3 class="wp-block-heading">OPT_PARAM</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Altera parâmetros de otimização apenas para aquela query (como se fosse um <em>session-level hint</em>).</li>



<li><strong>Exemplo</strong>: <code>SELECT /*+ OPT_PARAM('_optimizer_cost_based_transformation' 'off') */ ...</code></li>



<li><strong>Status</strong>: Útil para tunar consultas sem alterar parâmetros de todo o banco.</li>
</ul>



<h3 class="wp-block-heading">ORDERED</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Faz o Oracle fazer <em>joins</em> na ordem em que as tabelas aparecem no <code>FROM</code>.</li>



<li><strong>Sintaxe</strong>: <code>ORDERED</code></li>
</ul>



<h3 class="wp-block-heading">ORDERED_PREDICATES</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Solicita que o Oracle avalie os predicados na ordem que aparecem na cláusula WHERE.</li>



<li><strong>Status</strong>: Depreciado no 10g.</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-7ffb8d8ff9aaae56ff95b0e9cc278d8c">P</h2>



<h3 class="wp-block-heading">PARALLEL</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Ativa a execução paralela para a tabela especificada. Pode receber grau de paralelismo.</li>



<li><strong>Sintaxe</strong>: <code>PARALLEL(tabela, DOP)</code> ou <code>PARALLEL(tabela, DEFAULT)</code></li>
</ul>



<h3 class="wp-block-heading">PQ_DISTRIBUTE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Controla a distribuição de linhas entre <em>slaves</em> no join paralelo.</li>



<li><strong>Sintaxe</strong>: <code>PQ_DISTRIBUTE(tabela, método_produtor, método_consumidor)</code></li>
</ul>



<h3 class="wp-block-heading">PUSH_PRED / PUSH_SUBQ</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Forçam o “empurrão” de predicados ou subconsultas para etapas anteriores do plano.</li>



<li><strong>Sintaxe</strong>: <code>PUSH_PRED</code>, <code>PUSH_SUBQ</code></li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-06393fed843175c908c3d8b39cb668a3">Q</h2>



<h3 class="wp-block-heading">QB_NAME</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Nomeia um bloco de consulta (query block) para efeitos de análise e aplicação de outros <em>hints</em>.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ QB_NAME(meu_bloco) */ ...</code></li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-dd1b5a8ed63d8af317038b7f993b50d9">R</h2>



<h3 class="wp-block-heading">REWRITE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força a reescrita da consulta usando <em>materialized views</em> disponíveis (independente do custo).</li>



<li><strong>Sintaxe</strong>: <code>REWRITE</code></li>
</ul>



<h3 class="wp-block-heading">RESULT_CACHE / NO_RESULT_CACHE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Faz caching do resultado da query (ou impede caching) no <em>Query Result Cache</em>.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ RESULT_CACHE */ ...</code> ou <code>SELECT /*+ NO_RESULT_CACHE */ ...</code></li>



<li><strong>Status</strong>: Disponível a partir do 11g para frente, se o <em>result cache</em> estiver habilitado.</li>
</ul>



<h3 class="wp-block-heading">ROWID</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força acesso via ROWID na tabela especificada.</li>



<li><strong>Sintaxe</strong>: <code>ROWID(tabela)</code></li>



<li><strong>Status</strong>: Depreciado no 10g.</li>
</ul>



<h3 class="wp-block-heading">RULE</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força o uso do <strong>Rule-Based Optimizer</strong>. Ignora quaisquer outros hints.</li>



<li><strong>Status</strong>: Obsoleto a partir do 10g (Oracle praticamente não usa mais RBO).</li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-38474664e48aacf1a9affd5a1831ee00">S</h2>



<h3 class="wp-block-heading">SPREAD_MIN_ANALYSIS</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Reduz algumas otimizações de planilha interna, focando em análises mínimas.</li>



<li><strong>Status</strong>: Oracle 10g+.</li>
</ul>



<h3 class="wp-block-heading">STAR</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força a tabela maior a ser <em>joinada</em> por último usando <em>nested loops</em> em índices.</li>



<li><strong>Status</strong>: Depreciado no 10g.</li>
</ul>



<h3 class="wp-block-heading">STAR_TRANSFORMATION</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Permite o melhor plano gerado via transformação <em>star</em>.</li>



<li><strong>Sintaxe</strong>: <code>STAR_TRANSFORMATION</code></li>
</ul>



<h3 class="wp-block-heading">SWAP_JOIN_INPUTS</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Instrui o otimizador a inverter a ordem das tabelas no join, trocando o lado do driver e driven na operação de join</li>



<li><strong>Sintaxe</strong>: <code>SWAP_JOIN_INPUTS(tabela)</code></li>



<li><strong>Observação:</strong> Pode melhorar o desempenho quando a ordem natural de join do otimizador não é a ideal.</li>
</ul>



<h3 class="wp-block-heading">SWAP_JOIN_INPUTS_AJ</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Similar ao SWAP_JOIN_INPUTS, mas aplicado para anti-joins. (subqueries transformadas em NOT EXISTS ou JOIN anti-join).</li>



<li><strong>Sintaxe</strong>: <code>SWAP_JOIN_INPUTS_AJ(tabela)</code></li>
</ul>



<h2 class="wp-block-heading has-vivid-cyan-blue-color has-light-green-cyan-background-color has-text-color has-background has-link-color wp-elements-51fe779b279f2e3494d5b38936a0f173">U</h2>



<h3 class="wp-block-heading">UNNEST / NO_UNNEST</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Controlam a “descompactação” (unnesting) de subconsultas, transformando-as em <em>joins</em>.</li>



<li><strong>Sintaxe</strong>: <code>UNNEST</code> ou <code>NO_UNNEST</code></li>
</ul>



<h3 class="wp-block-heading">USE_SEMI</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Força o otimizador a usar semi-joins (subqueries transformadas em EXISTS ou JOIN com filtragem).</li>



<li><strong>Sintaxe</strong>: USE_SEMI(tabela)</li>
</ul>



<h3 class="wp-block-heading">USE_CONCAT</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Converte condições OR em um <code>UNION ALL</code>.</li>



<li><strong>Sintaxe</strong>: <code>SELECT /*+ USE_CONCAT */ ...</code></li>
</ul>



<h3 class="wp-block-heading">USE_ANTI</h3>



<ul class="wp-block-list">
<li><strong>Função:</strong> Força o otimizador a usar anti-joins (subqueries transformadas em NOT EXISTS ou JOIN anti-join).</li>



<li><strong>Sintaxe:</strong> USE_ANTI(tabela)</li>
</ul>



<h3 class="wp-block-heading">USE_HASH / USE_MERGE / USE_NL</h3>



<ul class="wp-block-list">
<li><strong>Função</strong>: Forçam o uso de <em>hash join</em>, <em>merge join</em> ou <em>nested loops</em> para as tabelas especificadas.</li>



<li><strong>Sintaxe</strong>: <code>USE_HASH(tabela1 tabela2)</code>, <code>USE_MERGE(tabela1 tabela2)</code>, <code>USE_NL(tabela1 tabela2)</code></li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h1 class="wp-block-heading">Dica sobre a Dica..</h1>



<p></p>



<ol class="wp-block-list">
<li><strong>Versão do Oracle</strong>: Alguns hints surgiram ou foram removidos em certas versões. Sempre verifique a documentação da sua versão específica (10g, 11g, 12c, 18c, 19c, 21c, etc.).</li>



<li><strong>Sintaxe Exata</strong>: Um simples erro de ortografia (por exemplo, esquecer o “+” em <code>/*+ ... */</code>, escrever <code>INDEXS</code> em vez de <code>INDEX</code>) faz o Oracle ignorar completamente o <em>hint</em>.</li>



<li><strong>Estatísticas Atualizadas</strong>: O Cost Based Optimizer (CBO) funciona melhor com estatísticas de tabelas e índices coerentes. Sem elas, mesmo os <em>hints</em> podem produzir resultados inconsistentes.</li>



<li><strong>Ferramentas de Análise</strong>:
<ul class="wp-block-list">
<li>Use <code>EXPLAIN PLAN</code> e <code>DBMS_XPLAN.DISPLAY</code> (ou <code>DBMS_XPLAN.DISPLAY_CURSOR</code>) para verificar se o <em>hint</em> foi aplicado e qual foi o plano de execução.</li>



<li>Verifique também colunas como <code>NOTE</code> que podem indicar se houve “unrecognized hint” ou “hint ignored”.</li>
</ul>
</li>



<li><strong>Relevância</strong>:
<ul class="wp-block-list">
<li>Alguns <em>hints</em> (especialmente os marcados como <strong>dep.</strong> ou <strong>deprecated</strong>) podem não ter efeito.</li>



<li>Muitos <em>hints</em> antigos foram substituídos por melhorias automáticas no CBO nas versões recentes.</li>
</ul>
</li>



<li><strong>Testes A/B</strong>: Sempre compare o plano de execução com e sem o <em>hint</em>. Às vezes, o otimizador padrão pode ser melhor do que forçar um caminho específico.</li>



<li><strong>Documentação Oficial</strong>: Consulte o capítulo “Hints” do <em>Oracle Database SQL Tuning Guide</em> para sua versão.</li>
</ol>



<p>Boa consulta e bons tunings!</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://furushima.com.br/blog/como-usar-hint-no-oracle/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Entendendo o Plano de Execução no Oracle: Como Melhorar a Performance das Suas Consultas SQL &#8211; PARTE 1</title>
		<link>https://furushima.com.br/blog/entendendo-o-plano-de-execucao-no-oracle-como-melhorar-a-performance-das-suas-consultas-sql-parte-1/</link>
		
		<dc:creator><![CDATA[Carlos Furushima]]></dc:creator>
		<pubDate>Fri, 21 Feb 2025 19:08:00 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[ORACLE]]></category>
		<category><![CDATA[Performance&Tuning]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2536</guid>

					<description><![CDATA[O Poder do SQL e o Desafio da Performance Uma das grandes vantagens do SQL é sua natureza declarativa. Isso significa que você não precisa dizer ao banco de dados como obter os dados; basta especificar o que deseja. O otimizador do Oracle (CBO) cuida de encontrar a melhor forma de executar sua consulta. No [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>O Poder do SQL e o Desafio da Performance</p>



<p>Uma das grandes vantagens do SQL é sua natureza declarativa. Isso significa que você não precisa dizer ao banco de dados como obter os dados; basta especificar o que deseja. O otimizador do Oracle (CBO) cuida de encontrar a melhor forma de executar sua consulta.</p>



<p>No entanto, nem sempre o caminho escolhido pelo banco de dados é o mais eficiente. Em consultas complexas ou com grandes volumes de dados, a performance pode ser impactada. Mas como identificar e corrigir esses problemas?</p>



<p><em>A resposta está no plano de execução.</em></p>



<p></p>



<p><strong>O Que é um Plano de Execução?</strong></p>



<p>O Execution Plan (Plano de Execução) é um roteiro detalhado que descreve o caminho que o Oracle seguirá para recuperar os dados solicitados em uma consulta SQL. Esse plano é gerado durante a fase de análise (parser) da instrução SQL.<br>Para construir esse caminho de execução, o Oracle considera diversas informações, entre elas:</p>



<ul class="wp-block-list">
<li>Estatísticas do banco de dados: Incluem system statistics (estatísticas do sistema) e data statistics (estatísticas dos dados), que ajudam a prever a melhor forma de acessar as tabelas e índices.</li>
</ul>



<ul class="wp-block-list">
<li>Parâmetros da instância do banco de dados: Configurações específicas da instância que influenciam as decisões do otimizador.</li>
</ul>



<p></p>



<p>Esses fatores fornecem insumos para o CBO (Cost-Based Optimizer), o otimizador do Oracle, que calcula a estratégia mais eficiente para executar a consulta SQL. Dessa forma, o plano de execução representa a melhor estimativa do banco de dados sobre como recuperar as informações da maneira mais rápida e eficiente possível.</p>



<p><strong>Diferença entre Execution Plan e Explain Plan</strong></p>



<p>EXPLAIN PLAN (Planos de Explicação) e EXECUTION PLAN (Plano de execução): Qual a Diferença?</p>



<p>Ao trabalhar com consultas SQL no Oracle, é essencial entender a diferença entre dois tipos de planos: EXPLAIN PLAN e EXECUTION PLAN.</p>



<p><em><strong>Explain Plan (Planos de Explicação)</strong></em></p>



<p>O EXPLAIN PLAN é uma previsão do que o Oracle planeja fazer para executar a consulta. Quando você roda um EXPLAIN PLAN, o banco de dados gera um plano estimado de execução, com base nas estatísticas atuais das tabelas e nos algoritmos do otimizador. Isso pode ser útil para entender a estratégia escolhida pelo otimizador antes de realmente executar a consulta.</p>



<p>No entanto, o EXPLAIN PLAN pode estar errado ou ser diferente do plano real de execução, porque:</p>



<p>Ele não executa a consulta de fato, apenas faz uma previsão.</p>



<p>Se as estatísticas do banco de dados estiverem desatualizadas, a previsão pode ser imprecisa.</p>



<p></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="
EXPLAIN PLAN FOR 
SELECT * FROM TABELA_XPTO WHERE coluna = 'valor';

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"></span>
<span class="line"><span style="color: #D4D4D4">EXPLAIN PLAN </span><span style="color: #569CD6">FOR</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> * </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> TABELA_XPTO </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> coluna = </span><span style="color: #CE9178">&#39;valor&#39;</span><span style="color: #D4D4D4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> * </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TABLE</span><span style="color: #D4D4D4">(DBMS_XPLAN.DISPLAY);</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<p><strong><em>Execution Plan (Plano de execução)</em></strong></p>



<p>O EXECUTION PLAN, por outro lado, mostra o que realmente aconteceu quando a consulta foi executada. Ele exibe:</p>



<p>A sequência exata de operações realizadas pelo banco de dados.<br>O tempo gasto em cada operação.<br>O número real de linhas processadas.<br>O impacto da E/S (leitura e escrita em disco ou memória).<br>Se a consulta utilizou índices, joins, ordenações ou full table scans.</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="SELECT * FROM TABLE(dbms_xplan.display_cursor('&lt;SQL_ID&gt;','&lt;CHILD_NUMBER&gt;','ALLSTATS LAST  +PEEKED_BINDS +PREDICATE +COST +BYTES ADVANCED'));
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> * </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TABLE</span><span style="color: #D4D4D4">(dbms_xplan.display_cursor(</span><span style="color: #CE9178">&#39;&lt;SQL_ID&gt;&#39;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;&lt;CHILD_NUMBER&gt;&#39;</span><span style="color: #D4D4D4">,</span><span style="color: #CE9178">&#39;ALLSTATS LAST  +PEEKED_BINDS +PREDICATE +COST +BYTES ADVANCED&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<p>Ao analisar a rota seguida pelo banco de dados, você pode identificar se ele escolheu o caminho mais eficiente ou se há uma alternativa ainda mais rápida, como a criação de um atalho.</p>



<p>Abaixo está o plano de execução para a junção de duas tabelas:</p>



<pre class="wp-block-preformatted has-d-4-d-4-d-4-color has-text-color has-875-rem-font-size">--------------------------------------<br>| Id  | Operation          | Name    |<br>--------------------------------------<br>|   0 | SELECT STATEMENT   |         |<br>|   1 |  HASH JOIN         |         |<br>|   2 |   TABLE ACCESS FULL| TAB_A   |<br>|   3 |   TABLE ACCESS FULL| TAB_B   |<br>--------------------------------------<br><br><br>Cada linha no Execution Plan (Plano de Execução) representa uma operação distinta. Essas operações estão organizadas em uma estrutura hierárquica, formando um relacionamento de pai/filho.<br><br>O plano pode ser visualizado como uma árvore. A instrução SELECT, localizada no topo, é a raiz; as tabelas, situadas na parte inferior, são as folhas; e, entre elas, há uma série de operações intermediárias.<br><br>Essas operações se dividem em três categorias principais:<br><br>- Single-child operations (Operações de filho único)<br>- Multichild operations (Operações de múltiplos filhos)<br>- Joins (Junções)</pre>



<p class="has-text-align-left"></p>



<h2 class="wp-block-heading"><strong>Single-child operations (Operações de filho único)</strong></h2>



<p>Como o nome sugere, esse tipo de operação sempre possui <strong>exatamente uma operação</strong> abaixo dela na árvore do plano de execução. Exemplos comuns incluem:</p>



<ul class="wp-block-list">
<li><strong>Grouping (Agrupamento)</strong></li>



<li><strong>Sorting (Ordenação)</strong></li>
</ul>



<p></p>



<h3 class="wp-block-heading"><strong>Multichild operations (Operações de múltiplos filhos)</strong></h3>



<p>Essas operações podem ter <strong>uma ou mais operações abaixo delas</strong> e são mais raras. A mais comum que pode aparecer no plano de execução é a operação <strong>UNION (ALL)</strong>, que combina os resultados de múltiplas consultas.</p>



<p></p>



<h3 class="wp-block-heading"><strong>Joins (Junções)</strong></h3>



<p>As junções sempre possuem <strong>exatamente dois filhos</strong>. Esses filhos podem ser:</p>



<ul class="wp-block-list">
<li>Outras junções</li>



<li>Tabelas</li>



<li>Qualquer outra operação do plano de execução</li>
</ul>



<p>Cada um desses componentes desempenha um papel essencial na forma como o banco de dados processa a consulta, influenciando diretamente a eficiência e o desempenho da execução.</p>



<p class="has-medium-font-size"><strong>Como Ler ou Interpretar um Execution Plan (Plano de Execução)</strong></p>



<p>Em um Execution Plan (Plano de Execução) baseado em texto, a estrutura hierárquica das operações é representada pelo nível de recuo (indentação). Esse recuo indica o relacionamento <strong>pai/filho</strong> entre as operações.</p>



<ul class="wp-block-list">
<li><strong>Operação pai</strong>: É sempre a primeira linha acima de uma operação, com um recuo menor.</li>



<li><strong>Operações filhas</strong>: São as linhas logo abaixo da operação pai, recuadas mais para a direita. Elas pertencem à operação pai até que outra linha com o mesmo nível de recuo apareça.<br></li>
</ul>



<p></p>



<p>Essa estrutura ajuda a visualizar como as operações se relacionam e a entender a ordem em que o banco de dados executa cada etapa da consulta.</p>



<p></p>



<p>Para ilustrar a estrutura hierárquica de um <strong>Execution Plan (Plano de Execução)</strong> no Oracle, vamos analisar um exemplo prático. Suponha que temos duas tabelas: <code>clientes</code> e <code>pedidos</code>. Desejamos selecionar todos os clientes e seus respectivos pedidos. A consulta SQL seria:</p>



<pre class="wp-block-code"><code>
SELECT c.nome, p.numero_pedido
FROM clientes c
JOIN pedidos p ON c.cliente_id = p.cliente_id;
</code></pre>



<p>Ao gerar o plano de execução para essa consulta, obteríamos uma saída semelhante a:</p>



<pre class="wp-block-code"><code>--------------------------------------------------------------------------------
| Id  | Operation           | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------------
|   0 | SELECT STATEMENT    |         |   100 |  5200 |    10   (0)| 00:00:01 |
|*  1 |  HASH JOIN          |         |   100 |  5200 |    10   (0)| 00:00:01 |
|   2 |   TABLE ACCESS FULL | CLIENTES|   100 |  2600 |     5   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL | PEDIDOS |   200 |  5200 |     5   (0)| 00:00:01 |
--------------------------------------------------------------------------------

Vamos interpretar esse plano de execução, destacando as relações pai/filho:

<strong>Operação Raiz (Pai Principal):</strong>

Id 0: SELECT STATEMENT é a operação raiz. Todas as outras operações são suas filhas diretas ou indiretas.

<strong>Operação Filha da Raiz:
</strong>
Id 1: HASH JOIN é filha direta do SELECT STATEMENT. Esta operação combina as tabelas CLIENTES e PEDIDOS usando um algoritmo de junção hash.
Operações Filhas do HASH JOIN:

Id 2: TABLE ACCESS FULL na tabela CLIENTES. Esta operação lê toda a tabela CLIENTES e fornece os dados para o HASH JOIN.

Id 3: TABLE ACCESS FULL na tabela PEDIDOS. Similarmente, lê toda a tabela PEDIDOS e passa os dados para o HASH JOIN.

<strong>Observações Importantes:
</strong>Recuo (Indentação): No plano de execução baseado em texto, o nível de recuo indica a hierarquia das operações. Operações com maior recuo são filhas da operação imediatamente acima com menor recuo.

<strong>Relação Pai/Filho:
</strong>
SELECT STATEMENT é o pai do HASH JOIN.
HASH JOIN é pai das operações TABLE ACCESS FULL das tabelas CLIENTES e PEDIDOS.

Entender essa estrutura hierárquica é crucial para analisar como o Oracle executa a consulta e identificar possíveis otimizações, como a criação de índices ou a reescrita da consulta para melhorar o desempenho.
</code></pre>



<figure class="wp-block-image size-full"><img alt="" fetchpriority="high" decoding="async" width="423" height="279" src="https://furushima.com.br/wp-content/uploads/2025/02/image-13.png" alt="" class="wp-image-2540" srcset="https://furushima.com.br/wp-content/uploads/2025/02/image-13.png 423w, https://furushima.com.br/wp-content/uploads/2025/02/image-13-300x198.png 300w" sizes="(max-width: 423px) 100vw, 423px" /></figure>



<h2 class="wp-block-heading"><strong>Passo a Passo do Execution Plan</strong></h2>



<p>1 &#8211; <strong>Primeira operação (Seta Vermelha) &#8211; Busca inicial das tabelas <code>COLOURS</code> e <code>TOYS</code></strong></p>



<ul class="wp-block-list">
<li>A execução começa buscando os dados da tabela <strong>COLOURS</strong> (<code>TABLE ACCESS FULL</code>, linha 4).</li>



<li>Em seguida, os dados da tabela <strong>TOYS</strong> são buscados (<code>TABLE ACCESS FULL</code>, linha 5).</li>



<li>Esses dados são passados para o primeiro <strong>HASH JOIN</strong> (<code>linha 3</code>), que combina os resultados dessas tabelas.<br></li>
</ul>



<ol class="wp-block-list"></ol>



<p></p>



<p>2 &#8211; <strong>Segunda operação (Seta Roxa) &#8211; Adicionando a tabela <code>PENS</code></strong></p>



<ul class="wp-block-list">
<li>Após a junção das tabelas <code>COLOURS</code> e <code>TOYS</code>, o banco acessa a tabela <strong>PENS</strong> (<code>TABLE ACCESS FULL</code>, linha 6).</li>



<li>O resultado do primeiro <strong>HASH JOIN</strong> é combinado com os dados da tabela <code>PENS</code> através de outro <strong>HASH JOIN</strong> (<code>linha 2</code>).</li>



<li>Neste ponto, temos um novo dataset contendo os dados já filtrados e processados.<br></li>
</ul>



<ol class="wp-block-list"></ol>



<p></p>



<p>3 &#8211; <strong>Terceira operação (Seta Laranja) &#8211; Busca na tabela <code>BRICKS</code></strong></p>



<ul class="wp-block-list">
<li>O próximo passo é buscar os dados da tabela <strong>BRICKS</strong> (<code>TABLE ACCESS FULL</code>, linha 7).</li>



<li>O resultado da junção anterior (dataset da etapa 2) é agora unido à tabela <code>BRICKS</code> por meio de um <strong>HASH JOIN</strong> (<code>linha 1</code>).<br></li>
</ul>



<ol class="wp-block-list"></ol>



<p></p>



<p>4 &#8211; <strong>Última operação (Seta Verde) &#8211; Retorno do resultado</strong></p>



<ul class="wp-block-list">
<li>O <strong>HASH JOIN</strong> final combina todos os resultados e retorna os dados ao cliente através do <strong>SELECT STATEMENT</strong> (<code>linha 0</code>).</li>



<li>Como não há mais filhos na estrutura, essa etapa finaliza a execução.<br><br></li>
</ul>



<ol class="wp-block-list"></ol>



<p></p>



<h2 class="wp-block-heading"><strong>Resumo da Ordem de Execução</strong></h2>



<p>A ordem correta de execução pode ser descrita assim:</p>



<ol class="wp-block-list">
<li><code>TABLE ACCESS FULL COLOURS</code> (linha 4) → primeiro conjunto de dados.</li>



<li><code>TABLE ACCESS FULL TOYS</code> (linha 5) → segundo conjunto de dados.</li>



<li><code>HASH JOIN</code> (linha 3) → combinação de <code>COLOURS</code> e <code>TOYS</code>.</li>



<li><code>TABLE ACCESS FULL PENS</code> (linha 6) → terceiro conjunto de dados.</li>



<li><code>HASH JOIN</code> (linha 2) → combinação do resultado do primeiro HASH JOIN com <code>PENS</code>.</li>



<li><code>TABLE ACCESS FULL BRICKS</code> (linha 7) → quarto conjunto de dados.</li>



<li><code>HASH JOIN</code> (linha 1) → combinação do resultado da segunda junção com <code>BRICKS</code>.</li>



<li><code>SELECT STATEMENT</code> (linha 0) → retorna o resultado final ao cliente.</li>
</ol>



<p></p>



<p></p>



<p></p>



<p></p>



<p></p>



<p>Compreender a estrutura e a ordem de execução de um plano de execução é essencial para diagnosticar e otimizar o desempenho de consultas no Oracle Database. Ao analisar detalhadamente cada operação e suas interações, é possível identificar gargalos e aplicar melhorias específicas, resultando em consultas mais eficientes e sistemas mais responsivos.</p>



<p></p>



<p>Referencias : <br><a href="https://blogs.oracle.com/connect/post/how-to-read-an-execution-plan">https://blogs.oracle.com/connect/post/how-to-read-an-execution-plan</a></p>



<p></p>



<p></p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
