<?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>POSTGRESQL &#8211; Furushima</title>
	<atom:link href="https://furushima.com.br/blog/tag/postgresql/feed/" rel="self" type="application/rss+xml" />
	<link>https://furushima.com.br</link>
	<description>- Consultoria de Banco de Dados &#124; Furushima</description>
	<lastBuildDate>Mon, 24 Feb 2025 16:38:49 +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>POSTGRESQL &#8211; Furushima</title>
	<link>https://furushima.com.br</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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="" fetchpriority="high" 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="" 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>
