<?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>Arquivo de Otimização de Performance - Data Universe</title>
	<atom:link href="https://datauniverse.com.br/category/otimizacao-de-performance/feed/" rel="self" type="application/rss+xml" />
	<link>https://datauniverse.com.br/category/otimizacao-de-performance/</link>
	<description>Conteúdos sobre as áreas de Data Science, Data Analytics, Estatística e Probabilidade, Inteligência Artificial e Machine Learning.</description>
	<lastBuildDate>Tue, 24 Mar 2026 00:26:22 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://datauniverse.com.br/wp-content/uploads/2026/01/cropped-data-universe-logo-icon-32x32.png</url>
	<title>Arquivo de Otimização de Performance - Data Universe</title>
	<link>https://datauniverse.com.br/category/otimizacao-de-performance/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Views e Materialized Views em Bancos de Dados</title>
		<link>https://datauniverse.com.br/views-em-bancos-de-dados/</link>
					<comments>https://datauniverse.com.br/views-em-bancos-de-dados/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Tue, 24 Mar 2026 00:21:46 +0000</pubDate>
				<category><![CDATA[Otimização de Performance]]></category>
		<category><![CDATA[Curso Fundamentos da Engenharia de Dados]]></category>
		<guid isPermaLink="false">https://datauniverse.com.br/?p=3023</guid>

					<description><![CDATA[<p>No desenvolvimento e na engenharia de dados, nem sempre queremos (ou devemos) dar acesso direto às tabelas brutas do banco de dados. Às vezes, uma tabela é complexa demais, contém informações sensíveis ou exige JOINs exaustivos que os analistas precisam repetir todo dia. Para resolver isso, utilizamos as Views (ou Visões). O que é uma [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/views-em-bancos-de-dados/">Views e Materialized Views em Bancos de Dados</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>No desenvolvimento e na engenharia de dados, nem sempre queremos (ou devemos) dar acesso direto às tabelas brutas do banco de dados. Às vezes, uma tabela é complexa demais, contém informações sensíveis ou exige JOINs exaustivos que os analistas precisam repetir todo dia.</p>



<p>Para resolver isso, utilizamos as <strong>Views</strong> (ou Visões).</p>



<h2 class="wp-block-heading">O que é uma View?</h2>



<p>Uma <strong>view</strong> (ou visão) é uma tabela virtual criada a partir de uma consulta SQL. <mark style="background-color:#fcb900" class="has-inline-color">Ela não armazena dados por si mesma</mark>, em vez disso, é uma &#8220;janela&#8221; que sempre exibe o resultado de uma query pré-definida, como se fosse uma tabela real.</p>



<p>Pense em uma view como um atalho salvo para uma consulta complexa. Quando você consulta uma view, o banco de dados executa a query por trás dela e retorna o resultado, como se você estivesse consultando uma tabela comum.</p>



<p>Veja como uma view se posiciona na arquitetura de um banco de dados:</p>



<figure class="wp-block-image size-full"><img fetchpriority="high" decoding="async" width="678" height="325" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-11.png" alt="" class="wp-image-3026" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-11.png 678w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-11-300x144.png 300w" sizes="(max-width: 678px) 100vw, 678px" /></figure>



<h2 class="wp-block-heading">Por que criar uma view?</h2>



<p><strong>1. Simplicidade e reutilização</strong></p>



<p>Queries longas e com muitos <code>JOIN</code>s podem ser encapsuladas em uma view e reutilizadas em vários lugares, sem repetição de código.</p>



<p><strong>2. Segurança e controle de acesso</strong></p>



<p>Views permitem expor apenas os dados que um usuário ou sistema pode ver, sem dar acesso direto às tabelas.</p>



<p><strong>3. Abstração e manutenção</strong></p>



<p>Se a estrutura do banco mudar, você atualiza apenas a view — as aplicações que a consomem não precisam saber o que mudou por baixo.</p>



<h2 class="wp-block-heading">Como criar uma view: Exemplos práticos</h2>



<p><strong>Exemplo 1 — Criando uma view simples</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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Criando uma view simples
CREATE VIEW resumo_clientes AS
SELECT
    c.id,
    c.nome,
    COUNT(p.id) AS total_pedidos,
    SUM(p.valor) AS valor_total
FROM clientes c
LEFT JOIN pedidos p ON p.cliente_id = c.id
GROUP BY c.id, c.nome;

-- Consultando a view como se fosse uma tabela
SELECT * FROM resumo_clientes WHERE valor_total > 1000;</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Criando uma view simples</span></span>
<span class="line"><span style="color: #F286C4">CREATE</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">VIEW</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">resumo_clientes</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">AS</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #BF9EEE">c</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">id</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #BF9EEE">c</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">nome</span><span style="color: #F6F6F4">,</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">COUNT</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">p</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">id</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> total_pedidos,</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">SUM</span><span style="color: #F6F6F4">(</span><span style="color: #BF9EEE">p</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">valor</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> valor_total</span></span>
<span class="line"><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> clientes c</span></span>
<span class="line"><span style="color: #F286C4">LEFT JOIN</span><span style="color: #F6F6F4"> pedidos p </span><span style="color: #F286C4">ON</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">p</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">cliente_id</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">c</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">id</span></span>
<span class="line"><span style="color: #F286C4">GROUP BY</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">c</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">id</span><span style="color: #F6F6F4">, </span><span style="color: #BF9EEE">c</span><span style="color: #F6F6F4">.</span><span style="color: #BF9EEE">nome</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">-- Consultando a view como se fosse uma tabela</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> resumo_clientes </span><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> valor_total </span><span style="color: #F286C4">&gt;</span><span style="color: #F6F6F4"> </span><span style="color: #BF9EEE">1000</span><span style="color: #F6F6F4">;</span></span></code></pre></div>



<p><strong>Exemplo 2 — relatório de vendas por mês:</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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>CREATE VIEW vendas_mensais AS
SELECT
    DATE_TRUNC('month', data_pedido) AS mes,
    COUNT(*) AS quantidade_pedidos,
    SUM(total) AS receita_total,
    AVG(total) AS ticket_medio
FROM pedidos
WHERE status = 'concluido'
GROUP BY DATE_TRUNC('month', data_pedido)
ORDER BY mes DESC;

-- Uso:
SELECT * FROM vendas_mensais WHERE mes >= '2024-01-01';</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #F286C4">CREATE</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">VIEW</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">vendas_mensais</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">AS</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span></span>
<span class="line"><span style="color: #F6F6F4">    DATE_TRUNC(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">month</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, data_pedido) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> mes,</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">COUNT</span><span style="color: #F6F6F4">(</span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> quantidade_pedidos,</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">SUM</span><span style="color: #F6F6F4">(total) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> receita_total,</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">AVG</span><span style="color: #F6F6F4">(total) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> ticket_medio</span></span>
<span class="line"><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> pedidos</span></span>
<span class="line"><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">status</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">concluido</span><span style="color: #DEE492">&#39;</span></span>
<span class="line"><span style="color: #F286C4">GROUP BY</span><span style="color: #F6F6F4"> DATE_TRUNC(</span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">month</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">, data_pedido)</span></span>
<span class="line"><span style="color: #F286C4">ORDER BY</span><span style="color: #F6F6F4"> mes </span><span style="color: #F286C4">DESC</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">-- Uso:</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> vendas_mensais </span><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> mes </span><span style="color: #F286C4">&gt;=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">2024-01-01</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span></code></pre></div>



<p>Neste vídeo, falo sobre como criar uma View no phpMyAdmin para otimizar consultas no banco de dados de forma simples e eficiente:</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="O que é uma View? Como criar uma View no PhpMyAdmin" width="1290" height="726" src="https://www.youtube.com/embed/bW_8ydv4KTc?start=98&#038;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>



<h2 class="wp-block-heading">Materialized Views: Quando performance importa</h2>



<p>Views comuns executam a query toda vez que são consultadas. Para queries muito pesadas, existe o conceito de <strong>materialized view</strong>, que armazena fisicamente o resultado e pode ser atualizada periodicamente.</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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- PostgreSQL: criando uma materialized view
CREATE MATERIALIZED VIEW estatisticas_diarias AS
SELECT
    DATE(criado_em) AS dia,
    COUNT(*) AS novos_usuarios,
    SUM(receita) AS receita_do_dia
FROM eventos
GROUP BY DATE(criado_em);

-- Atualizando os dados armazenados
REFRESH MATERIALIZED VIEW estatisticas_diarias;</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- PostgreSQL: criando uma materialized view</span></span>
<span class="line"><span style="color: #F286C4">CREATE</span><span style="color: #F6F6F4"> MATERIALIZED VIEW estatisticas_diarias </span><span style="color: #F286C4">AS</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #F286C4">DATE</span><span style="color: #F6F6F4">(criado_em) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> dia,</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">COUNT</span><span style="color: #F6F6F4">(</span><span style="color: #F286C4">*</span><span style="color: #F6F6F4">) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> novos_usuarios,</span></span>
<span class="line"><span style="color: #F6F6F4">    </span><span style="color: #97E1F1">SUM</span><span style="color: #F6F6F4">(receita) </span><span style="color: #F286C4">AS</span><span style="color: #F6F6F4"> receita_do_dia</span></span>
<span class="line"><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> eventos</span></span>
<span class="line"><span style="color: #F286C4">GROUP BY</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">DATE</span><span style="color: #F6F6F4">(criado_em);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">-- Atualizando os dados armazenados</span></span>
<span class="line"><span style="color: #F6F6F4">REFRESH MATERIALIZED VIEW estatisticas_diarias;</span></span></code></pre></div>



<p>É importante conhecer essa diferença, especialmente se você trabalha com grandes volumes de dados:</p>



<ul class="wp-block-list">
<li><strong>View Comum:</strong> É apenas um &#8220;atalho&#8221;. Toda vez que você a chama, o banco executa o SELECT original. Se a tabela base mudar, a View reflete a mudança na hora.</li>



<li><strong>Materialized View (View Materializada):</strong> Muito comum em Data Warehouses (como Snowflake, Oracle ou Redshift). Ela <strong>salva o resultado</strong> da consulta fisicamente no disco.
<ul class="wp-block-list">
<li><strong>Vantagem:</strong> É infinitamente mais rápida para leitura em tabelas gigantes.</li>



<li><strong>Desvantagem:</strong> Os dados podem ficar desatualizados (é necessário dar um &#8220;refresh&#8221; manual ou agendado para atualizar os dados).</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Qual é a diferença entre uma View, um Tabela e uma consulta AD-HOC?</h2>



<ul class="wp-block-list">
<li><strong>Tabelas</strong>: São estruturas físicas que armazenam dados diretamente no banco. Elas são a base de qualquer banco de dados relacional.</li>



<li><strong>Views</strong>: São consultas armazenadas que não armazenam dados por si mesmas, servindo como uma camada de abstração para facilitar o acesso a informações complexas.</li>



<li><strong>Consultas ADHOC:</strong> Uma consulta SQL que é executada de forma esporádica ou para responder a uma necessidade específica, sem estar previamente salva como uma view ou estrutura fixa.</li>
</ul>



<figure class="wp-block-image size-large"><img decoding="async" width="1024" height="572" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-10-1024x572.png" alt="" class="wp-image-3025" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-10-1024x572.png 1024w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-10-300x167.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-10-768x429.png 768w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-10.png 1177w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<p>💡 <strong>Quando usar uma View?</strong><strong><br></strong>Se você deseja simplificar consultas, ocultar dados sensíveis ou organizar melhor as informações sem criar cópias dos dados.</p>



<p>💡 <strong>Quando usar uma Tabela?</strong><strong><br></strong>Sempre que precisar armazenar dados de forma persistente e garantir que sejam acessados com alta performance.</p>



<p>💡 <strong>Quando usar uma Consulta ADHOC?</strong><strong><br></strong>Sempre que precisar responder alguma pergunta temporária que não precisa ser consumida posteriormente</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>Situação</th><th>Usar view?</th></tr></thead><tbody><tr><td>Query complexa repetida em vários lugares</td><td>✅ Sim</td></tr><tr><td>Controle de acesso a colunas sensíveis</td><td>✅ Sim</td></tr><tr><td>Simplificar a interface para outras equipes</td><td>✅ Sim</td></tr><tr><td>Query pesada consultada com muita frequência</td><td>✅ Materialized view</td></tr><tr><td>Precisa inserir/atualizar dados diretamente</td><td>⚠️ Com cuidado (views simples permitem, views com JOIN geralmente não)</td></tr></tbody></table></figure>
<p>O post <a href="https://datauniverse.com.br/views-em-bancos-de-dados/">Views e Materialized Views em Bancos de Dados</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/views-em-bancos-de-dados/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Índices de Banco de Dados (Database Indexes)</title>
		<link>https://datauniverse.com.br/indices-de-banco-de-dados-database-indexes/</link>
					<comments>https://datauniverse.com.br/indices-de-banco-de-dados-database-indexes/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Thu, 12 Mar 2026 02:15:15 +0000</pubDate>
				<category><![CDATA[Otimização de Performance]]></category>
		<category><![CDATA[Curso Fundamentos da Engenharia de Dados]]></category>
		<guid isPermaLink="false">https://datauniverse.com.br/?p=3013</guid>

					<description><![CDATA[<p>Se você já precisou buscar uma informação em uma tabela com milhões de linhas e a consulta demorou minutos (ou até horas) para retornar, você já sentiu na pele a falta de um bom índice. Na Engenharia de Dados e Administração de Bancos de Dados (DBA), os Índices são a principal ferramenta para otimizar a [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/indices-de-banco-de-dados-database-indexes/">Índices de Banco de Dados (Database Indexes)</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>Se você já precisou buscar uma informação em uma tabela com milhões de linhas e a consulta demorou minutos (ou até horas) para retornar, você já sentiu na pele a falta de um bom índice. Na Engenharia de Dados e Administração de Bancos de Dados (DBA), os <strong>Índices</strong> são a principal ferramenta para otimizar a performance de leitura.</p>



<h2 class="wp-block-heading">A Analogia Clássica: O Índice de um Livro</h2>



<p>Imagine que você está lendo um livro de História de 1.000 páginas e quer encontrar todas as menções a &#8220;Júlio César&#8221;.</p>



<ul class="wp-block-list">
<li><strong>Sem um índice (Full Table Scan):</strong> <mark style="background-color:#fcb900" class="has-inline-color">Você teria que ler o livro inteiro, da página 1 à 1.000, procurando o nome. No banco de dados, isso se chama <em>Full Table Scan</em> (Varredura Completa da Tabela)</mark>, e é o pior cenário para a performance.</li>



<li><strong>Com um índice (Index Scan):</strong> Você vai até as últimas páginas do livro, no Índice Remissivo, procura a letra &#8220;J&#8221;, acha &#8220;Júlio César&#8221; e vê que ele é citado nas páginas 45, 112 e 890. Você vai direto a essas páginas.</li>
</ul>



<p>Um índice de banco de dados faz exatamente isso: ele cria uma <strong>estrutura de dados separada</strong> (geralmente uma árvore chamada <strong>B-Tree</strong>) que mantém os valores de uma coluna específica ordenados, junto com um &#8220;ponteiro&#8221; (o número da página) que diz exatamente onde a linha inteira está gravada no disco.</p>



<figure class="wp-block-image size-full"><img decoding="async" width="1011" height="454" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-6.png" alt="" class="wp-image-3015" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-6.png 1011w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-6-300x135.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-6-768x345.png 768w" sizes="(max-width: 1011px) 100vw, 1011px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1009" height="347" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-7.png" alt="" class="wp-image-3016" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-7.png 1009w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-7-300x103.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-7-768x264.png 768w" sizes="(max-width: 1009px) 100vw, 1009px" /></figure>



<figure class="wp-block-image size-full"><img loading="lazy" decoding="async" width="1008" height="435" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-8.png" alt="" class="wp-image-3017" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-8.png 1008w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-8-300x129.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-8-768x331.png 768w" sizes="(max-width: 1008px) 100vw, 1008px" /></figure>



<h2 class="wp-block-heading">O Preço a se Pagar (Trade-offs)</h2>



<p>Se os índices deixam tudo mais rápido, por que não colocamos índices em todas as colunas de todas as tabelas?</p>



<p>Porque <strong>índices não são mágicos; eles têm um custo</strong>.</p>



<ol start="1" class="wp-block-list">
<li><strong>Overhead de Escrita (Lentidão no <a href="https://datauniverse.com.br/crud-create-read-update-e-delete/">CRUD</a>):</strong> Toda vez que você faz um <code>INSERT</code>, <code>UPDATE</code> ou <code>DELETE</code> na tabela, o banco de dados precisa atualizar a tabela principal <strong>E</strong> reorganizar a estrutura do índice. Muitos índices deixam as gravações muito lentas.</li>



<li><strong>Consumo de Disco:</strong> O índice é uma cópia ordenada dos dados daquela coluna. Ele ocupa espaço físico no servidor. Um banco de dados super indexado pode ter seus índices ocupando mais gigabytes do que os próprios dados reais.</li>
</ol>



<h2 class="wp-block-heading">Quando Usar (e Quando NÃO Usar) Índices</h2>



<p>A arte da otimização de banco de dados está em saber equilibrar a balança entre a velocidade de leitura e o custo de escrita.</p>



<p><strong>Onde você DEVE criar índices:</strong></p>



<ul class="wp-block-list">
<li><strong>Chaves Primárias (PK) e Estrangeiras (FK):</strong> (Bancos relacionais geralmente criam o índice da PK automaticamente). Essencial para que os <code>JOINs</code> entre tabelas sejam rápidos.</li>



<li><strong>Colunas muito usadas no <code>WHERE</code>:</strong> Se você pesquisa clientes pelo CPF o tempo todo, a coluna <code>cpf</code> precisa de um índice.</li>



<li><strong>Colunas usadas em <code>ORDER BY</code> ou <code>GROUP BY</code>:</strong> Como o índice já guarda os dados de forma ordenada, o banco não gasta processamento extra para ordenar o resultado.</li>
</ul>



<p><strong>Onde você NÃO DEVE criar índices:</strong></p>



<ul class="wp-block-list">
<li><strong>Tabelas muito pequenas:</strong> Se a tabela tem 500 linhas, o banco lê tudo em milissegundos. O índice só gastaria espaço.</li>



<li><strong>Colunas de Baixa Cardinalidade:</strong> Colunas com poucos valores distintos, como <code>sexo</code> (M/F) ou <code>status</code> (Ativo/Inativo). O índice não ajuda a filtrar muita coisa e o banco pode acabar optando pelo <em>Full Table Scan</em> de qualquer jeito.</li>



<li><strong>Tabelas com altíssimo volume de inserção (<a href="https://datauniverse.com.br/logs-logging/">Logs</a>):</strong> Se uma tabela recebe milhares de <code>INSERTS</code> por segundo e é pouco lida, um índice vai criar um gargalo de gravação.</li>
</ul>



<h2 class="wp-block-heading">Exemplos Práticos em Código SQL</h2>



<p>Vamos ver como aplicar isso na prática usando SQL. Imagine uma tabela <code>Clientes</code> com milhões de registros.</p>



<h3 class="wp-block-heading">1. Criando um Índice Simples</h3>



<p>Se o time de vendas sempre busca clientes pelo e-mail, criar um índice nessa coluna vai transformar uma busca que demorava 10 segundos em algo que leva 5 milissegundos.</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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Criando um índice simples na coluna email
CREATE INDEX idx_clientes_email 
ON Clientes (email);
</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Criando um índice simples na coluna email</span></span>
<span class="line"><span style="color: #F286C4">CREATE</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">INDEX</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">idx_clientes_email</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F286C4">ON</span><span style="color: #F6F6F4"> Clientes (email);</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">2. Criando um Índice Único (Unique Index)</h3>



<p>Além de acelerar a busca, ele garante a integridade dos dados, impedindo que dois clientes sejam cadastrados com o mesmo CPF.</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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Criando um índice único na coluna cpf
CREATE UNIQUE INDEX idx_clientes_cpf 
ON Clientes (cpf);
</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Criando um índice único na coluna cpf</span></span>
<span class="line"><span style="color: #F286C4">CREATE</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">UNIQUE INDEX</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">idx_clientes_cpf</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F286C4">ON</span><span style="color: #F6F6F4"> Clientes (cpf);</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">3. Criando um Índice Composto (Composite Index)</h3>



<p>Se você tem uma consulta que SEMPRE filtra por duas colunas ao mesmo tempo (ex: buscar vendas de uma loja específica em uma data específica), você pode criar um índice que combina as duas colunas.</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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Índice composto: a ordem das colunas importa!
CREATE INDEX idx_vendas_loja_data 
ON Vendas (id_loja, data_venda);
</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Índice composto: a ordem das colunas importa!</span></span>
<span class="line"><span style="color: #F286C4">CREATE</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">INDEX</span><span style="color: #F6F6F4"> </span><span style="color: #62E884">idx_vendas_loja_data</span><span style="color: #F6F6F4"> </span></span>
<span class="line"><span style="color: #F286C4">ON</span><span style="color: #F6F6F4"> Vendas (id_loja, data_venda);</span></span>
<span class="line"></span></code></pre></div>



<p><em>(Nota: Esse índice é excelente para consultas como <code>WHERE id_loja = 5 AND data_venda = '2026-03-11'</code>, mas não ajudaria em nada se você buscasse APENAS pela <code>data_venda</code>).</em></p>



<h3 class="wp-block-heading">4. Removendo um Índice</h3>



<p>Se você percebeu que um índice não está sendo usado e está apenas atrasando suas inserções, você deve excluí-lo.</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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Removendo o índice do banco de dados
DROP INDEX idx_clientes_email;
</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Removendo o índice do banco de dados</span></span>
<span class="line"><span style="color: #F286C4">DROP</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">INDEX</span><span style="color: #F6F6F4"> idx_clientes_email;</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading"><strong>DataWarehouses Modernos não utilizam índices tradicionais.</strong></h2>



<p>Bancos de dados tradicionais (OLTP) usam índices B-Tree para encontrar uma agulha no palheiro (uma linha específica). <mark style="background-color:#fcb900" class="has-inline-color">Já o BigQuery e o Snowflake são bancos <strong>Orientados a Colunas (Columnar Databases)</strong> projetados para análise massiva de dados (OLAP).</mark></p>



<p>Em vez de índices, eles usam três conceitos automáticos:</p>



<ol start="1" class="wp-block-list">
<li><strong>Micro-particionamento (Automático):</strong> No Snowflake, por exemplo, os dados são divididos em arquivos minúsculos chamados <em>micro-partitions</em>. O sistema sabe o valor mínimo e máximo de cada coluna em cada arquivo e descarta o que não precisa ler.</li>



<li><strong>Metadata Cache:</strong> O banco mantém metadados sobre onde cada dado está. Ele não precisa de você para &#8220;criar&#8221; o caminho; ele faz isso sozinho.</li>



<li><strong>Clustering:</strong> É o &#8220;primo&#8221; do índice nessas ferramentas. Você define uma <code>Clustering Key</code> para dizer ao banco: &#8220;Organize esses dados fisicamente por data e região&#8221;. Isso agrupa os dados de forma eficiente.</li>
</ol>



<h3 class="wp-block-heading">Como saber se uma tabela tem &#8220;índices&#8221; (ou otimizações) em Data Warehouses modernos</h3>



<p>Se você está em um banco tradicional, você procura por <strong>Indexes</strong>. Se você está em BigQuery/Snowflake, você procura por <strong>Clustering</strong> e <strong><a href="https://datauniverse.com.br/sharding-vs-partitioning/">Partitioning</a></strong>.</p>



<h4 class="wp-block-heading">1. No Snowflake</h4>



<p>O Snowflake não tem índices. Se você quer saber como uma tabela foi otimizada, você deve checar as <strong>Clustering Keys</strong>.</p>



<ul class="wp-block-list">
<li><strong>Via interface:</strong> Vá na aba &#8220;Data&#8221;, selecione a tabela e procure por &#8220;Clustering Information&#8221;.</li>



<li><strong>Via código SQL:</strong></li>
</ul>



<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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Mostra detalhes da tabela, incluindo as chaves de agrupamento (clustering)
SHOW TABLES LIKE 'nome_da_minha_tabela';
-- Verifique a coluna 'cluster_by' no resultado.
</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Mostra detalhes da tabela, incluindo as chaves de agrupamento (clustering)</span></span>
<span class="line"><span style="color: #F6F6F4">SHOW TABLES </span><span style="color: #F286C4">LIKE</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">nome_da_minha_tabela</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #7B7F8B">-- Verifique a coluna &#39;cluster_by&#39; no resultado.</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading">2. No BigQuery</h4>



<p>O BigQuery usa <strong>Partitioning</strong> (geralmente por data) e <strong>Clustering</strong>.</p>



<ul class="wp-block-list">
<li><strong>Via interface:</strong> Clique na tabela e vá na aba <strong>&#8220;Details&#8221;</strong>. Procure pelas seções &#8220;Table info&#8221; (onde diz se é particionada) e &#8220;Schema&#8221; (onde as colunas de cluster aparecem com um ícone específico).</li>



<li><strong>Via código SQL:</strong></li>
</ul>



<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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Consulta os metadados das tabelas no dataset
SELECT table_name, ddl 
FROM `meu_projeto.meu_dataset.INFORMATION_SCHEMA.TABLES`
WHERE table_name = 'nome_da_tabela';
-- No DDL (o código de criação), você verá as cláusulas PARTITION BY e CLUSTER BY.
</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Consulta os metadados das tabelas no dataset</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span><span style="color: #F6F6F4"> table_name, ddl </span></span>
<span class="line"><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">`</span><span style="color: #E7EE98">meu_projeto.meu_dataset.INFORMATION_SCHEMA.TABLES</span><span style="color: #DEE492">`</span></span>
<span class="line"><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> table_name </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">nome_da_tabela</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"><span style="color: #7B7F8B">-- No DDL (o código de criação), você verá as cláusulas PARTITION BY e CLUSTER BY.</span></span>
<span class="line"></span></code></pre></div>



<h4 class="wp-block-heading">3. Em Bancos Tradicionais (Postgres, SQL Server, MySQL)</h4>



<p>Se você cair em um projeto que usa bancos relacionais comuns, você usa as tabelas de sistema:</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:#282A36"><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" style="color:#f6f6f4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>-- Exemplo para PostgreSQL: Lista todos os índices de uma tabela
SELECT * FROM pg_indexes WHERE tablename = 'nome_da_tabela';

-- Exemplo genérico (muitas ferramentas de BI mostram isso na lateral):
-- Procure por uma pasta chamada "Indexes" na árvore de objetos do banco.
</textarea></pre><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 dracula-soft" style="background-color: #282A36" tabindex="0"><code><span class="line"><span style="color: #7B7F8B">-- Exemplo para PostgreSQL: Lista todos os índices de uma tabela</span></span>
<span class="line"><span style="color: #F286C4">SELECT</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">*</span><span style="color: #F6F6F4"> </span><span style="color: #F286C4">FROM</span><span style="color: #F6F6F4"> pg_indexes </span><span style="color: #F286C4">WHERE</span><span style="color: #F6F6F4"> tablename </span><span style="color: #F286C4">=</span><span style="color: #F6F6F4"> </span><span style="color: #DEE492">&#39;</span><span style="color: #E7EE98">nome_da_tabela</span><span style="color: #DEE492">&#39;</span><span style="color: #F6F6F4">;</span></span>
<span class="line"></span>
<span class="line"><span style="color: #7B7F8B">-- Exemplo genérico (muitas ferramentas de BI mostram isso na lateral):</span></span>
<span class="line"><span style="color: #7B7F8B">-- Procure por uma pasta chamada &quot;Indexes&quot; na árvore de objetos do banco.</span></span>
<span class="line"></span></code></pre></div>



<h2 class="wp-block-heading">Dica para Arquitetos e Engenheiros</h2>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow">
<p>Índices são a ponte entre um sistema que &#8220;funciona&#8221; e um sistema que <strong>escala</strong>. Em um curso de Engenharia de Dados, esse tema é o divisor de águas que ensina os alunos a pararem de culpar o &#8220;servidor fraco&#8221; e começarem a olhar para a estrutura física das suas consultas.</p>
</blockquote>
<p>O post <a href="https://datauniverse.com.br/indices-de-banco-de-dados-database-indexes/">Índices de Banco de Dados (Database Indexes)</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/indices-de-banco-de-dados-database-indexes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Sharding vs. Partitioning</title>
		<link>https://datauniverse.com.br/sharding-vs-partitioning/</link>
					<comments>https://datauniverse.com.br/sharding-vs-partitioning/#respond</comments>
		
		<dc:creator><![CDATA[Alexandre Polselli]]></dc:creator>
		<pubDate>Thu, 05 Mar 2026 18:43:33 +0000</pubDate>
				<category><![CDATA[Otimização de Performance]]></category>
		<category><![CDATA[Curso Fundamentos da Engenharia de Dados]]></category>
		<guid isPermaLink="false">https://datauniverse.com.br/?p=2982</guid>

					<description><![CDATA[<p>À medida que as aplicações crescem, os bancos de dados enfrentam um gargalo inevitável. Tabelas com bilhões de linhas tornam as consultas lentas, os backups demorados e os índices pesados demais para a memória. Quando você atinge o limite do que um único servidor pode suportar (escalabilidade vertical), a solução é &#8220;dividir para conquistar&#8221;. É [&#8230;]</p>
<p>O post <a href="https://datauniverse.com.br/sharding-vs-partitioning/">Sharding vs. Partitioning</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p>À medida que as aplicações crescem, os bancos de dados enfrentam um gargalo inevitável. Tabelas com bilhões de linhas tornam as consultas lentas, os backups demorados e os índices pesados demais para a memória. Quando você atinge o limite do que um único servidor pode suportar (escalabilidade vertical), a solução é &#8220;dividir para conquistar&#8221;.</p>



<p>É aqui que entram duas das arquiteturas mais importantes da Engenharia de Dados e de Software: <strong>Partitioning</strong> (Particionamento) e <strong>Sharding</strong> (Fragmentação). Embora frequentemente confundidos, eles resolvem problemas de escala de maneiras fundamentalmente diferentes.</p>



<h2 class="wp-block-heading">O que é Partitioning (Particionamento)?</h2>



<p><mark style="background-color:#fcb900" class="has-inline-color">O particionamento é a técnica de dividir uma tabela lógica muito grande em pedaços físicos menores e mais gerenciáveis, <strong>dentro do mesmo banco de dados ou servidor</strong>.</mark> O sistema de banco de dados gerencia essas partições de forma transparente; para a aplicação, parece que ela ainda está consultando uma única tabela gigante.</p>



<p>Existem dois tipos principais de particionamento:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td><strong>Particionamento Vertical</strong></td><td><strong>Particionamento Horizontal</strong></td></tr><tr><td>Divide a tabela por <strong>colunas</strong>.<br><br><em>Exemplo:</em> Uma tabela de &#8220;Usuários&#8221; pode ter colunas de acesso frequente (ID, Nome, Email) em uma partição, e colunas pesadas e de acesso raro (Foto de Perfil, Biografia longa) em outra. Isso economiza memória e acelera leituras (I/O).</td><td>Divide a tabela por <strong>linhas</strong>.<br><br><em>Exemplo:</em> Uma tabela de &#8220;Vendas&#8221; pode ser particionada por data. Vendas de 2024 ficam em uma partição, 2025 em outra.<br><br><em>Benefício:</em> Se você consultar apenas as vendas de hoje, o banco de dados ignora as partições antigas (técnica chamada <em>Partition Pruning</em>), acelerando drasticamente a consulta.</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">O que é Sharding (Fragmentação)?</h2>



<p>O Sharding é, na verdade, uma forma extrema de particionamento horizontal. A diferença crucial é a infraestrutura: no Sharding, os dados são divididos e distribuídos <strong>em múltiplos servidores físicos ou instâncias de banco de dados independentes</strong> (chamados de <em>Shards</em>).</p>



<p>Nesta arquitetura, conhecida como <em>Shared-Nothing</em> (Nada Compartilhado), cada Shard atua como um banco de dados autônomo contendo apenas uma fatia dos dados totais.</p>



<ul class="wp-block-list">
<li><strong>Como funciona:</strong> Uma &#8220;Chave de Shard&#8221; (Shard Key) determina para qual servidor o dado vai. Se você fizer o sharding por &#8220;Região&#8221;, o Shard A pode guardar os clientes do Brasil, o Shard B os dos EUA, e o Shard C os da Europa.</li>



<li><strong>Por que usar:</strong> Quando um único servidor (mesmo o mais caro e potente do mercado) não tem mais CPU, RAM ou disco suficiente para lidar com o volume de dados ou de requisições simultâneas. O Sharding permite escalabilidade horizontal infinita: basta adicionar mais servidores baratos ao cluster.</li>
</ul>



<figure class="wp-block-image size-large zoooom"><img loading="lazy" decoding="async" width="1024" height="404" src="https://datauniverse.com.br/wp-content/uploads/2026/03/image-1-1024x404.png" alt="" class="wp-image-2983" srcset="https://datauniverse.com.br/wp-content/uploads/2026/03/image-1-1024x404.png 1024w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-1-300x118.png 300w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-1-768x303.png 768w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-1-1536x606.png 1536w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-1-2048x808.png 2048w, https://datauniverse.com.br/wp-content/uploads/2026/03/image-1-scaled.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></figure>



<h2 class="wp-block-heading">Principais Diferenças</h2>



<p>A tabela abaixo destaca o contraste direto entre as duas abordagens:</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Característica</strong></td><td><strong>Partitioning</strong></td><td><strong>Sharding</strong></td></tr></thead><tbody><tr><td><strong>Localização dos Dados</strong></td><td>Mesmo servidor / mesma instância de banco de dados.</td><td>Múltiplos servidores independentes (Nós/Nodes).</td></tr><tr><td><strong>Objetivo Principal</strong></td><td>Facilidade de manutenção (ex: apagar dados velhos) e otimização de consultas locais.</td><td>Escalabilidade massiva de processamento (CPU/RAM) e armazenamento além do limite de uma máquina.</td></tr><tr><td><strong>Complexidade da Aplicação</strong></td><td>Baixa. O banco de dados gerencia tudo. A aplicação nem percebe a divisão.</td><td>Alta. A aplicação (ou um roteador intermediário) precisa saber para qual servidor enviar a query.</td></tr><tr><td><strong>Disponibilidade</strong></td><td>Se o servidor cair, todos os dados ficam indisponíveis.</td><td>Se um Shard cair, apenas a fatia de dados dele fica offline; o resto do sistema continua operando.</td></tr><tr><td><strong>Consultas Complexas (JOINs)</strong></td><td>Simples. Joins funcionam normalmente pois os dados estão na mesma máquina.</td><td>Muito difícil. Fazer JOIN entre dados que estão em servidores físicos diferentes causa grande lentidão na rede.</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Particionamento na Prática: O E-commerce e o Relatório Lento</h2>



<p>Imagine que você trabalha na engenharia de dados de um grande e-commerce. Vocês têm uma tabela chamada <code>Pedidos</code> no PostgreSQL que armazena todas as vendas desde a fundação da empresa, há 10 anos. Essa tabela tem 5 bilhões de linhas.</p>



<p><strong>O Problema:</strong></p>



<p>Toda vez que o time de marketing tenta puxar um relatório das &#8220;vendas de ontem&#8221;, a query demora minutos para rodar. Além disso, o índice dessa tabela ficou tão gigante que não cabe mais na memória RAM do servidor (que custa caro).</p>



<p><strong>A Solução (Particionamento Horizontal por Data):</strong></p>



<p>Você decide particionar a tabela <code>Pedidos</code> por mês e ano.</p>



<ul class="wp-block-list">
<li><strong>Como fica nos bastidores:</strong> O banco de dados cria tabelas físicas menores &#8220;escondidas&#8221; (ex: <code>pedidos_2025_12</code>, <code>pedidos_2026_01</code>, <code>pedidos_2026_02</code>).</li>



<li><strong>A Mágica (Partition Pruning):</strong> Quando o marketing roda um <code>SELECT * FROM Pedidos WHERE data = '04/03/2026'</code>, o banco de dados é inteligente o suficiente para saber que não precisa ler a tabela inteira. Ele vai <em>direto</em> na partição <code>pedidos_2026_03</code> e ignora todo o resto. O relatório que demorava minutos passa a rodar em milissegundos.</li>



<li><strong>Manutenção:</strong> Se a política da empresa diz que dados com mais de 5 anos devem ser apagados, você não roda um comando <code>DELETE</code> (que travaria o banco e consumiria muito processamento). Você simplesmente roda um <code>DROP PARTITION pedidos_2021_01</code>. A exclusão de milhões de linhas acontece instantaneamente, liberando espaço no disco.</li>
</ul>



<p>Agora imagine que você é o arquiteto de um sistema de CRM (SaaS) global, parecido com o Salesforce. Vocês têm milhares de empresas como clientes.</p>



<p><strong>O Problema:</strong></p>



<p>O sistema faz 100.000 gravações (inserções e atualizações) por segundo. O servidor de banco de dados atual chegou a 100% de uso de CPU, a memória RAM está no limite e o disco não consegue gravar dados mais rápido do que isso. Fazer um particionamento não vai ajudar, porque <em>a máquina física</em> não aguenta mais o tráfego.</p>



<p><strong>A Solução (Sharding Baseado em ID do Cliente):</strong></p>



<p>Você decide transformar seu banco de dados único em um cluster de múltiplos servidores independentes (Shards). Você escolhe o <code>id_empresa</code> como a sua <strong>Chave de Shard (Shard Key)</strong>.</p>



<ul class="wp-block-list">
<li><strong>Como fica nos bastidores:</strong>
<ul class="wp-block-list">
<li><strong>Servidor 1 (Shard A):</strong> Armazena todos os dados das Empresas de ID 1 a 10.000.</li>



<li><strong>Servidor 2 (Shard B):</strong> Armazena todos os dados das Empresas de ID 10.001 a 20.000.</li>



<li><strong>Servidor 3 (Shard C):</strong> Armazena todos os dados das Empresas de ID 20.001 a 30.000.</li>
</ul>
</li>



<li><strong>A Mágica (Roteamento):</strong> Quando um funcionário da Empresa 15.000 faz login e tenta salvar um novo cliente no CRM, a sua aplicação (ou um roteador de banco de dados intermediário) avalia a requisição. Ele vê o ID 15.000 e pensa: <em>&#8220;A Empresa 15.000 mora no Servidor 2&#8221;</em>. A requisição de gravação é enviada <strong>exclusivamente</strong> para o Servidor 2.</li>



<li><strong>Escalabilidade Infinita:</strong> O Servidor 1 e o Servidor 3 nem ficam sabendo dessa transação. Você acabou de dividir o uso de CPU, RAM e Disco por três. Se o SaaS continuar crescendo e vocês ganharem mais 10.000 empresas clientes, basta comprar um Servidor 4 (Shard D) e plugar na arquitetura.</li>
</ul>



<h2 class="wp-block-heading">Resumo do Impacto Prático</h2>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><td><strong>Cenário Prático</strong></td><td><strong>O que você quer resolver?</strong></td><td><strong>Estratégia Recomendada</strong></td><td><strong>Exemplo de Ação</strong></td></tr></thead><tbody><tr><td><strong>Tabela &#8220;Obesa&#8221;</strong></td><td>Consultas lentas em relatórios e dificuldade de apagar dados velhos. A máquina ainda aguenta o tráfego.</td><td><strong>Partitioning</strong></td><td>Dividir a tabela de histórico de transações por Mês/Ano.</td></tr><tr><td><strong>Hardware no Limite</strong></td><td>Muitos usuários simultâneos gravando e lendo dados; CPU e RAM do maior servidor do mercado já não dão conta.</td><td><strong>Sharding</strong></td><td>Dividir o banco de dados por Região (América Latina no Servidor 1, Europa no Servidor 2).</td></tr></tbody></table></figure>



<p>A implementação do particionamento geralmente é nativa e mais simples (bancos como PostgreSQL e MySQL fazem isso muito bem). Já o sharding adiciona uma camada de complexidade grande na engenharia, pois a sua aplicação precisa saber como rotear as informações.</p>



<h2 class="wp-block-heading">Quando escolher qual?</h2>



<p>A regra de ouro na arquitetura de dados é: <strong>Evite o Sharding até que ele seja absolutamente necessário.</strong></p>



<p><strong>Vá de Partitioning quando:</strong></p>



<ul class="wp-block-list">
<li>Você tem tabelas gigantes (ex: <a href="https://datauniverse.com.br/logs-logging/">logs</a>, histórico financeiro) que estão deixando os relatórios lentos.</li>



<li>Você precisa arquivar ou deletar dados antigos rapidamente (basta &#8220;dropar&#8221; a partição do mês passado, o que é instantâneo em comparação a deletar milhões de linhas).</li>



<li>Seu hardware atual ainda tem capacidade de CPU e memória, o problema é apenas a organização do dado no disco.</li>
</ul>



<p><strong>Vá de Sharding quando:</strong></p>



<ul class="wp-block-list">
<li>Você atingiu o limite de hardware. Fazer um <em>upgrade</em> no servidor atual custaria uma fortuna ou é fisicamente impossível.</li>



<li>Sua aplicação tem uma carga massiva de gravação (Writes) que um único disco não consegue processar.</li>



<li>Você precisa de distribuição geográfica (ex: guardar dados de europeus na Europa por questões de latência ou conformidade com a GDPR).</li>
</ul>



<h2 class="wp-block-heading">O Desafio do Sharding: O &#8220;Hotspot&#8221;</h2>



<p>Um dos maiores riscos do Sharding é escolher a chave errada, criando um <strong>Hotspot</strong> (ponto quente). Por exemplo, se você dividir um banco de dados de uma rede social pela letra inicial do nome, o servidor responsável pela letra &#8220;A&#8221; e &#8220;M&#8221; receberá 80% do tráfego e vai travar, enquanto o servidor das letras &#8220;X&#8221;, &#8220;Y&#8221; e &#8220;Z&#8221; ficará ocioso. A distribuição precisa ser perfeitamente balanceada.</p>
<p>O post <a href="https://datauniverse.com.br/sharding-vs-partitioning/">Sharding vs. Partitioning</a> apareceu primeiro em <a href="https://datauniverse.com.br">Data Universe</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://datauniverse.com.br/sharding-vs-partitioning/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
