<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Saulo Siqueira</title>
    <description>The latest articles on DEV Community by Saulo Siqueira (@saulo_siqueira).</description>
    <link>https://dev.to/saulo_siqueira</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1050581%2F06e65eb0-8cdd-45ef-8b5e-50c31a9f633a.jpg</url>
      <title>DEV Community: Saulo Siqueira</title>
      <link>https://dev.to/saulo_siqueira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/saulo_siqueira"/>
    <language>en</language>
    <item>
      <title>Dicas PostgreSQL</title>
      <dc:creator>Saulo Siqueira</dc:creator>
      <pubDate>Wed, 28 Jun 2023 17:30:49 +0000</pubDate>
      <link>https://dev.to/saulo_siqueira/dicas-postgresql-33ch</link>
      <guid>https://dev.to/saulo_siqueira/dicas-postgresql-33ch</guid>
      <description>&lt;p&gt;&lt;strong&gt;🐘 Consultas Úteis para Monitorar e Diagnosticar Bancos PostgreSQL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Manter um banco de dados PostgreSQL saudável vai muito além de apenas armazenar dados. É fundamental monitorar o crescimento das tabelas, detectar consultas lentas, identificar índices ausentes e, quando necessário, encerrar sessões problemáticas.&lt;/p&gt;

&lt;p&gt;Neste artigo, reuni alguns comandos SQL essenciais para diagnosticar o comportamento do banco e manter a performance em dia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔍 Verificando o tamanho das tabelas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para saber quais tabelas estão ocupando mais espaço no seu banco de dados, use a consulta abaixo.&lt;br&gt;
Ela retorna o tamanho individual e total (incluindo índices) de cada tabela, ordenadas da maior para a menor:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT esquema, tabela,&lt;br&gt;
       pg_size_pretty(pg_relation_size(esq_tab)) AS tamanho,&lt;br&gt;
       pg_size_pretty(pg_total_relation_size(esq_tab)) AS tamanho_total&lt;br&gt;
  FROM (SELECT tablename AS tabela,&lt;br&gt;
               schemaname AS esquema,&lt;br&gt;
               schemaname||'.'||tablename AS esq_tab&lt;br&gt;
          FROM pg_catalog.pg_tables&lt;br&gt;
         WHERE schemaname NOT&lt;br&gt;
            IN ('pg_catalog', 'information_schema', 'pg_toast') ) AS x&lt;br&gt;
 ORDER BY pg_total_relation_size(esq_tab) DESC;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;💡 Dica:&lt;/strong&gt; Ideal para identificar tabelas que podem precisar de manutenção, particionamento ou limpeza de dados antigos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🛑 Cancelando instruções SQL&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Em alguns casos, consultas travadas ou ociosas podem estar consumindo recursos do banco.&lt;br&gt;
Use o comando abaixo para encerrar sessões que estão em estado IDLE:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT&lt;br&gt;
pg_terminate_backend(procpid)&lt;br&gt;
FROM&lt;br&gt;
pg_stat_activity&lt;br&gt;
WHERE&lt;br&gt;
current_query = '&amp;lt;IDLE&amp;gt;';&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;⚠️ Atenção:&lt;/strong&gt;&lt;br&gt;
Encerrar processos pode impactar conexões de aplicações ativas.&lt;br&gt;
Sempre verifique antes com um SELECT * FROM pg_stat_activity;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📊 Encontrando tabelas sem índices adequados&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Consultas que fazem full table scans (varredura completa) podem indicar a ausência de índices.&lt;br&gt;
Use a consulta abaixo para identificar possíveis pontos de melhoria:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT &lt;br&gt;
  relname AS TableName,&lt;br&gt;
  seq_scan - idx_scan AS TotalSeqScan,&lt;br&gt;
  CASE WHEN seq_scan - idx_scan &amp;gt; 0 &lt;br&gt;
       THEN 'Missing Index Found' &lt;br&gt;
       ELSE 'Missing Index Not Found' &lt;br&gt;
  END AS MissingIndex,&lt;br&gt;
  pg_size_pretty(pg_relation_size(relname::regclass)) AS TableSize,&lt;br&gt;
  idx_scan AS TotalIndexScan&lt;br&gt;
