<?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>TUNING &#8211; Furushima</title>
	<atom:link href="https://furushima.com.br/blog/tag/tuning/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>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>Como ativar o Slow Query log no SQL Server?</title>
		<link>https://furushima.com.br/blog/como-ativar-o-slow-query-log-no-sql-server/</link>
		
		<dc:creator><![CDATA[Matsuo]]></dc:creator>
		<pubDate>Thu, 13 Mar 2025 18:25:39 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[TUNING]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2655</guid>

					<description><![CDATA[Como Capturar Queries Lentas no SQL Server? Se você vem do mundo MySQL, PostgreSQL ou até mesmo Oracle, pode já ter se perguntado: como capturar queries lentas no SQL Server? No MySQL, temos o slow_query_log , no PostgreSQL, o pg_stat_statements/ slowquery e Oracle AWR/ASH* podem ajudar. Mas e no SQL Server? Podemos analisar queries em [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">Como Capturar Queries Lentas no SQL Server?</h2>



<p>Se você vem do mundo MySQL, PostgreSQL ou até mesmo Oracle, pode já ter se perguntado: <strong>como capturar queries lentas no SQL Server?</strong></p>



<p>No MySQL, temos o <code>slow_query_log</code> , no PostgreSQL, o <code>pg_stat_statements</code>/ slowquery  e Oracle AWR/ASH* podem ajudar. Mas e no SQL Server? </p>



<p>Podemos analisar queries em execução no momento utilizando <code>sys.dm_exec_requests</code>, mas e se quisermos consultar o histórico?</p>



<p>Err.. Dai habilitamos o Query Store!</p>



<p>Uma boa solução o <strong>Query Store</strong>. Ele permite armazenar e analisar estatísticas de execução de queries ao longo do tempo. No entanto, dependendo do volume de dados e da granularidade desejada, ele pode não ser a melhor opção para um monitoramento detalhado.</p>



<p>Foi nesse contexto que pesquisei alternativas e encontrei uma solução eficiente: <strong>o uso de Extended Events (XEvents)</strong>. Se você também busca uma forma confiável de capturar queries lentas no SQL Server, este artigo é para você.</p>



<p><strong>Referências:</strong></p>



<ul class="wp-block-list">
<li>Documentação oficial da Microsoft sobre <a href="https://learn.microsoft.com/en-us/sql/relational-databases/performance/monitoring-performance-by-using-the-query-store?view=sql-server-ver16">Query Store</a></li>



<li>Blog do <a href="https://www.dirceuresende.com/">Dirceu Resende</a></li>
</ul>



<p></p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Monitorando Queries Lentas com Extended Events</p>



<p>A partir do SQL Server 2012, os <strong>Extended Events (XEvents)</strong> se tornaram uma das melhores formas de capturar eventos internos do SQL Server. Eles funcionam como um sistema de auditoria leve e personalizável, permitindo registrar queries lentas, deadlocks, commits e por ai vai..</p>



<p>Podemos compará-los a <strong>triggers</strong>, mas ao invés de serem executados em nível de tabela, eles capturam eventos no nível da instância do SQL Server.</p>



<p><a href="https://learn.microsoft.com/en-us/sql/relational-databases/extended-events/quick-start-extended-events-in-sql-server?view=sql-server-ver16">Extended Events (XEvents)</a></p>



<h2 class="wp-block-heading">1º Criar o Evento de Captura</h2>



<p>Antes de tudo, precisamos criar um <strong>evento de captura</strong> para registrar as queries demoradas. Para isso, utilizaremos o Extended Events, garantindo que os arquivos de saída sejam gravados em um diretório onde o SQL Server tenha permissão de escrita, no meu caso.</p>



<p>K:\SLOW_QUERIES</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="CREATE EVENT SESSION [SLOW_QUERIES] ON SERVER  
ADD EVENT sqlserver.sql_batch_completed (  
    ACTION (  
        sqlserver.session_id,  
        sqlserver.client_app_name,  
        sqlserver.client_hostname,  
        sqlserver.database_name,  
        sqlserver.username,  
        sqlserver.session_nt_username,  
        sqlserver.session_server_principal_name,  
        sqlserver.sql_text  
    )  
    WHERE duration &gt; 5000000  -- AJUSTE O TEMPO CONFORME SUA NECESSIDADE
)  
ADD TARGET package0.event_file (  
    SET filename = N'K:\SLOW_QUERIES\slow.xel',   -- AQUI TAMBEM, AJUSTE SEU DIRETORIO
        max_file_size = 10,  
        max_rollover_files = 10  
)  
WITH (STARTUP_STATE = ON);  
GO  

-- Ativa o Extended Event
ALTER EVENT SESSION [SLOW_QUERIES] ON SERVER STATE = START
GO" 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">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">EVENT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SESSION</span><span style="color: #D4D4D4"> [SLOW_QUERIES] </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SERVER</span><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #569CD6">ADD</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">EVENT</span><span style="color: #D4D4D4"> sqlserver.sql_batch_completed (  </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ACTION</span><span style="color: #D4D4D4"> (  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.session_id,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.client_app_name,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.client_hostname,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.database_name,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.username,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.session_nt_username,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.session_server_principal_name,  </span></span>
<span class="line"><span style="color: #D4D4D4">        sqlserver.sql_text  </span></span>
<span class="line"><span style="color: #D4D4D4">    )  </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> duration &gt; </span><span style="color: #B5CEA8">5000000</span><span style="color: #D4D4D4">  </span><span style="color: #6A9955">-- AJUSTE O TEMPO CONFORME SUA NECESSIDADE</span></span>
<span class="line"><span style="color: #D4D4D4">)  </span></span>
<span class="line"><span style="color: #569CD6">ADD</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TARGET</span><span style="color: #D4D4D4"> package0.event_file (  </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">SET</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">filename</span><span style="color: #D4D4D4"> = </span><span style="color: #CE9178">N&#39;K:\SLOW_QUERIES\slow.xel&#39;</span><span style="color: #D4D4D4">,   </span><span style="color: #6A9955">-- AQUI TAMBEM, AJUSTE SEU DIRETORIO</span></span>
<span class="line"><span style="color: #D4D4D4">        max_file_size = </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">,  </span></span>
<span class="line"><span style="color: #D4D4D4">        max_rollover_files = </span><span style="color: #B5CEA8">10</span><span style="color: #D4D4D4">  </span></span>
<span class="line"><span style="color: #D4D4D4">)  </span></span>
<span class="line"><span style="color: #569CD6">WITH</span><span style="color: #D4D4D4"> (STARTUP_STATE = </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4">);  </span></span>
<span class="line"><span style="color: #569CD6">GO</span><span style="color: #D4D4D4">  </span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">-- Ativa o Extended Event</span></span>
<span class="line"><span style="color: #569CD6">ALTER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">EVENT</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SESSION</span><span style="color: #D4D4D4"> [SLOW_QUERIES] </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SERVER</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">STATE</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">START</span></span>
<span class="line"><span style="color: #569CD6">GO</span></span></code></pre></div>



<p>neste caso iremos coletar tudo que for acima de 5 segundos , com 10 arquivos de no maximo 10MB, em D:\SLOW_QUERIES\.</p>



<h2 class="wp-block-heading">2º Criar uma Tabela para salvar estes dados</h2>



<p>Agora, precisamos de um local para armazenar os dados coletados pelo XEvents. Criamos uma tabela que receberá as informações capturadas.</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="CREATE TABLE dbo.Historico_Query_Lenta (
    [Dt_Evento] DATETIME,
    [session_id] INT,
    [database_name] VARCHAR(128),
    [username] VARCHAR(128),
    [session_server_principal_name] VARCHAR(128),
    [session_nt_username] VARCHAR(128),
    [client_hostname] VARCHAR(128),
    [client_app_name] VARCHAR(128),
    [duration] DECIMAL(18, 2),
    [cpu_time] DECIMAL(18, 2),
    [logical_reads] BIGINT,
    [physical_reads] BIGINT,
    [writes] BIGINT,
    [row_count] BIGINT,
    [sql_text] XML,
    [batch_text] XML,
    [result] VARCHAR(100)
) WITH(DATA_COMPRESSION=PAGE)
GO" 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">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TABLE</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">dbo</span><span style="color: #D4D4D4">.Historico_Query_Lenta (</span></span>
<span class="line"><span style="color: #D4D4D4">    [Dt_Evento] </span><span style="color: #569CD6">DATETIME</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [session_id] </span><span style="color: #569CD6">INT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [database_name] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [username] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [session_server_principal_name] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [session_nt_username] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [client_hostname] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [client_app_name] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">128</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [duration] </span><span style="color: #569CD6">DECIMAL</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">18</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [cpu_time] </span><span style="color: #569CD6">DECIMAL</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">18</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">    [logical_reads] </span><span style="color: #569CD6">BIGINT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [physical_reads] </span><span style="color: #569CD6">BIGINT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [writes] </span><span style="color: #569CD6">BIGINT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [row_count] </span><span style="color: #569CD6">BIGINT</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [sql_text] </span><span style="color: #569CD6">XML</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [batch_text] </span><span style="color: #569CD6">XML</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">    [result] </span><span style="color: #569CD6">VARCHAR</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">100</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">) </span><span style="color: #569CD6">WITH</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">DATA_COMPRESSION</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">PAGE</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #569CD6">GO</span></span></code></pre></div>



<h2 class="wp-block-heading">3º Criar uma Procedure para Captura dos Dados</h2>



<p>O próximo passo é criar uma <strong>Stored Procedure</strong> para extrair os dados do Extended Events e armazená-los na tabela criada no Passo 2, crie um database de sua escolha , recomendo a ter sempre um database administrativo para tais acoes.</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=" 
CREATE PROCEDURE dbo.stpCarga_Query_Lenta
AS
BEGIN
    
    
    DECLARE 
        @TimeZone INT = DATEDIFF(HOUR, GETUTCDATE(), GETDATE()),
        @Dt_Ultimo_Registro DATETIME = ISNULL((SELECT MAX(Dt_Evento) FROM dbo.Historico_Query_Lenta), '1900-01-01')
 
 
    IF (OBJECT_ID('tempdb..#Eventos') IS NOT NULL) DROP TABLE #Eventos
    ;WITH CTE AS (
        SELECT CONVERT(XML, event_data) AS event_data
        FROM sys.fn_xe_file_target_read_file(N'K:\SLOW_QUERIES\slow*.xel', NULL, NULL, NULL)
    )
    SELECT
        DATEADD(HOUR, @TimeZone, CTE.event_data.value('(//event/@timestamp)[1]', 'datetime')) AS Dt_Evento,
        CTE.event_data
    INTO
        #Eventos
    FROM
        CTE
    WHERE
        DATEADD(HOUR, @TimeZone, CTE.event_data.value('(//event/@timestamp)[1]', 'datetime')) &gt; @Dt_Ultimo_Registro
    
 
    INSERT INTO dbo.Historico_Query_Lenta
    SELECT
        A.Dt_Evento,
        xed.event_data.value('(action[@name=&quot;session_id&quot;]/value)[1]', 'int') AS session_id,
        xed.event_data.value('(action[@name=&quot;database_name&quot;]/value)[1]', 'varchar(128)') AS [database_name],
        xed.event_data.value('(action[@name=&quot;username&quot;]/value)[1]', 'varchar(128)') AS username,
        xed.event_data.value('(action[@name=&quot;session_server_principal_name&quot;]/value)[1]', 'varchar(128)') AS session_server_principal_name,
        xed.event_data.value('(action[@name=&quot;session_nt_username&quot;]/value)[1]', 'varchar(128)') AS [session_nt_username],
        xed.event_data.value('(action[@name=&quot;client_hostname&quot;]/value)[1]', 'varchar(128)') AS [client_hostname],
        xed.event_data.value('(action[@name=&quot;client_app_name&quot;]/value)[1]', 'varchar(128)') AS [client_app_name],
        CAST(xed.event_data.value('(//data[@name=&quot;duration&quot;]/value)[1]', 'bigint') / 1000000.0 AS NUMERIC(18, 2)) AS duration,
        CAST(xed.event_data.value('(//data[@name=&quot;cpu_time&quot;]/value)[1]', 'bigint') / 1000000.0 AS NUMERIC(18, 2)) AS cpu_time,
        xed.event_data.value('(//data[@name=&quot;logical_reads&quot;]/value)[1]', 'bigint') AS logical_reads,
        xed.event_data.value('(//data[@name=&quot;physical_reads&quot;]/value)[1]', 'bigint') AS physical_reads,
        xed.event_data.value('(//data[@name=&quot;writes&quot;]/value)[1]', 'bigint') AS writes,
        xed.event_data.value('(//data[@name=&quot;row_count&quot;]/value)[1]', 'bigint') AS row_count,
        TRY_CAST(xed.event_data.value('(//action[@name=&quot;sql_text&quot;]/value)[1]', 'varchar(max)') AS XML) AS sql_text,
        TRY_CAST(xed.event_data.value('(//data[@name=&quot;batch_text&quot;]/value)[1]', 'varchar(max)') AS XML) AS batch_text,
        xed.event_data.value('(//data[@name=&quot;result&quot;]/text)[1]', 'varchar(100)') AS result
    FROM
        #Eventos A
        CROSS APPLY A.event_data.nodes('//event') AS xed (event_data)
 
 
END" 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: #D4D4D4"> </span></span>
<span class="line"><span style="color: #DCDCAA">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">PROCEDURE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dbo.stpCarga_Query_Lenta</span></span>
<span class="line"><span style="color: #DCDCAA">AS</span></span>
<span class="line"><span style="color: #DCDCAA">BEGIN</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">DECLARE</span><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">@TimeZone</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">INT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DATEDIFF</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">HOUR,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">GETUTCDATE</span><span style="color: #D4D4D4">()</span><span style="color: #CE9178">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">GETDATE</span><span style="color: #D4D4D4">())</span><span style="color: #CE9178">,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">@Dt_Ultimo_Registro</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">DATETIME</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">=</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">ISNULL</span><span style="color: #D4D4D4">((SELECT MAX(Dt_Evento) FROM dbo.Historico_Query_Lenta), &#39;</span><span style="color: #B5CEA8">1900</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">01</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">01</span><span style="color: #D4D4D4">&#39;)</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">IF</span><span style="color: #D4D4D4"> (OBJECT_ID(</span><span style="color: #CE9178">&#39;tempdb..#Eventos&#39;</span><span style="color: #D4D4D4">) IS NOT NULL) DROP TABLE </span><span style="color: #6A9955">#Eventos</span></span>
<span class="line"><span style="color: #D4D4D4">    ;</span><span style="color: #DCDCAA">WITH</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CTE</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">AS</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">SELECT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CONVERT</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">XML,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">event_data</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">AS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">event_data</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">FROM</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">sys.fn_xe_file_target_read_file</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">N</span><span style="color: #DCDCAA">&#39;K:\SLOW_QUERIES\slow*.xel&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NULL,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NULL,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">NULL</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">SELECT</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">DATEADD(HOUR,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@TimeZone,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CTE.event_data.value</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;(//event/@timestamp)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;datetime&#39;</span><span style="color: #D4D4D4">)) AS Dt_Evento,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CTE.event_data</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">INTO</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">#Eventos</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">FROM</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CTE</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">WHERE</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">DATEADD(HOUR,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">@TimeZone,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CTE.event_data.value</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;(//event/@timestamp)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;datetime&#39;</span><span style="color: #D4D4D4">)) &gt; @Dt_Ultimo_Registro</span></span>
<span class="line"><span style="color: #D4D4D4">    </span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">INSERT</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">INTO</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">dbo.Historico_Query_Lenta</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">SELECT</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">A.Dt_Evento,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;session_id&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;int&#39;</span><span style="color: #D4D4D4">) AS session_id,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;database_name&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS [database_name],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;username&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS username,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;session_server_principal_name&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS session_server_principal_name,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;session_nt_username&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS [session_nt_username],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;client_hostname&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS [client_hostname],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(action[@name=&quot;client_app_name&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(128)&#39;</span><span style="color: #D4D4D4">) AS [client_app_name],</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CAST(xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;duration&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) / 1000000.0 AS NUMERIC(</span><span style="color: #DCDCAA">18,</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)) AS duration,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CAST(xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;cpu_time&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) / 1000000.0 AS NUMERIC(</span><span style="color: #DCDCAA">18,</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)) AS cpu_time,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;logical_reads&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) AS logical_reads,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;physical_reads&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) AS physical_reads,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;writes&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) AS writes,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;row_count&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;bigint&#39;</span><span style="color: #D4D4D4">) AS row_count,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">TRY_CAST(xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//action[@name=&quot;sql_text&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(max)&#39;</span><span style="color: #D4D4D4">) AS XML) AS sql_text,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">TRY_CAST(xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;batch_text&quot;]/value)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(max)&#39;</span><span style="color: #D4D4D4">) AS XML) AS batch_text,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">xed.event_data.value(</span><span style="color: #DCDCAA">&#39;(//data[@name=&quot;result&quot;]/text)[1]&#39;</span><span style="color: #DCDCAA">,</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&#39;varchar(100)&#39;</span><span style="color: #D4D4D4">) AS result</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">FROM</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955">#Eventos A</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #DCDCAA">CROSS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">APPLY</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">A.event_data.nodes</span><span style="color: #D4D4D4">(</span><span style="color: #DCDCAA">&#39;//event&#39;</span><span style="color: #D4D4D4">) </span><span style="color: #CE9178">AS</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">xed</span><span style="color: #D4D4D4"> (event_data)</span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #D4D4D4"> </span></span>
<span class="line"><span style="color: #DCDCAA">END</span></span></code></pre></div>



<h2 class="wp-block-heading">4º Criar um Job para coletas frequentes.</h2>



<p>Para garantir que a coleta de queries lentas ocorra de forma contínua, podemos configurar um <strong>SQL Server Agent Job</strong> para executar a stored procedure periodicamente.</p>



<figure class="wp-block-image size-full"><img alt="" fetchpriority="high" decoding="async" width="699" height="651" src="https://furushima.com.br/wp-content/uploads/2025/03/Slow_query-1.gif" alt="" class="wp-image-2657"/></figure>



<p>Então podemos consultar nossa tabela Historico_Query_Lenta onde estarão nossos dados.</p>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Entendendo o Plano de Execução no POSTGRESQL: Como Melhorar a Performance das Suas Consultas SQL – PARTE 2</title>
		<link>https://furushima.com.br/blog/entendendo-o-plano-de-execucao-no-postgresql-como-melhorar-a-performance-das-suas-consultas-sql-parte-2/</link>
		
		<dc:creator><![CDATA[Carlos Furushima]]></dc:creator>
		<pubDate>Mon, 24 Feb 2025 16:33:17 +0000</pubDate>
				<category><![CDATA[Banco De Dados]]></category>
		<category><![CDATA[POSTGRESQL]]></category>
		<category><![CDATA[TUNING]]></category>
		<guid isPermaLink="false">https://furushima.com.br/?p=2566</guid>

					<description><![CDATA[Seguindo a parte 2 do artigo sobre Execution Plan (planos de execução), veremos como é o funcionamento da analise e interpretação de um plano de execução no banco de dados POSTGRESQL. Seguindo o que comumente faço para essa analise, 2 modos podemos estabelecer para essa analise : Similar ao oracle database, o POSTGRESQL utilize a [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p></p>



<p>Seguindo a parte 2 do artigo sobre Execution Plan (planos de execução), veremos como é o funcionamento da analise e interpretação de um plano de execução no banco de dados POSTGRESQL.</p>



<p>Seguindo o que comumente faço para essa analise, 2 modos podemos estabelecer para essa analise :</p>



<ol class="wp-block-list">
<li><strong>Plano de execução em modo texto/tabular, onde é visto de forma indentada os steps.</strong></li>



<li><strong>Plano de execução em modo tree (arvore), onde é visto de forma grafica os steps.</strong></li>
</ol>



<p>Similar ao oracle database, o POSTGRESQL utilize a seguinte metodologia para interpretação de planos de execução, O plano de execução é lido de baixo para cima e da direita para a esquerda, refletindo a sequência em que o PostgreSQL executa as operações.</p>



<p>No PostgreSQL, os planos de execução são lidos de baixo para cima e da direita para a esquerda. Isso significa que:</p>



<ul class="wp-block-list">
<li>A operação mais profunda (mais aninhada) no plano é a primeira a ser executada.</li>



<li>As operações externas ou superiores são executadas posteriormente, processando os dados obtidos das operações inferiores.</li>
</ul>



<p>Essa abordagem permite entender melhor o fluxo da execução da consulta e identificar possíveis gargalos de desempenho.</p>



<p></p>



<p>Para tornar a explicação mais objetiva, vamos analisar um exemplo de query, interpretar seu plano de execução e, posteriormente, verificar possíveis otimizações para tornar a execução do SQL mais eficiente.</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 (
    (SELECT
        poi.supplier_product -&gt;&gt; 'supplier_product_name' AS name,
        poi.price AS price,
        poi.created_at AS expires_at,
        poi.supplier_product -&gt;&gt; 'supplier_product_manufacturer' AS manufacturer,
        poi.supplier_product -&gt;&gt; 'supplier_product_packing' AS packing,
        poi.supplier_product -&gt;&gt; 'supplier_product_pack_quantity' AS pack_quantity,
        poi.supplier_product -&gt;&gt; 'supplier_product_unit_purchase' AS unit_purchase,
        poi.confirmed_quantity AS quantity_price,
        sp.name AS name_supply,
        sp.identifier AS identifier_supply,
        1 AS order_by
    FROM purchase_order_items poi
    INNER JOIN purchase_orders po ON po.id = poi.purchase_order_id
    INNER JOIN buyer_products bp ON bp.buyer_id = po.buyer_id AND
        bp.code = poi.buyer_product -&gt;&gt; 'buyer_product_code'
    INNER JOIN products p ON p.id = bp.base_product_id
    INNER JOIN suppliers sp ON sp.id = po.supplier_id
    WHERE bp.id = 12081956
        AND poi.created_at &lt; '2025-02-21 16:57:59.225571'
    ORDER BY poi.created_at DESC
    LIMIT 3
    )
    UNION ALL
    (SELECT
        bp.name,
        bp.source_price AS price,
        bp.created_at AS expires_at,
        '' AS manufacturer,
        '' AS packing,
        '' AS pack_quantity,
        '' AS unit_purchase,
        0 AS quantity_price,
        '' AS name_supply, 
        '' AS identifier_supply,
        2 AS order_by
    FROM public.buyer_products bp
    INNER JOIN public.products p ON p.id = bp.base_product_id
    WHERE bp.id = 12081956
        AND bp.source_price IS NOT NULL
    )
) b
ORDER BY order_by
LIMIT 3;" 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: #D4D4D4"> </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> * </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    (</span><span style="color: #569CD6">SELECT</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_name&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.price </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> price,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.created_at </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> expires_at,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_manufacturer&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> manufacturer,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_packing&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> packing,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_pack_quantity&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> pack_quantity,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_unit_purchase&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> unit_purchase,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.confirmed_quantity </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> quantity_price,</span></span>
<span class="line"><span style="color: #D4D4D4">        sp.name </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> name_supply,</span></span>
<span class="line"><span style="color: #D4D4D4">        sp.identifier </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> identifier_supply,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> order_by</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> purchase_order_items poi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> purchase_orders po </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> po.id = poi.purchase_order_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> buyer_products bp </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> bp.buyer_id = po.buyer_id </span><span style="color: #569CD6">AND</span></span>
<span class="line"><span style="color: #D4D4D4">        bp.code = poi.buyer_product -&gt;&gt; </span><span style="color: #CE9178">&#39;buyer_product_code&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> products p </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> p.id = bp.base_product_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> suppliers sp </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> sp.id = po.supplier_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> bp.id = </span><span style="color: #B5CEA8">12081956</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> poi.created_at &lt; </span><span style="color: #CE9178">&#39;2025-02-21 16:57:59.225571&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> poi.created_at </span><span style="color: #569CD6">DESC</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">LIMIT</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">UNION ALL</span></span>
<span class="line"><span style="color: #D4D4D4">    (</span><span style="color: #569CD6">SELECT</span></span>
<span class="line"><span style="color: #D4D4D4">        bp.name,</span></span>
<span class="line"><span style="color: #D4D4D4">        bp.source_price </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> price,</span></span>
<span class="line"><span style="color: #D4D4D4">        bp.created_at </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> expires_at,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> manufacturer,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> packing,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> pack_quantity,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> unit_purchase,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> quantity_price,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> name_supply, </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> identifier_supply,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> order_by</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> public.buyer_products bp</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> public.products p </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> p.id = bp.base_product_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> bp.id = </span><span style="color: #B5CEA8">12081956</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> bp.source_price </span><span style="color: #569CD6">IS NOT NULL</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span>
<span class="line"><span style="color: #D4D4D4">) b</span></span>
<span class="line"><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> order_by</span></span>
<span class="line"><span style="color: #569CD6">LIMIT</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p></p>



<p>Para analisar os planos de execução, utilizaremos duas ferramentas que auxiliam na visualização e interpretação dos dados. Cada ferramenta apresenta o plano de uma forma diferente, permitindo uma análise mais completa:</p>



<ol class="wp-block-list">
<li><strong>Modo Tabular:</strong> <a href="https://explain.depesz.com/">Explain Depesz</a> – Exibe o plano de execução em formato tabular, facilitando a leitura estruturada dos passos. <br><a href="https://explain.depesz.com/">https://explain.depesz.com/</a><br><br></li>



<li><strong>Modo Árvore (Tree):</strong> <a href="https://explain.dalibo.com/">Explain Dalibo</a> – Representa o plano de execução graficamente, tornando mais intuitiva a hierarquia das operações.<br><a href="https://explain.dalibo.com/">https://explain.dalibo.com/</a></li>
</ol>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Instrução:</strong> Clique nos links acima para acessar as ferramentas e seguir o procedimento de visualização dos dois métodos.</p>



<p>Para visualizar o plano de execução em ambos os modos, primeiro precisamos extraí-lo em formato de texto. Para isso, basta adicionar a seguinte declaração no início da query:</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 (ANALYZE, COSTS, VERBOSE, BUFFERS)
(...) SQL CODE (...)" 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: #D4D4D4">EXPLAIN (ANALYZE, COSTS, </span><span style="color: #569CD6">VERBOSE</span><span style="color: #D4D4D4">, BUFFERS)</span></span>
<span class="line"><span style="color: #D4D4D4">(...) </span><span style="color: #569CD6">SQL</span><span style="color: #D4D4D4"> CODE (...)</span></span></code></pre></div>



<p>Essa instrução fornece informações detalhadas sobre a execução da consulta, incluindo:</p>



<ul class="wp-block-list">
<li><strong>ANALYZE:</strong> Executa a query de fato e retorna estatísticas reais de tempo e quantidade de linhas processadas.</li>



<li><strong>COSTS:</strong> Exibe os custos estimados de cada operação no plano de execução.</li>



<li><strong>VERBOSE:</strong> Apresenta detalhes adicionais, como a estrutura da consulta e a relação das colunas envolvidas.</li>



<li><strong>BUFFERS:</strong> Mostra informações sobre o uso do cache de memória (buffers) durante a execução.</li>
</ul>



<p>Abaixo, veja como o código SQL completo ficará com a inclusão do <code>EXPLAIN</code> na consulta.</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 (ANALYZE, COSTS, VERBOSE, BUFFERS )
 SELECT * FROM (
    (SELECT
        poi.supplier_product -&gt;&gt; 'supplier_product_name' AS name,
        poi.price AS price,
        poi.created_at AS expires_at,
        poi.supplier_product -&gt;&gt; 'supplier_product_manufacturer' AS manufacturer,
        poi.supplier_product -&gt;&gt; 'supplier_product_packing' AS packing,
        poi.supplier_product -&gt;&gt; 'supplier_product_pack_quantity' AS pack_quantity,
        poi.supplier_product -&gt;&gt; 'supplier_product_unit_purchase' AS unit_purchase,
        poi.confirmed_quantity AS quantity_price,
        sp.name AS name_supply,
        sp.identifier AS identifier_supply,
        1 AS order_by
    FROM purchase_order_items poi
    INNER JOIN purchase_orders po ON po.id = poi.purchase_order_id
    INNER JOIN buyer_products bp ON bp.buyer_id = po.buyer_id AND
        bp.code = poi.buyer_product -&gt;&gt; 'buyer_product_code'
    INNER JOIN products p ON p.id = bp.base_product_id
    INNER JOIN suppliers sp ON sp.id = po.supplier_id
    WHERE bp.id = 12081956
        AND poi.created_at &lt; '2025-02-21 16:57:59.225571'
    ORDER BY poi.created_at DESC
    LIMIT 3
    )
    UNION ALL
    (SELECT
        bp.name,
        bp.source_price AS price,
        bp.created_at AS expires_at,
        '' AS manufacturer,
        '' AS packing,
        '' AS pack_quantity,
        '' AS unit_purchase,
        0 AS quantity_price,
        '' AS name_supply, 
        '' AS identifier_supply,
        2 AS order_by
    FROM public.buyer_products bp
    INNER JOIN public.products p ON p.id = bp.base_product_id
    WHERE bp.id = 12081956
        AND bp.source_price IS NOT NULL
    )
) b
ORDER BY order_by
LIMIT 3;" 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: #D4D4D4"> EXPLAIN (ANALYZE, COSTS, </span><span style="color: #569CD6">VERBOSE</span><span style="color: #D4D4D4">, BUFFERS )</span></span>
<span class="line"><span style="color: #D4D4D4"> </span><span style="color: #569CD6">SELECT</span><span style="color: #D4D4D4"> * </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> (</span></span>
<span class="line"><span style="color: #D4D4D4">    (</span><span style="color: #569CD6">SELECT</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_name&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.price </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> price,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.created_at </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> expires_at,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_manufacturer&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> manufacturer,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_packing&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> packing,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_pack_quantity&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> pack_quantity,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_unit_purchase&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> unit_purchase,</span></span>
<span class="line"><span style="color: #D4D4D4">        poi.confirmed_quantity </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> quantity_price,</span></span>
<span class="line"><span style="color: #D4D4D4">        sp.name </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> name_supply,</span></span>
<span class="line"><span style="color: #D4D4D4">        sp.identifier </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> identifier_supply,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> order_by</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> purchase_order_items poi</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> purchase_orders po </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> po.id = poi.purchase_order_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> buyer_products bp </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> bp.buyer_id = po.buyer_id </span><span style="color: #569CD6">AND</span></span>
<span class="line"><span style="color: #D4D4D4">        bp.code = poi.buyer_product -&gt;&gt; </span><span style="color: #CE9178">&#39;buyer_product_code&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> products p </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> p.id = bp.base_product_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> suppliers sp </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> sp.id = po.supplier_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> bp.id = </span><span style="color: #B5CEA8">12081956</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> poi.created_at &lt; </span><span style="color: #CE9178">&#39;2025-02-21 16:57:59.225571&#39;</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> poi.created_at </span><span style="color: #569CD6">DESC</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">LIMIT</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">UNION ALL</span></span>
<span class="line"><span style="color: #D4D4D4">    (</span><span style="color: #569CD6">SELECT</span></span>
<span class="line"><span style="color: #D4D4D4">        bp.name,</span></span>
<span class="line"><span style="color: #D4D4D4">        bp.source_price </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> price,</span></span>
<span class="line"><span style="color: #D4D4D4">        bp.created_at </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> expires_at,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> manufacturer,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> packing,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> pack_quantity,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> unit_purchase,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> quantity_price,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> name_supply, </span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> identifier_supply,</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">AS</span><span style="color: #D4D4D4"> order_by</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">FROM</span><span style="color: #D4D4D4"> public.buyer_products bp</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">INNER JOIN</span><span style="color: #D4D4D4"> public.products p </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> p.id = bp.base_product_id</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">WHERE</span><span style="color: #D4D4D4"> bp.id = </span><span style="color: #B5CEA8">12081956</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">AND</span><span style="color: #D4D4D4"> bp.source_price </span><span style="color: #569CD6">IS NOT NULL</span></span>
<span class="line"><span style="color: #D4D4D4">    )</span></span>
<span class="line"><span style="color: #D4D4D4">) b</span></span>
<span class="line"><span style="color: #569CD6">ORDER BY</span><span style="color: #D4D4D4"> order_by</span></span>
<span class="line"><span style="color: #569CD6">LIMIT</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">;</span></span></code></pre></div>



<p></p>



<p>Após executar o comando <code>EXPLAIN</code>, o PostgreSQL gera um plano de execução em formato de texto. A seguir, veja um exemplo do plano gerado para esta query:<br><br><br><br></p>



<div class="wp-block-kevinbatdorf-code-block-pro alignwide" 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=" Limit  (cost=120200.56..120200.57 rows=2 width=252) (actual time=207.212..207.217 rows=3 loops=1)
   Output: ((poi.supplier_product -&gt;&gt; 'supplier_product_name'::text)), poi.price, poi.created_at, ((poi.supplier_product -&gt;&gt; 'supplier_product_manufacturer'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_packing'::t
ext)), ((poi.supplier_product -&gt;&gt; 'supplier_product_pack_quantity'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_unit_purchase'::text)), poi.confirmed_quantity, sp.name, sp.identifier, (1)
   Buffers: shared hit=64032
   -&gt;  Sort  (cost=120200.56..120200.57 rows=2 width=252) (actual time=186.714..186.718 rows=3 loops=1)
         Output: ((poi.supplier_product -&gt;&gt; 'supplier_product_name'::text)), poi.price, poi.created_at, ((poi.supplier_product -&gt;&gt; 'supplier_product_manufacturer'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_packi
ng'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_pack_quantity'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_unit_purchase'::text)), poi.confirmed_quantity, sp.name, sp.identifier, (1)
         Sort Key: (1)
         Sort Method: quicksort  Memory: 25kB
         Buffers: shared hit=64032
         -&gt;  Append  (cost=120195.05..120200.49 rows=2 width=252) (actual time=186.639..186.704 rows=4 loops=1)
               Buffers: shared hit=64032
               -&gt;  Limit  (cost=120195.05..120195.06 rows=1 width=242) (actual time=186.637..186.640 rows=3 loops=1)
                     Output: ((poi.supplier_product -&gt;&gt; 'supplier_product_name'::text)), poi.price, poi.created_at, ((poi.supplier_product -&gt;&gt; 'supplier_product_manufacturer'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_p
roduct_packing'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_pack_quantity'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_unit_purchase'::text)), poi.confirmed_quantity, sp.name, sp.identifier, 1
                     Buffers: shared hit=64024
                     -&gt;  Sort  (cost=120195.05..120195.06 rows=1 width=242) (actual time=186.619..186.621 rows=3 loops=1)
                           Output: ((poi.supplier_product -&gt;&gt; 'supplier_product_name'::text)), poi.price, poi.created_at, ((poi.supplier_product -&gt;&gt; 'supplier_product_manufacturer'::text)), ((poi.supplier_product -&gt;&gt; 'supp
lier_product_packing'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_pack_quantity'::text)), ((poi.supplier_product -&gt;&gt; 'supplier_product_unit_purchase'::text)), poi.confirmed_quantity, sp.name, sp.identifier, 1
                           Sort Key: poi.created_at DESC
                           Sort Method: top-N heapsort  Memory: 26kB
                           Buffers: shared hit=64024
                           -&gt;  Nested Loop  (cost=2.04..120195.04 rows=1 width=242) (actual time=0.193..186.435 rows=273 loops=1)
                                 Output: (poi.supplier_product -&gt;&gt; 'supplier_product_name'::text), poi.price, poi.created_at, (poi.supplier_product -&gt;&gt; 'supplier_product_manufacturer'::text), (poi.supplier_product -&gt;&gt; 'sup
plier_product_packing'::text), (poi.supplier_product -&gt;&gt; 'supplier_product_pack_quantity'::text), (poi.supplier_product -&gt;&gt; 'supplier_product_unit_purchase'::text), poi.confirmed_quantity, sp.name, sp.identifier, 1
                                 Inner Unique: true
                                 Buffers: shared hit=64024
                                 -&gt;  Nested Loop  (cost=1.75..120194.70 rows=1 width=423) (actual time=0.169..181.896 rows=273 loops=1)
                                       Output: poi.supplier_product, poi.price, poi.created_at, poi.confirmed_quantity, po.supplier_id
                                       Inner Unique: true
                                       Buffers: shared hit=63194
                                       -&gt;  Nested Loop  (cost=1.31..120192.03 rows=1 width=427) (actual time=0.154..181.249 rows=273 loops=1)
                                             Output: poi.supplier_product, poi.price, poi.created_at, poi.confirmed_quantity, po.supplier_id, bp.base_product_id
                                             Join Filter: ((bp.code)::text = (poi.buyer_product -&gt;&gt; 'buyer_product_code'::text))
                                             Rows Removed by Join Filter: 48357
                                             Buffers: shared hit=62374
                                             -&gt;  Nested Loop  (cost=0.87..7304.32 rows=6352 width=19) (actual time=0.037..8.088 rows=9209 loops=1)
                                                   Output: po.id, po.supplier_id, bp.code, bp.base_product_id
                                                   Buffers: shared hit=4649
                                                   -&gt;  Index Scan using buyer_products_pkey on public.buyer_products bp  (cost=0.44..2.68 rows=1 width=15) (actual time=0.016..0.018 rows=1 loops=1)
                                                         Output: bp.id, bp.base_product_id, bp.buyer_id, bp.created_at, bp.updated_at, bp.external_id, bp.name, bp.code, bp.status, bp.source_price, bp.identifier, bp.accept_
alternative_brands, bp.id_scub, bp.internal_scub_id, bp.detailed_description, bp.buyer_product_children
                                                         Index Cond: (bp.id = 12081956)
                                                         Buffers: shared hit=4
                                                   -&gt;  Index Scan using index_purchase_orders_on_buyer_id on public.purchase_orders po  (cost=0.43..7100.53 rows=6704 width=12) (actual time=0.012..6.880 rows=9209 loops=1)
                                                         Output: po.id, po.supplier_id, po.total_price, po.items_count, po.created_at, po.updated_at, po.confirmation_id, po.synchronized_at, po.buyer_id, po.observation, po.
sequence, po.origin_id, po.origin_type, po.external_id, po.redirect_to_legacy, po.name, po.origin_observation, po.opened_at, po.contact, po.terms_and_conditions, po.freight_type, po.minimum_purchase, po.valid_until, po.pay
ment_method_id, po.billing_address, po.uuid, po.created_by, po.created_by_info, po.pending_download, po.text_search_vector, po.request_id, po.upload_id, po.upload_id_gr
                                                         Index Cond: (po.buyer_id = bp.buyer_id)
                                                         Buffers: shared hit=4645
                                             -&gt;  Index Scan using index_purchase_order_items_on_purchase_order_id on public.purchase_order_items poi  (cost=0.44..9.90 rows=225 width=751) (actual time=0.002..0.006 rows=5 lo
ops=9209)
                                                   Output: poi.id, poi.purchase_order_id, poi.created_at, poi.updated_at, poi.status, poi.confirmed_quantity, poi.cancellation, poi.supplier_observation, poi.opening_quantity
, poi.supplier_product, poi.buyer_product, poi.sequence_number, poi.price, poi.comments, poi.origin, poi.uuid, poi.sequence_seller_item_number
                                                   Index Cond: (poi.purchase_order_id = po.id)
                                                   Filter: (poi.created_at &lt; '2025-02-21 16:57:59.225571'::timestamp without time zone)
                                                   Rows Removed by Filter: 0
                                                   Buffers: shared hit=57725
                                       -&gt;  Index Only Scan using products_pkey on public.products p  (cost=0.44..2.68 rows=1 width=4) (actual time=0.002..0.002 rows=1 loops=273)
                                             Output: p.id
                                             Index Cond: (p.id = bp.base_product_id)
                                             Heap Fetches: 0
                                             Buffers: shared hit=820
                                 -&gt;  Index Scan using idx_sp_on_id on public.suppliers sp  (cost=0.29..0.33 rows=1 width=58) (actual time=0.002..0.002 rows=1 loops=273)
                                       Output: sp.id, sp.name, sp.created_at, sp.updated_at, sp.external_id, sp.identifier, sp.identifier_kind, sp.bio_id, sp.synchronized_at, sp.bioid_synchronized_at, sp.phone, sp.plan_nam
e, sp.metadata, sp.is_external
                                       Index Cond: (sp.id = po.supplier_id)
                                       Buffers: shared hit=828
               -&gt;  Subquery Scan on &quot;*SELECT* 2&quot;  (cost=0.87..5.38 rows=1 width=252) (actual time=0.058..0.060 rows=1 loops=1)
                     Output: &quot;*SELECT* 2&quot;.name, &quot;*SELECT* 2&quot;.price, &quot;*SELECT* 2&quot;.expires_at, ''::text, ''::text, ''::text, ''::text, 0, ''::character varying, ''::character varying, 2
                     Buffers: shared hit=8
                     -&gt;  Nested Loop  (cost=0.87..5.34 rows=1 width=262) (actual time=0.054..0.055 rows=1 loops=1)
                           Output: bp_1.name, bp_1.source_price, bp_1.created_at, ''::text, ''::text, ''::text, ''::text, 0, ''::character varying, ''::character varying, 2
                           Inner Unique: true
                           Buffers: shared hit=8
                           -&gt;  Index Scan using idx_bp_on_id_source_price on public.buyer_products bp_1  (cost=0.43..2.67 rows=1 width=66) (actual time=0.013..0.013 rows=1 loops=1)
                                 Output: bp_1.id, bp_1.base_product_id, bp_1.buyer_id, bp_1.created_at, bp_1.updated_at, bp_1.external_id, bp_1.name, bp_1.code, bp_1.status, bp_1.source_price, bp_1.identifier, bp_1.accept_
alternative_brands, bp_1.id_scub, bp_1.internal_scub_id, bp_1.detailed_description, bp_1.buyer_product_children
                                 Index Cond: (bp_1.id = 12081956)
                                 Buffers: shared hit=4
                           -&gt;  Index Only Scan using products_pkey on public.products p_1  (cost=0.44..2.68 rows=1 width=4) (actual time=0.005..0.005 rows=1 loops=1)
                                 Output: p_1.id
                                 Index Cond: (p_1.id = bp_1.base_product_id)
                                 Heap Fetches: 0
                                 Buffers: shared hit=4
 Query Identifier: 273579094919034765
 Planning:
   Buffers: shared hit=129
 Planning Time: 3.160 ms
 JIT:
   Functions: 34
   Options: Inlining false, Optimization false, Expressions true, Deforming true
   Timing: Generation 1.963 ms, Inlining 0.000 ms, Optimization 0.883 ms, Emission 19.683 ms, Total 22.528 ms
 Execution Time: 209.321 ms
(82 rows)
" 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: #D4D4D4"> </span><span style="color: #569CD6">Limit</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">120200</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">56</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">120200</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">57</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">207</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">212</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">207</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">217</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">   </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_name&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), poi.price, poi.created_at, ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_manufacturer&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_packing&#39;</span><span style="color: #D4D4D4">::t</span></span>
<span class="line"><span style="color: #D4D4D4">ext)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_pack_quantity&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_unit_purchase&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), poi.confirmed_quantity, sp.name, sp.identifier, (</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">   Buffers: shared hit=</span><span style="color: #B5CEA8">64032</span></span>
<span class="line"><span style="color: #D4D4D4">   -&gt;  Sort  (cost=</span><span style="color: #B5CEA8">120200</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">56</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">120200</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">57</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">714</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">718</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">         </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_name&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), poi.price, poi.created_at, ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_manufacturer&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_packi</span></span>
<span class="line"><span style="color: #CE9178">ng&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_pack_quantity&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_unit_purchase&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), poi.confirmed_quantity, sp.name, sp.identifier, (</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">         Sort </span><span style="color: #569CD6">Key</span><span style="color: #D4D4D4">: (</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">         Sort Method: quicksort  Memory: 25kB</span></span>
<span class="line"><span style="color: #D4D4D4">         Buffers: shared hit=</span><span style="color: #B5CEA8">64032</span></span>
<span class="line"><span style="color: #D4D4D4">         -&gt;  </span><span style="color: #569CD6">Append</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">120195</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">05</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">120200</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">49</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">639</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">704</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">               Buffers: shared hit=</span><span style="color: #B5CEA8">64032</span></span>
<span class="line"><span style="color: #D4D4D4">               -&gt;  </span><span style="color: #569CD6">Limit</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">120195</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">05</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">120195</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">06</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">242</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">637</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">640</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                     </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_name&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), poi.price, poi.created_at, ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_manufacturer&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_p</span></span>
<span class="line"><span style="color: #CE9178">roduct_packing&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_pack_quantity&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_unit_purchase&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), poi.confirmed_quantity, sp.name, sp.identifier, </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">                     Buffers: shared hit=</span><span style="color: #B5CEA8">64024</span></span>
<span class="line"><span style="color: #D4D4D4">                     -&gt;  Sort  (cost=</span><span style="color: #B5CEA8">120195</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">05</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">120195</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">06</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">242</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">619</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">621</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_name&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), poi.price, poi.created_at, ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_manufacturer&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supp</span></span>
<span class="line"><span style="color: #CE9178">lier_product_packing&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_pack_quantity&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), ((poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_unit_purchase&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">)), poi.confirmed_quantity, sp.name, sp.identifier, </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">                           Sort </span><span style="color: #569CD6">Key</span><span style="color: #D4D4D4">: poi.created_at </span><span style="color: #569CD6">DESC</span></span>
<span class="line"><span style="color: #D4D4D4">                           Sort Method: </span><span style="color: #569CD6">top</span><span style="color: #D4D4D4">-N heapsort  Memory: 26kB</span></span>
<span class="line"><span style="color: #D4D4D4">                           Buffers: shared hit=</span><span style="color: #B5CEA8">64024</span></span>
<span class="line"><span style="color: #D4D4D4">                           -&gt;  Nested </span><span style="color: #569CD6">Loop</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">04</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">120195</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">04</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">242</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">193</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">186</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">435</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">273</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                 </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: (poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_name&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">), poi.price, poi.created_at, (poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_manufacturer&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">), (poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;sup</span></span>
<span class="line"><span style="color: #CE9178">plier_product_packing&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">), (poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_pack_quantity&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">), (poi.supplier_product -&gt;&gt; </span><span style="color: #CE9178">&#39;supplier_product_unit_purchase&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">), poi.confirmed_quantity, sp.name, sp.identifier, </span><span style="color: #B5CEA8">1</span></span>
<span class="line"><span style="color: #D4D4D4">                                 Inner </span><span style="color: #569CD6">Unique</span><span style="color: #D4D4D4">: true</span></span>
<span class="line"><span style="color: #D4D4D4">                                 Buffers: shared hit=</span><span style="color: #B5CEA8">64024</span></span>
<span class="line"><span style="color: #D4D4D4">                                 -&gt;  Nested </span><span style="color: #569CD6">Loop</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">75</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">120194</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">70</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">423</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">169</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">181</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">896</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">273</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                       </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: poi.supplier_product, poi.price, poi.created_at, poi.confirmed_quantity, po.supplier_id</span></span>
<span class="line"><span style="color: #D4D4D4">                                       Inner </span><span style="color: #569CD6">Unique</span><span style="color: #D4D4D4">: true</span></span>
<span class="line"><span style="color: #D4D4D4">                                       Buffers: shared hit=</span><span style="color: #B5CEA8">63194</span></span>
<span class="line"><span style="color: #D4D4D4">                                       -&gt;  Nested </span><span style="color: #569CD6">Loop</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">31</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">120192</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">03</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">427</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">154</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">181</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">249</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">273</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                             </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: poi.supplier_product, poi.price, poi.created_at, poi.confirmed_quantity, po.supplier_id, bp.base_product_id</span></span>
<span class="line"><span style="color: #D4D4D4">                                             </span><span style="color: #569CD6">Join</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">Filter</span><span style="color: #D4D4D4">: ((bp.code)::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4"> = (poi.buyer_product -&gt;&gt; </span><span style="color: #CE9178">&#39;buyer_product_code&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">))</span></span>
<span class="line"><span style="color: #D4D4D4">                                             </span><span style="color: #569CD6">Rows</span><span style="color: #D4D4D4"> Removed </span><span style="color: #569CD6">by</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">Join</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">Filter</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">48357</span></span>
<span class="line"><span style="color: #D4D4D4">                                             Buffers: shared hit=</span><span style="color: #B5CEA8">62374</span></span>
<span class="line"><span style="color: #D4D4D4">                                             -&gt;  Nested </span><span style="color: #569CD6">Loop</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">87</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">7304</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">32</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">6352</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">19</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">037</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">088</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">9209</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: po.id, po.supplier_id, bp.code, bp.base_product_id</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   Buffers: shared hit=</span><span style="color: #B5CEA8">4649</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   -&gt;  </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Scan </span><span style="color: #569CD6">using</span><span style="color: #D4D4D4"> buyer_products_pkey </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> public.buyer_products bp  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">44</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">68</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">15</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">016</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">018</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                                         </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: bp.id, bp.base_product_id, bp.buyer_id, bp.created_at, bp.updated_at, bp.external_id, bp.name, bp.code, bp.status, bp.source_price, bp.identifier, bp.accept_</span></span>
<span class="line"><span style="color: #D4D4D4">alternative_brands, bp.id_scub, bp.internal_scub_id, bp.detailed_description, bp.buyer_product_children</span></span>
<span class="line"><span style="color: #D4D4D4">                                                         </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Cond: (bp.id = </span><span style="color: #B5CEA8">12081956</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                                         Buffers: shared hit=</span><span style="color: #B5CEA8">4</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   -&gt;  </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Scan </span><span style="color: #569CD6">using</span><span style="color: #D4D4D4"> index_purchase_orders_on_buyer_id </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> public.purchase_orders po  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">43</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">7100</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">53</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">6704</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">12</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">012</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">6</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">880</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">9209</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                                         </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: po.id, po.supplier_id, po.total_price, po.items_count, po.created_at, po.updated_at, po.confirmation_id, po.synchronized_at, po.buyer_id, po.observation, po.</span></span>
<span class="line"><span style="color: #569CD6">sequence</span><span style="color: #D4D4D4">, po.origin_id, po.origin_type, po.external_id, po.redirect_to_legacy, po.name, po.origin_observation, po.opened_at, po.contact, po.terms_and_conditions, po.freight_type, po.minimum_purchase, po.valid_until, po.pay</span></span>
<span class="line"><span style="color: #D4D4D4">ment_method_id, po.billing_address, po.uuid, po.created_by, po.created_by_info, po.pending_download, po.text_search_vector, po.request_id, po.upload_id, po.upload_id_gr</span></span>
<span class="line"><span style="color: #D4D4D4">                                                         </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Cond: (po.buyer_id = bp.buyer_id)</span></span>
<span class="line"><span style="color: #D4D4D4">                                                         Buffers: shared hit=</span><span style="color: #B5CEA8">4645</span></span>
<span class="line"><span style="color: #D4D4D4">                                             -&gt;  </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Scan </span><span style="color: #569CD6">using</span><span style="color: #D4D4D4"> index_purchase_order_items_on_purchase_order_id </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> public.purchase_order_items poi  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">44</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">9</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">90</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">225</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">751</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">002</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">006</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4"> lo</span></span>
<span class="line"><span style="color: #D4D4D4">ops=</span><span style="color: #B5CEA8">9209</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: poi.id, poi.purchase_order_id, poi.created_at, poi.updated_at, poi.status, poi.confirmed_quantity, poi.cancellation, poi.supplier_observation, poi.opening_quantity</span></span>
<span class="line"><span style="color: #D4D4D4">, poi.supplier_product, poi.buyer_product, poi.sequence_number, poi.price, poi.comments, poi.origin, poi.uuid, poi.sequence_seller_item_number</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Cond: (poi.purchase_order_id = po.id)</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   </span><span style="color: #569CD6">Filter</span><span style="color: #D4D4D4">: (poi.created_at &lt; </span><span style="color: #CE9178">&#39;2025-02-21 16:57:59.225571&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">timestamp without time zone</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   </span><span style="color: #569CD6">Rows</span><span style="color: #D4D4D4"> Removed </span><span style="color: #569CD6">by</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">Filter</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">                                                   Buffers: shared hit=</span><span style="color: #B5CEA8">57725</span></span>
<span class="line"><span style="color: #D4D4D4">                                       -&gt;  </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Only Scan </span><span style="color: #569CD6">using</span><span style="color: #D4D4D4"> products_pkey </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> public.products p  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">44</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">68</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">002</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">002</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">273</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                             </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: p.id</span></span>
<span class="line"><span style="color: #D4D4D4">                                             </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Cond: (p.id = bp.base_product_id)</span></span>
<span class="line"><span style="color: #D4D4D4">                                             Heap Fetches: </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">                                             Buffers: shared hit=</span><span style="color: #B5CEA8">820</span></span>
<span class="line"><span style="color: #D4D4D4">                                 -&gt;  </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Scan </span><span style="color: #569CD6">using</span><span style="color: #D4D4D4"> idx_sp_on_id </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> public.suppliers sp  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">29</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">33</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">58</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">002</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">002</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">273</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                       </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: sp.id, sp.name, sp.created_at, sp.updated_at, sp.external_id, sp.identifier, sp.identifier_kind, sp.bio_id, sp.synchronized_at, sp.bioid_synchronized_at, sp.phone, sp.plan_nam</span></span>
<span class="line"><span style="color: #D4D4D4">e, sp.metadata, sp.is_external</span></span>
<span class="line"><span style="color: #D4D4D4">                                       </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Cond: (sp.id = po.supplier_id)</span></span>
<span class="line"><span style="color: #D4D4D4">                                       Buffers: shared hit=</span><span style="color: #B5CEA8">828</span></span>
<span class="line"><span style="color: #D4D4D4">               -&gt;  Subquery Scan </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">&quot;*SELECT* 2&quot;</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">87</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">38</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">058</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">060</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                     </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: </span><span style="color: #CE9178">&quot;*SELECT* 2&quot;</span><span style="color: #D4D4D4">.</span><span style="color: #569CD6">name</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;*SELECT* 2&quot;</span><span style="color: #D4D4D4">.price, </span><span style="color: #CE9178">&quot;*SELECT* 2&quot;</span><span style="color: #D4D4D4">.expires_at, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">character</span><span style="color: #D4D4D4"> varying, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">character</span><span style="color: #D4D4D4"> varying, </span><span style="color: #B5CEA8">2</span></span>
<span class="line"><span style="color: #D4D4D4">                     Buffers: shared hit=</span><span style="color: #B5CEA8">8</span></span>
<span class="line"><span style="color: #D4D4D4">                     -&gt;  Nested </span><span style="color: #569CD6">Loop</span><span style="color: #D4D4D4">  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">87</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">34</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">262</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">054</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">055</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                           </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: bp_1.name, bp_1.source_price, bp_1.created_at, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">text</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">character</span><span style="color: #D4D4D4"> varying, </span><span style="color: #CE9178">&#39;&#39;</span><span style="color: #D4D4D4">::</span><span style="color: #569CD6">character</span><span style="color: #D4D4D4"> varying, </span><span style="color: #B5CEA8">2</span></span>
<span class="line"><span style="color: #D4D4D4">                           Inner </span><span style="color: #569CD6">Unique</span><span style="color: #D4D4D4">: true</span></span>
<span class="line"><span style="color: #D4D4D4">                           Buffers: shared hit=</span><span style="color: #B5CEA8">8</span></span>
<span class="line"><span style="color: #D4D4D4">                           -&gt;  </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Scan </span><span style="color: #569CD6">using</span><span style="color: #D4D4D4"> idx_bp_on_id_source_price </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> public.buyer_products bp_1  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">43</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">67</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">66</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">013</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">013</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                 </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: bp_1.id, bp_1.base_product_id, bp_1.buyer_id, bp_1.created_at, bp_1.updated_at, bp_1.external_id, bp_1.name, bp_1.code, bp_1.status, bp_1.source_price, bp_1.identifier, bp_1.accept_</span></span>
<span class="line"><span style="color: #D4D4D4">alternative_brands, bp_1.id_scub, bp_1.internal_scub_id, bp_1.detailed_description, bp_1.buyer_product_children</span></span>
<span class="line"><span style="color: #D4D4D4">                                 </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Cond: (bp_1.id = </span><span style="color: #B5CEA8">12081956</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                 Buffers: shared hit=</span><span style="color: #B5CEA8">4</span></span>
<span class="line"><span style="color: #D4D4D4">                           -&gt;  </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Only Scan </span><span style="color: #569CD6">using</span><span style="color: #D4D4D4"> products_pkey </span><span style="color: #569CD6">on</span><span style="color: #D4D4D4"> public.products p_1  (cost=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">44</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">68</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> width=</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">) (actual </span><span style="color: #569CD6">time</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">005</span><span style="color: #D4D4D4">..</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">005</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loops=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">                                 </span><span style="color: #569CD6">Output</span><span style="color: #D4D4D4">: p_1.id</span></span>
<span class="line"><span style="color: #D4D4D4">                                 </span><span style="color: #569CD6">Index</span><span style="color: #D4D4D4"> Cond: (p_1.id = bp_1.base_product_id)</span></span>
<span class="line"><span style="color: #D4D4D4">                                 Heap Fetches: </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">                                 Buffers: shared hit=</span><span style="color: #B5CEA8">4</span></span>
<span class="line"><span style="color: #D4D4D4"> Query Identifier: </span><span style="color: #B5CEA8">273579094919034765</span></span>
<span class="line"><span style="color: #D4D4D4"> Planning:</span></span>
<span class="line"><span style="color: #D4D4D4">   Buffers: shared hit=</span><span style="color: #B5CEA8">129</span></span>
<span class="line"><span style="color: #D4D4D4"> Planning </span><span style="color: #569CD6">Time</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">160</span><span style="color: #D4D4D4"> ms</span></span>
<span class="line"><span style="color: #D4D4D4"> JIT:</span></span>
<span class="line"><span style="color: #D4D4D4">   Functions: </span><span style="color: #B5CEA8">34</span></span>
<span class="line"><span style="color: #D4D4D4">   Options: Inlining false, Optimization false, Expressions true, Deforming true</span></span>
<span class="line"><span style="color: #D4D4D4">   Timing: Generation </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">963</span><span style="color: #D4D4D4"> ms, Inlining </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">000</span><span style="color: #D4D4D4"> ms, Optimization </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">883</span><span style="color: #D4D4D4"> ms, Emission </span><span style="color: #B5CEA8">19</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">683</span><span style="color: #D4D4D4"> ms, Total </span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">528</span><span style="color: #D4D4D4"> ms</span></span>
<span class="line"><span style="color: #D4D4D4"> Execution </span><span style="color: #569CD6">Time</span><span style="color: #D4D4D4">: </span><span style="color: #B5CEA8">209</span><span style="color: #D4D4D4">.</span><span style="color: #B5CEA8">321</span><span style="color: #D4D4D4"> ms</span></span>
<span class="line"><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">82</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">rows</span><span style="color: #D4D4D4">)</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<p></p>



<p>Assim como no Oracle Database, o PostgreSQL utiliza a indentação, representada pelo símbolo -&gt;, para indicar a ordem de execução das operações, sem atribuir um identificador sequencial a cada passo. Dessa forma, quanto maior a indentação antes do -&gt;, mais interno (ou profundo) é o passo no plano de execução. Isso significa que os passos mais indentados são executados primeiro.</p>



<p></p>



<p>Com o plano de execução em formato de texto, podemos utilizar as duas ferramentas apresentadas para realizar a análise e identificar possíveis gargalos na execução da query. A seguir, exploraremos ambas as abordagens e demonstraremos como detectar os principais pontos de otimização no SQL.<br><br><br>Utilizaremos o plano de execução em formato de texto gerado anteriormente e o submeteremos à ferramenta <strong>Explain Depesz</strong>, que apresenta a análise no formato tabular. Você pode acessá-la através do seguinte link: <a href="https://explain.depesz.com/">Explain Depesz</a>.<br><a href="https://explain.depesz.com/">https://explain.depesz.com/</a></p>



<p></p>



<p></p>



<figure class="wp-block-image alignwide size-large"><img alt="" decoding="async" width="1024" height="528" src="https://furushima.com.br/wp-content/uploads/2025/02/image-14-1024x528.png" alt="" class="wp-image-2573" srcset="https://furushima.com.br/wp-content/uploads/2025/02/image-14-1024x528.png 1024w, https://furushima.com.br/wp-content/uploads/2025/02/image-14-300x155.png 300w, https://furushima.com.br/wp-content/uploads/2025/02/image-14-768x396.png 768w, https://furushima.com.br/wp-content/uploads/2025/02/image-14-1536x791.png 1536w, https://furushima.com.br/wp-content/uploads/2025/02/image-14.png 1766w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<h3 class="wp-block-heading">Passos para visualizar o plano de execução no <strong>Explain Depesz</strong>:</h3>



<ul class="wp-block-list">
<li><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f534.png" alt="🔴" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Seta Vermelha:</strong> Insira um título para o plano de execução (opcional, mas facilita a organização).</li>



<li><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f7e2.png" alt="🟢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Seta Verde:</strong> Cole o plano de execução gerado em formato de texto.</li>



<li><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f535.png" alt="🔵" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Seta Azul:</strong> Cole a query utilizada para gerar o plano de execução.</li>



<li><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26ab.png" alt="⚫" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Seta Preta:</strong> Após preencher os campos acima, clique em <strong>Submit</strong> para processar e visualizar o plano de execução.</li>
</ul>



<p></p>



<figure class="wp-block-image alignwide size-full"><img alt="" decoding="async" width="1820" height="888" src="https://furushima.com.br/wp-content/uploads/2025/02/Animacao_depesz_plan.gif" alt="" class="wp-image-2575"/></figure>



<p></p>



<p>Após submeter o plano de execução, observe na demonstração abaixo os principais gargalos identificados. Eles são destacados em <strong>laranja e vermelho</strong>, indicando as operações mais custosas. Além disso, os trechos grifados representam cláusulas da query que podem ser otimizadas para melhorar o desempenho.<br><br></p>



<figure class="wp-block-image alignwide size-large"><img alt="" loading="lazy" decoding="async" width="1024" height="559" src="https://furushima.com.br/wp-content/uploads/2025/02/image-15-1024x559.png" alt="" class="wp-image-2578" srcset="https://furushima.com.br/wp-content/uploads/2025/02/image-15-1024x559.png 1024w, https://furushima.com.br/wp-content/uploads/2025/02/image-15-300x164.png 300w, https://furushima.com.br/wp-content/uploads/2025/02/image-15-768x419.png 768w, https://furushima.com.br/wp-content/uploads/2025/02/image-15-1536x838.png 1536w, https://furushima.com.br/wp-content/uploads/2025/02/image-15.png 1684w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p>Nested Loop (cost=1.31..120,192.03 rows=1 width=427) (actual time=0.154..181.249 rows=273 loops=1)<br>Output: poi.supplier_product, poi.price, poi.created_at, poi.confirmed_quantity, po.supplier_id, bp.base_product_id<br><strong>Join Filter: ((bp.code)::text = (poi.buyer_product ->> &#8216;buyer_product_code&#8217;::text))<br></strong>Rows Removed by Join Filter: 48,357<br>Buffers: shared hit=62,374</p>



<p></p>



<p class="has-medium-font-size"></p>



<p></p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>O que significa?</strong></p>



<ul class="wp-block-list">
<li>O PostgreSQL está executando <strong>um Nested Loop Join</strong> para combinar os dados das tabelas <strong>buyer_products (bp)</strong> e <strong>purchase_order_items (poi)</strong>.</li>



<li><strong>Custo estimado</strong>: 120.192 → Indica que esta é uma das etapas mais pesadas do plano.</li>



<li><strong>Tempo real gasto</strong>: <strong>181.249 ms</strong> → Isso confirma que essa operação está realmente demorando muito.</li>
</ul>



<p></p>



<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6a8.png" alt="🚨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Problema identificado:</strong></p>



<ul class="wp-block-list">
<li>O <strong>Nested Loop Join pode ser ineficiente</strong>, especialmente quando muitas linhas precisam ser comparadas.</li>
</ul>



<h2 class="wp-block-heading"><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Detalhes do Join e o Problema do Filtro</strong></h2>



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



<p>Join Filter: ((bp.code)::text = (poi.buyer_product -&gt;&gt; &#8216;buyer_product_code&#8217;::text))<br>Rows Removed by Join Filter: 48,357</p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>O que isso significa?</strong></p>



<ul class="wp-block-list">
<li>O PostgreSQL está tentando <strong>juntar <code>bp.code</code> com o campo JSON <code>poi.buyer_product -&gt;&gt; 'buyer_product_code'</code></strong>.</li>



<li>Porém, <strong>48.357 linhas foram lidas e removidas</strong> porque não atendiam ao filtro.<br>Isso significa que <strong>muitos dados desnecessários foram carregados antes da filtragem</strong>.</li>
</ul>



<p></p>



<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f6a8.png" alt="🚨" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Problema identificado:</strong></p>



<ul class="wp-block-list">
<li>O <strong>filtro de comparação JSON é extremamente ineficiente</strong>.</li>



<li>O PostgreSQL precisa percorrer <strong>todas as linhas</strong> antes de saber quais realmente fazem parte da junção.</li>
</ul>



<p></p>



<pre class="wp-block-code"><code>Buffers: shared hit=62,374

&#x1f4cc; <strong>O que isso significa?</strong></code></pre>



<ul class="wp-block-list">
<li><strong>62.374 blocos de memória foram acessados</strong> no cache do PostgreSQL.</li>



<li>Isso indica que <strong>nenhuma leitura de disco foi necessária</strong>, o que é positivo.</li>



<li>Porém, <strong>mesmo sem leituras de disco, a query ainda está lenta</strong>, o que mostra que o problema está na lógica da consulta, não apenas no hardware.</li>
</ul>



<h2 class="wp-block-heading"><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f539.png" alt="🔹" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Como otimizar essa parte do plano?</strong></h2>



<p>Agora que sabemos que o <strong>Nested Loop Join e o filtro JSON são os principais problemas</strong>, podemos sugerir melhorias:</p>



<h3 class="wp-block-heading"><strong>1&#x20e3; Criar um índice para melhorar a comparação JSON</strong></h3>



<p>A comparação <code>(bp.code)::text = (poi.buyer_product -&gt;&gt; 'buyer_product_code'::text)</code> é <strong>muito custosa</strong>, pois o PostgreSQL precisa processar os dados JSON antes de compará-los.</p>



<p></p>



<p><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Solução: Criar um índice funcional no JSON</strong></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="CREATE INDEX idx_poi_buyer_product_code ON purchase_order_items ((buyer_product -&gt;&gt; 'buyer_product_code'));

CREATE INDEX idx_poi_purchase_order_id_created_at ON purchase_order_items (purchase_order_id, created_at DESC);
" 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">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INDEX</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">idx_poi_buyer_product_code</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> purchase_order_items ((buyer_product -&gt;&gt; </span><span style="color: #CE9178">&#39;buyer_product_code&#39;</span><span style="color: #D4D4D4">));</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">CREATE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">INDEX</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">idx_poi_purchase_order_id_created_at</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">ON</span><span style="color: #D4D4D4"> purchase_order_items (purchase_order_id, created_at </span><span style="color: #569CD6">DESC</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Impacto esperado:</strong></p>



<ul class="wp-block-list">
<li>O PostgreSQL poderá usar o índice diretamente para encontrar as correspondências.</li>



<li>Reduz <strong>drasticamente</strong> o número de linhas removidas pelo <code>Join Filter</code>.</li>



<li>Diminui a necessidade de percorrer todas as linhas da tabela.</li>



<li>Reduz tempo da busca no <code>purchase_order_items</code>.</li>



<li>Melhora a performance do <code>Nested Loop</code>.</li>
</ul>



<p></p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cc.png" alt="📌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Problemas identificados:</strong></p>



<ol class="wp-block-list">
<li><strong>Join Filter está descartando muitas linhas (48.357 removidas).</strong></li>



<li><strong>Nested Loop Join não é eficiente para grandes volumes de dados.</strong></li>



<li><strong>Falta de um índice eficiente para buscas no JSON.</strong></li>



<li><strong>Falta de um índice composto no <code>purchase_order_items</code> para junções rápidas.</strong></li>
</ol>



<p></p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Melhorias sugeridas:</strong> </p>



<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Criar um índice para otimizar a busca JSON.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Usar um <code>Hash Join</code> em vez de <code>Nested Loop</code>.<br><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Criar um índice composto para melhorar as junções.</p>



<p></p>



<h3 class="wp-block-heading"><strong>Melhoria da Análise e Utilização da Ferramenta <code>EXPLAIN DALIBO</code></strong></h3>



<p>Agora que identificamos os <strong>gargalos</strong> e propomos <strong>soluções</strong>, vamos abordar esse problema sob uma nova perspectiva, utilizando a ferramenta <a href="https://explain.dalibo.com/">EXPLAIN Dalibo</a>.</p>



<p><a href="https://explain.dalibo.com">https://explain.dalibo.com</a></p>



<p></p>



<figure class="wp-block-image size-full"><img alt="" loading="lazy" decoding="async" width="891" height="763" src="https://furushima.com.br/wp-content/uploads/2025/02/image-16.png" alt="" class="wp-image-2581" srcset="https://furushima.com.br/wp-content/uploads/2025/02/image-16.png 891w, https://furushima.com.br/wp-content/uploads/2025/02/image-16-300x257.png 300w, https://furushima.com.br/wp-content/uploads/2025/02/image-16-768x658.png 768w" sizes="(max-width: 891px) 100vw, 891px" /></figure>



<p></p>



<p></p>



<p></p>



<figure class="wp-block-image size-large"><img alt="" loading="lazy" decoding="async" width="1024" height="472" src="https://furushima.com.br/wp-content/uploads/2025/02/image-17-1024x472.png" alt="" class="wp-image-2582" srcset="https://furushima.com.br/wp-content/uploads/2025/02/image-17-1024x472.png 1024w, https://furushima.com.br/wp-content/uploads/2025/02/image-17-300x138.png 300w, https://furushima.com.br/wp-content/uploads/2025/02/image-17-768x354.png 768w, https://furushima.com.br/wp-content/uploads/2025/02/image-17.png 1458w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p></p>



<p></p>



<p></p>



<figure class="wp-block-image size-large"><img alt="" loading="lazy" decoding="async" width="1024" height="617" src="https://furushima.com.br/wp-content/uploads/2025/02/image-18-1024x617.png" alt="" class="wp-image-2584" srcset="https://furushima.com.br/wp-content/uploads/2025/02/image-18-1024x617.png 1024w, https://furushima.com.br/wp-content/uploads/2025/02/image-18-300x181.png 300w, https://furushima.com.br/wp-content/uploads/2025/02/image-18-768x463.png 768w, https://furushima.com.br/wp-content/uploads/2025/02/image-18.png 1084w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p><br><br></p>



<p></p>



<p>Observe que a <strong>caixa do Nested Loop</strong> representa o principal gargalo da query, e o <strong>&#8220;Join Filter&#8221;</strong> está relacionado à condição <code>((bp.code)::text = (poi.buyer_product ->> 'buyer_product_code'::text))</code>, o que indica uma junção ineficiente que impacta diretamente o desempenho da consulta.<br><br><br></p>



<p><strong>Conclusão</strong></p>



<p>Neste trabalho, exploramos duas abordagens para analisar e otimizar uma query SQL no PostgreSQL:</p>



<ol class="wp-block-list">
<li><strong>EXPLAIN ANALYZE</strong> → Fornece um relatório detalhado sobre a execução da query, ajudando a identificar custos, tempo de execução e estatísticas importantes.</li>



<li><strong>EXPLAIN Dalibo</strong> → Apresenta um <strong>formato visual e intuitivo</strong>, facilitando a identificação dos pontos críticos da consulta, como <strong>Nested Loops</strong>, filtros ineficientes e ordenações desnecessárias.</li>
</ol>



<p>Além disso, aprendemos a <strong>identificar gargalos</strong> na execução da query, como o <strong>Join Filter ineficiente</strong> e a <strong>ordenção manual</strong> sem suporte de índices. Com isso, aplicamos <strong>índices estratégicos</strong> e sugerimos a troca de algoritmos de junção para melhorar a performance.</p>



<p>O principal aprendizado aqui é que, <strong>antes de otimizar uma query, é essencial entender como o PostgreSQL a executa</strong>, localizar os gargalos e aplicar ajustes <strong>cirúrgicos</strong>, como a criação de índices e a escolha do tipo de junção mais eficiente. <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f680.png" alt="🚀" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
