<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Blog Blog</title>
        <link>https://blog.joaopedrolucatto.com.br/blog</link>
        <description>Blog Blog</description>
        <lastBuildDate>Tue, 21 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[PostgreSQL + TimescaleDB]]></title>
            <link>https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb</link>
            <guid>https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb</guid>
            <pubDate>Tue, 21 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Um resumo sobre como usar PostgreSQL com TimescaleDB para séries temporais]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="timescaledb">TimescaleDB<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#timescaledb" class="hash-link" aria-label="Direct link to TimescaleDB" title="Direct link to TimescaleDB" translate="no">​</a></h2>
<p>Se você trabalha com dados que mudam ao longo do tempo (logs, sensores, métricas), esse combo aqui é simplesmente absurdo:</p>
<p>👉 <strong>PostgreSQL + TimescaleDB</strong></p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="o-que-é-postgresql">O que é PostgreSQL?<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#o-que-%C3%A9-postgresql" class="hash-link" aria-label="Direct link to O que é PostgreSQL?" title="Direct link to O que é PostgreSQL?" translate="no">​</a></h2>
<p>O PostgreSQL é um banco de dados relacional open source extremamente poderoso.</p>
<p>Ele já vem com várias coisas que salvam a vida no dia a dia:</p>
<ul>
<li class="">JSONB (pra dados semi-estruturados)</li>
<li class="">Índices avançados</li>
<li class="">Alta confiabilidade</li>
<li class="">SQL padrão (sem gambiarra)</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="timescaledb-1">TimescaleDB?<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#timescaledb-1" class="hash-link" aria-label="Direct link to TimescaleDB?" title="Direct link to TimescaleDB?" translate="no">​</a></h2>
<p>O TimescaleDB é uma extensão do PostgreSQL focada em <strong>time-series</strong>.</p>
<p>Ele pega tudo que o Postgres já faz bem e turbina para dados com tempo, ou seja, deixa seu Postgres mais robusto para trabalhar com series temporais.</p>
<p>Você continua usando SQL normal, mas com performance muito melhor.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="o-poder-hypertable">O poder: Hypertable<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#o-poder-hypertable" class="hash-link" aria-label="Direct link to O poder: Hypertable" title="Direct link to O poder: Hypertable" translate="no">​</a></h2>
<p>A mágica começa aqui.</p>
<p>Você cria uma tabela normal:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> sensores </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token keyword" style="color:#00009f">time</span><span class="token plain"> TIMESTAMPTZ </span><span class="token operator" style="color:#393A34">NOT</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">NULL</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  device </span><span class="token keyword" style="color:#00009f">TEXT</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  temperatura </span><span class="token keyword" style="color:#00009f">DOUBLE</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">PRECISION</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>E transforma ela em uma Hypertable</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> create_hypertable</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'sensores'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'time'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Isso faz com que o timescaledb divida os dados em "chunks" por tempo. Tendo isso consultas muito mais rápidas.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="segredos-de-bastidores">Segredos de bastidores<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#segredos-de-bastidores" class="hash-link" aria-label="Direct link to Segredos de bastidores" title="Direct link to Segredos de bastidores" translate="no">​</a></h2>
<p>Sem Hypertable:</p>
<ul>
<li class="">Uma tabela gigante</li>
<li class="">Consultas ficando lentas com o tempo</li>
<li class="">INSERTS demorados</li>
<li class="">Aumento constante de Disco(Armazenamento)</li>
<li class="">Consumos grandes de memoria para processamento de query pesadas.</li>
</ul>
<p>Com Hypertable:</p>
<ul>
<li class="">Dados particionados automaticamente</li>
<li class="">Ganho de desempenho em query pesadas</li>
<li class="">Compressão dos dados, com isso, menos consumo de Armazenamento</li>
<li class="">INSERTS mais rapidos</li>
<li class="">Ganho de funções para trabalhar com timeseries.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compressão">Compressão<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#compress%C3%A3o" class="hash-link" aria-label="Direct link to Compressão" title="Direct link to Compressão" translate="no">​</a></h2>
<p>Dados antigos estão deixando seu banco de dados maior! A compressão do é um recurso feito para reduzir drasticamente o tamanho do banco de dados. Muitas vezes isso ajuda também a melhorar consultas historicas
sem precisar "arquivar fora" do postgres.</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">ALTER</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">TABLE</span><span class="token plain"> sensores </span><span class="token keyword" style="color:#00009f">SET</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  timescaledb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">compress</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  timescaledb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">compress_segmentby </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'coluna_segmentacao'</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic">-- Ex: device_id</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> add_compression_policy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'sensores'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTERVAL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1 year'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Com isso os dados com mais de 1 ano serão comprimidos automaticamente!
Para verificar o processo de compressao e espaço economizado.</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> hypertable_compression_stats</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'sensores'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="dashboards-continuous-aggregates">Dashboards: Continuous Aggregates<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#dashboards-continuous-aggregates" class="hash-link" aria-label="Direct link to Dashboards: Continuous Aggregates" title="Direct link to Dashboards: Continuous Aggregates" translate="no">​</a></h2>
<p>Imagina você precisar fornecer dados para N dashboards! Processar isso via query ou no front, não vai ser uma opção!
Com isso temos as famosas CAGGs</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">CREATE</span><span class="token plain"> MATERIALIZED </span><span class="token keyword" style="color:#00009f">VIEW</span><span class="token plain"> sensores_media</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">WITH</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">timescaledb</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">continuous</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  time_bucket</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'1 hour'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">time</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> bucket</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token function" style="color:#d73a49">avg</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">temperatura</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain"> sensores</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">GROUP</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">BY</span><span class="token plain"> bucket</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="política-de-retenção">Política de Retenção<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#pol%C3%ADtica-de-reten%C3%A7%C3%A3o" class="hash-link" aria-label="Direct link to Política de Retenção" title="Direct link to Política de Retenção" translate="no">​</a></h2>
<p>Dados antigos coletados muitas vezes perdem seu valor ao longo do tempo(Podemos discutir isso em outro assunto)! Quer apagar seus dados automaticamente.</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> add_retention_policy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'sensores'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTERVAL</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'3 year'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">;</span><br></div></code></pre></div></div>
<p>Simples assim!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusão">Conclusão<a href="https://blog.joaopedrolucatto.com.br/blog/pg-timescaledb#conclus%C3%A3o" class="hash-link" aria-label="Direct link to Conclusão" title="Direct link to Conclusão" translate="no">​</a></h2>
<p>O TimescaleDB é extremamente poderoso mas, como qualquer ferramenta, precisa ser bem utilizado.
Não basta apenas instalar o TimescaleDB no PostgreSQL e esperar que a performance melhore da noite para o dia. É necessário entender o tipo de dado que você está lidando, como as consultas
são feitas e se o modelo de séries temporais realmente se encaixa no seu problema.
Sem esse cuidado, é comum cair na armadilha do “não funcionou”, quando na verdade o problema está no uso incorreto da ferramenta.
Antes de adotar, vale analisar bem o cenário, testar e validar se faz sentido para o seu caso e para o seu time.
Quando bem aplicado, aí sim o TimescaleDB mostra todo o seu potencial.</p>]]></content:encoded>
            <category>PostgreSQL</category>
            <category>timescale</category>
        </item>
    </channel>
</rss>