FROM pg_stat_all_tables&lt;br&gt;
WHERE schemaname = 'public'&lt;br&gt;
  AND pg_relation_size(relname::regclass) &amp;gt; 100000 &lt;br&gt;
ORDER BY 2 DESC;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📈 Resultado:&lt;/strong&gt;&lt;br&gt;
Você verá quais tabelas estão sendo mais varridas sem uso de índice — ótimos candidatos para otimização.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Consultas que estão rodando há mais de 1 minuto&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para visualizar queries longas em execução, rode:&lt;br&gt;
&lt;code&gt;SELECT&lt;br&gt;
CURRENT_TIMESTAMP - query_start AS runtime,&lt;br&gt;
datname,&lt;br&gt;
usename,&lt;br&gt;
query&lt;br&gt;
FROM&lt;br&gt;
pg_stat_activity&lt;br&gt;
WHERE&lt;br&gt;
state = 'active'&lt;br&gt;
AND CURRENT_TIMESTAMP - query_start &amp;gt; '1 min'&lt;br&gt;
ORDER BY&lt;br&gt;
1 DESC;&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;strong&gt;🧠 Uso prático:&lt;/strong&gt;&lt;br&gt;
Ajuda a identificar gargalos, deadlocks ou consultas que precisam ser otimizadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;💬 Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essas consultas são extremamente úteis para:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auditar o consumo de espaço no banco;&lt;/li&gt;
&lt;li&gt;Diagnosticar lentidão em consultas;&lt;/li&gt;
&lt;li&gt;Detectar índices ausentes;&lt;/li&gt;
&lt;li&gt;Controlar sessões problemáticas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manter essas práticas no seu dia a dia de DBA ou DevOps pode evitar grandes dores de cabeça e garantir uma operação mais estável e performática no PostgreSQL. 🚀&lt;/p&gt;

&lt;p&gt;✍️ &lt;strong&gt;Autor:&lt;/strong&gt; Saulo José Eduardo de Siqueira&lt;br&gt;
💻 &lt;strong&gt;Gerente de Projetos &amp;amp; Desenvolvedor PHP/Laravel&lt;/strong&gt; apaixonado por DevOps e performance de sistemas.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>dba</category>
    </item>
    <item>
      <title>Excluindo Valores no PostgreSQL: Utilizando Expressões Regulares para Filtrar Dados</title>
      <dc:creator>Saulo Siqueira</dc:creator>
      <pubDate>Wed, 28 Jun 2023 17:23:42 +0000</pubDate>
      <link>https://dev.to/saulo_siqueira/excluindo-valores-no-postgresql-utilizando-expressoes-regulares-para-filtrar-dados-56o6</link>
      <guid>https://dev.to/saulo_siqueira/excluindo-valores-no-postgresql-utilizando-expressoes-regulares-para-filtrar-dados-56o6</guid>
      <description>&lt;p&gt;No PostgreSQL, o operador !~ é usado para verificar se uma string não corresponde a uma expressão regular. Ele retorna verdadeiro se a string não corresponder à expressão regular especificada.&lt;/p&gt;

&lt;p&gt;Em termos mais simples, o operador !~ é usado para negar a correspondência de uma expressão regular. Se a expressão regular encontrar uma correspondência na string, o operador !~ retornará falso. Por outro lado, se a expressão regular não encontrar uma correspondência na string, o operador !~ retornará verdadeiro.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT *&lt;br&gt;
FROM tabela&lt;br&gt;
WHERE coluna !~ '^(sup|age)'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No contexto da consulta SQL que forneci anteriormente, a cláusula WHERE coluna !~ '^(sup|age)' está excluindo os valores em que a coluna não corresponde ao padrão definido pela expressão regular '^(sup|age)', ou seja, valores que não começam com "sup" ou "age".&lt;/p&gt;

&lt;p&gt;Essa é uma forma diferente de escrever em relação a forma tradicional abaixo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;SELECT *&lt;br&gt;
FROM tabela&lt;br&gt;
WHERE coluna !ILIKE 'sup%' AND coluna !ILIKE 'age%'&lt;/code&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>regex</category>
    </item>
  </channel>
</rss>
