{"id":2825,"date":"2026-09-11T17:50:05","date_gmt":"2026-09-11T20:50:05","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/"},"modified":"2026-09-11T17:50:05","modified_gmt":"2026-09-11T20:50:05","slug":"aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/","title":{"rendered":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf"},"content":{"rendered":"<p>Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso <strong>PostgreSQL \u2014 Do Zero ao Avan\u00e7ado<\/strong>. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a <strong>performance<\/strong>. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de &#8220;apertar bot\u00f5es&#8221;; trata-se de compreender profundamente como o planejador de consultas funciona, como os processos de manuten\u00e7\u00e3o autom\u00e1tica interferem no throughput e como cada par\u00e2metro do arquivo <strong>postgresql.conf<\/strong> pode influenciar diretamente a lat\u00eancia das suas aplica\u00e7\u00f5es. Ao dominar o <strong>EXPLAIN ANALYZE<\/strong>, o <strong>autovacuum<\/strong> e o ajuste fino do servidor, voc\u00ea ser\u00e1 capaz de diagnosticar gargalos, evitar degrada\u00e7\u00f5es silenciosas e extrair o m\u00e1ximo do hardware dispon\u00edvel.<\/p>\n<p>Esta aula foi projetada para profissionais de TI, engenheiros de infraestrutura, DBAs e desenvolvedores que j\u00e1 conclu\u00edram as aulas anteriores do curso e possuem familiaridade com SQL, administra\u00e7\u00e3o b\u00e1sica do PostgreSQL e conceitos de sistemas operacionais. Voc\u00ea aprender\u00e1 a interpretar planos de execu\u00e7\u00e3o detalhados, identificar opera\u00e7\u00f5es custosas como <strong>Seq Scan<\/strong> e <strong>Sort<\/strong>, compreender o papel vital do <strong>autovacuum<\/strong> na preven\u00e7\u00e3o do incha\u00e7o de tabelas (<em>bloat<\/em>) e no gerenciamento de transa\u00e7\u00f5es, al\u00e9m de aplicar um conjunto de par\u00e2metros de <em>tuning<\/em> validados em ambientes de produ\u00e7\u00e3o reais. Tudo isso com instru\u00e7\u00f5es passo a passo, comandos completos e sa\u00eddas esperadas \u2014 sem atalhos ou resumos vagos.<\/p>\n<p>Ao final desta aula, voc\u00ea ter\u00e1 condi\u00e7\u00f5es de executar uma auditoria de performance em qualquer inst\u00e2ncia PostgreSQL, propor e aplicar melhorias sustent\u00e1veis, monitorar o comportamento do <strong>autovacuum<\/strong> e ajustar o <strong>postgresql.conf<\/strong> com confian\u00e7a. Em nossos projetos na <strong>JRT Technology Solutions<\/strong>, nossos especialistas utilizam diariamente as t\u00e9cnicas que voc\u00ea ver\u00e1 a seguir para resolver incidentes de lentid\u00e3o e garantir acordos de n\u00edvel de servi\u00e7o (SLAs) rigorosos. A <strong>JRT Technology Solutions<\/strong> tamb\u00e9m oferece treinamentos, implementa\u00e7\u00e3o e suporte completo em PostgreSQL para empresas que buscam alta disponibilidade e m\u00e1xima performance.<\/p>\n<p>Prepare-se para uma aula densa, pr\u00e1tica e extremamente aplic\u00e1vel. Recomendamos que voc\u00ea execute cada comando em um ambiente de testes \u2014 preferencialmente uma m\u00e1quina virtual ou container dedicado \u2014 para internalizar o conhecimento. Vamos come\u00e7ar.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<p>Esta aula foi estruturada para fornecer um caminho progressivo e completo rumo \u00e0 otimiza\u00e7\u00e3o de <strong>performance<\/strong> no PostgreSQL. Os objetivos de aprendizagem s\u00e3o:<\/p>\n<ul>\n<li>Compreender a arquitetura do planejador e do executor de consultas do PostgreSQL, e como o <strong>custo<\/strong> \u00e9 calculado.<\/li>\n<li>Dominar o uso do comando <strong>EXPLAIN<\/strong> e, principalmente, do <strong>EXPLAIN ANALYZE<\/strong> para diagnosticar gargalos reais de execu\u00e7\u00e3o.<\/li>\n<li>Identificar opera\u00e7\u00f5es comuns em planos de execu\u00e7\u00e3o, como <strong>Seq Scan<\/strong>, <strong>Index Scan<\/strong>, <strong>Bitmap Heap Scan<\/strong>, <strong>Nested Loop<\/strong>, <strong>Hash Join<\/strong> e <strong>Merge Join<\/strong>.<\/li>\n<li>Entender o funcionamento do <strong>autovacuum<\/strong>, seus par\u00e2metros de configura\u00e7\u00e3o e como monitor\u00e1-lo de forma efetiva.<\/li>\n<li>Realizar o <em>tuning<\/em> do arquivo <strong>postgresql.conf<\/strong> nos sistemas operacionais Ubuntu\/Debian e CentOS\/RHEL\/Rocky Linux.<\/li>\n<li>Verificar e testar cada ajuste aplicado, com comandos de valida\u00e7\u00e3o e sa\u00eddas esperadas.<\/li>\n<li>Resolver os erros mais comuns relacionados a <strong>performance<\/strong>, <strong>autovacuum<\/strong> e configura\u00e7\u00e3o do servidor.<\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Antes de iniciar esta aula, \u00e9 fundamental que voc\u00ea tenha conclu\u00eddo as aulas anteriores do curso, especialmente aquelas sobre instala\u00e7\u00e3o do PostgreSQL, gerenciamento de bancos de dados, usu\u00e1rios, permiss\u00f5es e administra\u00e7\u00e3o b\u00e1sica via <strong>psql<\/strong> e ferramentas de linha de comando. Al\u00e9m disso, recomendamos que voc\u00ea tenha acesso a um servidor Linux com PostgreSQL j\u00e1 instalado e funcionando. Para este guia, consideraremos duas fam\u00edlias de distribui\u00e7\u00f5es principais: <strong>Ubuntu\/Debian<\/strong> (utilizando o gerenciador de pacotes <strong>apt<\/strong>) e <strong>CentOS\/RHEL\/Rocky Linux<\/strong> (utilizando <strong>dnf<\/strong> ou <strong>yum<\/strong>).<\/p>\n<p>Voc\u00ea precisar\u00e1 de:<\/p>\n<ul>\n<li>Uma inst\u00e2ncia PostgreSQL vers\u00e3o 14 ou superior (recomendamos a vers\u00e3o 15 ou 16 para aproveitar as \u00faltimas melhorias de <strong>performance<\/strong>).<\/li>\n<li>Acesso ao usu\u00e1rio <strong>postgres<\/strong> ou a um usu\u00e1rio com privil\u00e9gios de superusu\u00e1rio no banco.<\/li>\n<li>Permiss\u00f5es de superusu\u00e1rio no sistema operacional (root ou sudo) para editar o arquivo <strong>postgresql.conf<\/strong> e reiniciar o servi\u00e7o.<\/li>\n<li>Ferramentas de linha de comando: <strong>psql<\/strong>, <strong>pgbench<\/strong> (opcional, para testes de carga), <strong>top<\/strong>, <strong>htop<\/strong>, <strong>iostat<\/strong> e <strong>vmstat<\/strong>.<\/li>\n<li>Um banco de dados de testes com tabelas populadas para executar os exemplos de <strong>EXPLAIN ANALYZE<\/strong> \u2014 voc\u00ea pode criar um banco simples com algumas tabelas e inserir dados fict\u00edcios.<\/li>\n<\/ul>\n<p>Os comandos mostrados foram testados em ambientes com PostgreSQL 15 e 16, mas a grande maioria dos conceitos e par\u00e2metros \u00e9 compat\u00edvel com vers\u00f5es anteriores (a partir da 11). Se voc\u00ea ainda n\u00e3o possui um ambiente preparado, recomendamos criar uma m\u00e1quina virtual limpa ou um container Docker com a imagem oficial do PostgreSQL. Em nossos laborat\u00f3rios na <strong>JRT Technology Solutions<\/strong>, costumamos usar containers para isolar cen\u00e1rios de teste e evitar interfer\u00eancias entre vers\u00f5es.<\/p>\n<h3>Fundamentos de Performance no PostgreSQL: O Planejador e o Executor<\/h3>\n<p>Para entender <strong>performance<\/strong> no PostgreSQL, \u00e9 essencial compreender como uma consulta SQL \u00e9 processada internamente. O fluxo b\u00e1sico envolve quatro etapas principais: <strong>parsing<\/strong> (an\u00e1lise sint\u00e1tica), <strong>rewriting<\/strong> (reescrita de regras), <strong>planning<\/strong> (planejamento) e <strong>execution<\/strong> (execu\u00e7\u00e3o). O planejador \u00e9 o componente respons\u00e1vel por gerar um plano de execu\u00e7\u00e3o eficiente com base em estat\u00edsticas coletadas das tabelas e \u00edndices. Essas estat\u00edsticas s\u00e3o mantidas pelo processo <strong>autovacuum<\/strong> e pelo comando <strong>ANALYZE<\/strong>.<\/p>\n<p>O planejador atribui um <strong>custo<\/strong> a cada opera\u00e7\u00e3o poss\u00edvel \u2014 varredura sequencial (<em>Seq Scan<\/em>), varredura de \u00edndice (<em>Index Scan<\/em>), jun\u00e7\u00f5es (<em>Hash Join<\/em>, <em>Nested Loop<\/em>, <em>Merge Join<\/em>) \u2014 e escolhe o plano com menor custo estimado. Esse custo \u00e9 influenciado por par\u00e2metros como <strong>seq_page_cost<\/strong>, <strong>random_page_cost<\/strong>, <strong>cpu_tuple_cost<\/strong> e <strong>cpu_operator_cost<\/strong>, que voc\u00ea ajustar\u00e1 mais adiante. Quando as estat\u00edsticas est\u00e3o desatualizadas, o planejador pode tomar decis\u00f5es ruins, resultando em planos sub\u00f3timos e lentid\u00e3o.<\/p>\n<p>O <strong>EXPLAIN<\/strong> permite visualizar o plano escolhido pelo planejador sem executar a consulta, enquanto o <strong>EXPLAIN ANALYZE<\/strong> executa a consulta de fato e coleta m\u00e9tricas reais de tempo e custo. A diferen\u00e7a entre custo estimado e custo real \u00e9 um dos primeiros sinais de que as estat\u00edsticas precisam ser atualizadas. Em nossa experi\u00eancia na <strong>JRT Technology Solutions<\/strong>, a maioria dos problemas de <strong>performance<\/strong> relatados por clientes est\u00e1 relacionada a estat\u00edsticas desatualizadas ou falta de \u00edndices adequados \u2014 e n\u00e3o a erros de configura\u00e7\u00e3o do servidor.<\/p>\n<p>Outro conceito fundamental \u00e9 o <strong>bloat<\/strong> (incha\u00e7o). Devido ao modelo MVCC (Multi-Version Concurrency Control), o PostgreSQL mant\u00e9m m\u00faltiplas vers\u00f5es de linhas para suportar transa\u00e7\u00f5es concorrentes. Linhas mortas (dead tuples) s\u00e3o removidas pelo <strong>VACUUM<\/strong>, mas se o <strong>autovacuum<\/strong> n\u00e3o estiver configurado corretamente, o incha\u00e7o pode crescer descontroladamente, aumentando o I\/O e degradando a <strong>performance<\/strong>. Por isso, o <strong>autovacuum<\/strong> \u00e9 pe\u00e7a-chave nesta aula.<\/p>\n<p>Durante o restante da aula, voc\u00ea aplicar\u00e1 esses conceitos na pr\u00e1tica. Vamos come\u00e7ar criando um ambiente de testes com tabelas e dados, para que voc\u00ea possa reproduzir todos os exemplos de <strong>EXPLAIN ANALYZE<\/strong> e <em>tuning<\/em>.<\/p>\n<h3>Passo a Passo: Preparando o Banco de Dados para Testes de Performance<\/h3>\n<p>Antes de analisar planos de execu\u00e7\u00e3o e ajustar o servidor, precisamos de um banco de dados com volume de dados suficiente para que as diferen\u00e7as de <strong>performance<\/strong> sejam percept\u00edveis. Execute os comandos abaixo no terminal, preferencialmente como usu\u00e1rio <strong>postgres<\/strong> ou com privil\u00e9gios equivalentes. Vamos criar um banco chamado <strong>loja<\/strong>, uma tabela <strong>clientes<\/strong> com 1 milh\u00e3o de registros e uma tabela <strong>pedidos<\/strong> com 5 milh\u00f5es de registros, al\u00e9m de alguns \u00edndices estrat\u00e9gicos.<\/p>\n<ol>\n<li>Acesse o shell do PostgreSQL com o comando <strong>sudo -u postgres psql<\/strong> (ou <strong>psql -U postgres<\/strong> se voc\u00ea estiver logado como usu\u00e1rio do sistema com autentica\u00e7\u00e3o peer).<\/li>\n<li>Crie o banco de dados <strong>loja<\/strong> com o comando <strong>CREATE DATABASE loja;<\/strong> \u2014 aguarde a conclus\u00e3o.<\/li>\n<li>Conecte-se ao banco <strong>loja<\/strong> com <strong>\\c loja<\/strong> ou saindo e entrando novamente.<\/li>\n<li>Execute os comandos SQL abaixo para cria\u00e7\u00e3o das tabelas e inser\u00e7\u00e3o de dados. O uso de <strong>generate_series<\/strong> \u00e9 uma forma eficiente de popular tabelas rapidamente.<\/li>\n<li>Ap\u00f3s a cria\u00e7\u00e3o, atualize as estat\u00edsticas com o comando <strong>ANALYZE<\/strong> para garantir que o planejador tenha m\u00e9tricas precisas.<\/li>\n<\/ol>\n<p>Os comandos completos para cria\u00e7\u00e3o e popula\u00e7\u00e3o do banco s\u00e3o apresentados a seguir. Preste aten\u00e7\u00e3o aos coment\u00e1rios em cada linha, pois eles explicam a finalidade de cada opera\u00e7\u00e3o e as op\u00e7\u00f5es utilizadas.<\/p>\n<pre><code>-- Conectar ao PostgreSQL como superusu\u00e1rio (no terminal do SO)\nsudo -u postgres psql\n\n-- Dentro do psql, criar o banco de dados de testes\nCREATE DATABASE loja;\n\n-- Conectar ao banco loja\n\\c loja\n\n-- Criar a tabela de clientes com 1 milh\u00e3o de registros\nCREATE TABLE clientes (\n    id_cliente serial PRIMARY KEY,\n    nome text NOT NULL,\n    email text UNIQUE NOT NULL,\n    cidade text NOT NULL,\n    data_cadastro date NOT NULL\n);\n\n-- Popular a tabela clientes usando generate_series\nINSERT INTO clientes (nome, email, cidade, data_cadastro)\nSELECT\n    'Cliente ' || g,\n    'cliente' || g || '@exemplo.com',\n    (ARRAY['S\u00e3o Paulo', 'Rio de Janeiro', 'Belo Horizonte', 'Curitiba', 'Porto Alegre'])[floor(random() * 5 + 1)::int],\n    DATE '2020-01-01' + (random() * 1825)::int\nFROM generate_series(1, 1000000) AS g;\n\n-- Criar a tabela de pedidos com 5 milh\u00f5es de registros\nCREATE TABLE pedidos (\n    id_pedido bigserial PRIMARY KEY,\n    id_cliente integer REFERENCES clientes(id_cliente),\n    valor_total numeric(12,2) NOT NULL,\n    status text NOT NULL,\n    data_pedido timestamp NOT NULL\n);\n\n-- Popular a tabela pedidos\nINSERT INTO pedidos (id_cliente, valor_total, status, data_pedido)\nSELECT\n    (random() * 999999 + 1)::int,\n    (random() * 10000 + 10)::numeric(12,2),\n    (ARRAY['PENDENTE', 'PAGO', 'ENVIADO', 'ENTREGUE', 'CANCELADO'])[floor(random() * 5 + 1)::int],\n    TIMESTAMP '2023-01-01 00:00:00' + (random() * (EXTRACT(EPOCH FROM (TIMESTAMP '2026-09-11 00:00:00' - TIMESTAMP '2023-01-01 00:00:00'))) * interval '1 second')\nFROM generate_series(1, 5000000) AS g;\n\n-- Criar \u00edndices estrat\u00e9gicos para simular cen\u00e1rios reais\nCREATE INDEX idx_pedidos_id_cliente ON pedidos(id_cliente);\nCREATE INDEX idx_pedidos_status ON pedidos(status);\nCREATE INDEX idx_pedidos_data_pedido ON pedidos(data_pedido);\nCREATE INDEX idx_clientes_cidade ON clientes(cidade);\n\n-- Atualizar as estat\u00edsticas das tabelas\nANALYZE clientes;\nANALYZE pedidos;\n<\/code><\/pre>\n<p>A execu\u00e7\u00e3o dos comandos acima pode levar alguns minutos, dependendo do hardware da sua m\u00e1quina. A tabela <strong>pedidos<\/strong> com 5 milh\u00f5es de linhas e seus \u00edndices ocupar\u00e1 cerca de 1 a 2 GB em disco. Esse volume \u00e9 suficiente para que os tempos de execu\u00e7\u00e3o das consultas sejam relevantes e para que as diferen\u00e7as entre planos de execu\u00e7\u00e3o fiquem evidentes. Se voc\u00ea preferir um ambiente mais leve, pode reduzir os valores de <strong>generate_series<\/strong> para 100 mil e 500 mil, respectivamente, mas lembre-se de que consultas muito r\u00e1pidas podem mascarar os efeitos que vamos analisar.<\/p>\n<p>Ap\u00f3s a cria\u00e7\u00e3o e o <strong>ANALYZE<\/strong>, verifique se as estat\u00edsticas foram coletadas corretamente consultando a tabela <strong>pg_stats<\/strong>. O comando abaixo mostra as estat\u00edsticas da coluna <strong>cidade<\/strong> da tabela <strong>clientes<\/strong>, incluindo o n\u00famero de valores distintos e os valores mais comuns. Essas informa\u00e7\u00f5es s\u00e3o exatamente o que o planejador utiliza para estimar a seletividade e, consequentemente, escolher o melhor plano.<\/p>\n<pre><code>-- Verificar estat\u00edsticas coletadas para a coluna cidade da tabela clientes\nSELECT\n    attname AS coluna,\n    n_distinct AS num_valores_distintos,\n    most_common_vals AS valores_mais_comuns,\n    most_common_freqs AS frequencias\nFROM pg_stats\nWHERE schemaname = 'public'\n  AND tablename = 'clientes'\n  AND attname = 'cidade';\n<\/code><\/pre>\n<p>A sa\u00edda esperada para esse comando variar\u00e1 de acordo com a aleatoriedade da inser\u00e7\u00e3o, mas deve mostrar cinco valores distintos (ou pr\u00f3ximo disso) para a coluna <strong>cidade<\/strong>, indicando que o <strong>ANALYZE<\/strong> conseguiu identificar corretamente a cardinalidade. Se o valor de <strong>n_distinct<\/strong> for muito diferente de 5, execute novamente o <strong>ANALYZE<\/strong> ou verifique se os dados foram inseridos corretamente.<\/p>\n<pre><code class=\"output\">   coluna   | num_valores_distintos |                    valores_mais_comuns                    |         frequencias\n------------+-----------------------+-----------------------------------------------------------+-------------------------------\n cidade     |                     5 | {\"Belo Horizonte\",\"Curitiba\",\"Porto Alegre\",\"Rio de Janeiro\",\"S\u00e3o Paulo\"} | {0.1999,0.2003,0.1997,0.2000,0.2001}\n(1 linha)\n<\/code><\/pre>\n<p>Com o ambiente de testes preparado, voc\u00ea est\u00e1 pronto para explorar o <strong>EXPLAIN ANALYZE<\/strong> e interpretar planos de execu\u00e7\u00e3o de forma profissional. Na pr\u00f3xima se\u00e7\u00e3o, vamos executar consultas t\u00edpicas de aplica\u00e7\u00f5es e dissecar cada n\u00f3 do plano.<\/p>\n<h3>Dominando o EXPLAIN ANALYZE: Interpretando Planos de Execu\u00e7\u00e3o<\/h3>\n<p>O comando <strong>EXPLAIN<\/strong> no PostgreSQL oferece v\u00e1rias op\u00e7\u00f5es que controlam o n\u00edvel de detalhe exibido. As op\u00e7\u00f5es mais utilizadas incluem <strong>ANALYZE<\/strong> (executa a consulta e coleta m\u00e9tricas reais), <strong>BUFFERS<\/strong> (mostra o n\u00famero de blocos lidos do cache e do disco), <strong>VERBOSE<\/strong> (exibe informa\u00e7\u00f5es adicionais sobre colunas e express\u00f5es), <strong>FORMAT JSON<\/strong> (gera sa\u00edda estruturada em JSON) e <strong>SETTINGS<\/strong> (inclui par\u00e2metros de configura\u00e7\u00e3o relevantes). Para diagn\u00f3stico de <strong>performance<\/strong>, a combina\u00e7\u00e3o <strong>EXPLAIN (ANALYZE, BUFFERS)<\/strong> \u00e9 a mais poderosa, pois revela n\u00e3o apenas o tempo e o custo, mas tamb\u00e9m o volume de I\/O realizado.<\/p>\n<p>Considere a seguinte consulta simples que busca todos os pedidos de um cliente espec\u00edfico. Sem um \u00edndice adequado na coluna <strong>id_cliente<\/strong>, o planejador seria for\u00e7ado a fazer uma varredura sequencial na tabela <strong>pedidos<\/strong>, o que seria extremamente lento. Como criamos o \u00edndice <strong>idx_pedidos_id_cliente<\/strong>, esperamos que o plano utilize um <strong>Index Scan<\/strong> ou <strong>Bitmap Index Scan<\/strong>. Execute a consulta abaixo com <strong>EXPLAIN ANALYZE<\/strong> e analise a sa\u00edda.<\/p>\n<pre><code>-- Plano de execu\u00e7\u00e3o para pedidos de um cliente espec\u00edfico\nEXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)\nSELECT id_pedido, valor_total, status, data_pedido\nFROM pedidos\nWHERE id_cliente = 12345;\n<\/code><\/pre>\n<p>A sa\u00edda esperada deve ser semelhante ao bloco abaixo, embora os valores de tempo e buffers possam variar de acordo com o hardware e a vers\u00e3o do PostgreSQL. O importante \u00e9 observar a estrutura do plano e as m\u00e9tricas reais. A presen\u00e7a de <strong>Index Scan using idx_pedidos_id_cliente<\/strong> indica que o \u00edndice foi utilizado corretamente, e o campo <strong>Buffers: shared hit=&#8230;<\/strong> mostra que os blocos de dados foram lidos do cache compartilhado (mem\u00f3ria), sem necessidade de acesso a disco. Se aparecer <strong>read=&#8230;<\/strong>, significa que parte dos dados veio do sistema de arquivos, o que \u00e9 esperado na primeira execu\u00e7\u00e3o ap\u00f3s um rein\u00edcio ou quando a tabela n\u00e3o est\u00e1 em cache.<\/p>\n<pre><code class=\"output\">                                                     QUERY PLAN\n---------------------------------------------------------------------------------------------------------------------\n Index Scan using idx_pedidos_id_cliente on pedidos  (cost=0.43..89.35 rows=50 width=28) (actual time=0.012..0.045 rows=5 loops=1)\n   Index Cond: (id_cliente = 12345)\n   Buffers: shared hit=7\n Planning Time: 0.087 ms\n Execution Time: 0.062 ms\n(4 linhas)\n<\/code><\/pre>\n<p>Interpretar esse plano \u00e9 fundamental. O n\u00f3 raiz \u00e9 <strong>Index Scan using idx_pedidos_id_cliente on pedidos<\/strong>, indicando que o PostgreSQL percorreu o \u00edndice <strong>idx_pedidos_id_cliente<\/strong> para localizar as linhas correspondentes ao <strong>id_cliente = 12345<\/strong>. O custo estimado \u00e9 apresentado em duas partes: <strong>cost=0.43..89.35<\/strong> \u2014 o primeiro valor representa o custo de inicializa\u00e7\u00e3o do n\u00f3 (por exemplo, o custo para descer na \u00e1rvore do \u00edndice), e o segundo valor \u00e9 o custo total estimado para retornar todas as linhas. O n\u00famero <strong>rows=50<\/strong> \u00e9 a estimativa de linhas retornadas, enquanto <strong>actual &#8230; rows=5<\/strong> mostra que apenas 5 linhas foram realmente encontradas. Essa discrep\u00e2ncia entre estimativa e realidade \u00e9 normal quando as estat\u00edsticas n\u00e3o s\u00e3o perfeitamente precisas ou quando a distribui\u00e7\u00e3o dos dados \u00e9 enviesada.<\/p>\n<p>Agora, vamos for\u00e7ar uma varredura sequencial para comparar a <strong>performance<\/strong> e entender o impacto de um plano ruim. Execute a consulta abaixo desabilitando temporariamente o uso de \u00edndices com o par\u00e2metro <strong>enable_indexscan = off<\/strong>. Isso far\u00e1 com que o planejador escolha um <strong>Seq Scan<\/strong> na tabela <strong>pedidos<\/strong>, que possui 5 milh\u00f5es de linhas. O tempo de execu\u00e7\u00e3o ser\u00e1 ordens de magnitude maior, demonstrando por que a escolha correta do plano \u00e9 vital.<\/p>\n<pre><code>-- For\u00e7ar varredura sequencial para demonstrar a diferen\u00e7a de performance\nSET enable_indexscan = off;\nSET enable_bitmapscan = off;\n\nEXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)\nSELECT id_pedido, valor_total, status, data_pedido\nFROM pedidos\nWHERE id_cliente = 12345;\n\n-- Reabilitar os \u00edndices\nRESET enable_indexscan;\nRESET enable_bitmapscan;\n<\/code><\/pre>\n<p>A sa\u00edda esperada mostrar\u00e1 um n\u00f3 <strong>Seq Scan on pedidos<\/strong>, com tempo de execu\u00e7\u00e3o muito maior e muitos buffers lidos. Em nossos testes, a consulta com \u00edndice levou menos de 0,1 ms, enquanto a varredura sequencial levou cerca de 50 a 100 ms \u2014 uma diferen\u00e7a de mais de 1000 vezes. Esse exemplo simples ilustra o poder de um plano bem otimizado e a import\u00e2ncia de manter \u00edndices adequados.<\/p>\n<pre><code class=\"output\">                                                     QUERY PLAN\n---------------------------------------------------------------------------------------------------------------------\n Seq Scan on pedidos  (cost=0.00..105000.00 rows=50 width=28) (actual time=0.015..72.430 rows=5 loops=1)\n   Filter: (id_cliente = 12345)\n   Rows Removed by Filter: 4999995\n   Buffers: shared hit=20833 read=198877\n Planning Time: 0.054 ms\n Execution Time: 72.448 ms\n(5 linhas)\n<\/code><\/pre>\n<p>Al\u00e9m de consultas pontuais, \u00e9 comum enfrentar jun\u00e7\u00f5es entre tabelas grandes. Considere uma consulta que retorna os nomes dos clientes e o total de pedidos pagos em uma determinada cidade. Sem \u00edndices adequados, o planejador pode optar por <strong>Hash Join<\/strong> ou <strong>Merge Join<\/strong>, cada um com caracter\u00edsticas diferentes. Execute a consulta abaixo com <strong>EXPLAIN ANALYZE<\/strong> para observar qual algoritmo de jun\u00e7\u00e3o \u00e9 escolhido e por qu\u00ea.<\/p>\n<pre><code>-- Consulta com jun\u00e7\u00e3o entre clientes e pedidos, com filtro por cidade\nEXPLAIN (ANALYZE, BUFFERS)\nSELECT c.nome, COUNT(p.id_pedido) AS total_pedidos, SUM(p.valor_total) AS total_gasto\nFROM clientes c\nJOIN pedidos p ON p.id_cliente = c.id_cliente\nWHERE c.cidade = 'S\u00e3o Paulo'\n  AND p.status = 'PAGO'\nGROUP BY c.nome;\n<\/code><\/pre>\n<p>A sa\u00edda exibir\u00e1 um plano com n\u00f3s como <strong>Hash Join<\/strong> (ou <strong>Nested Loop<\/strong>, dependendo da seletividade estimada), possivelmente precedido por um <strong>Index Scan<\/strong> na tabela <strong>clientes<\/strong> usando o \u00edndice <strong>idx_clientes_cidade<\/strong> e um <strong>Bitmap Index Scan<\/strong> na tabela <strong>pedidos<\/strong> usando o \u00edndice <strong>idx_pedidos_status<\/strong>. A an\u00e1lise detalhada desse plano revelar\u00e1 onde est\u00e3o os custos mais altos e se a estrat\u00e9gia de jun\u00e7\u00e3o \u00e9 adequada. Em nossos treinamentos na <strong>JRT Technology Solutions<\/strong>, enfatizamos que saber ler esses planos \u00e9 a habilidade mais valiosa para qualquer DBA que busca excel\u00eancia em <strong>performance<\/strong>.<\/p>\n<p>Nos pr\u00f3ximos t\u00f3picos, voc\u00ea aprender\u00e1 a agir sobre os gargalos identificados pelo <strong>EXPLAIN ANALYZE<\/strong>, seja criando \u00edndices, reescrevendo consultas ou ajustando par\u00e2metros do servidor. Antes, por\u00e9m, \u00e9 crucial entender o papel do <strong>autovacuum<\/strong> na manuten\u00e7\u00e3o da sa\u00fade do banco e na precis\u00e3o das estat\u00edsticas.<\/p>\n<h3>Autovacuum: O Cora\u00e7\u00e3o da Manuten\u00e7\u00e3o Autom\u00e1tica e da Performance<\/h3>\n<p>O <strong>autovacuum<\/strong> \u00e9 um conjunto de processos de manuten\u00e7\u00e3o autom\u00e1tica executados pelo PostgreSQL para realizar duas tarefas essenciais: limpar linhas mortas (<em>dead tuples<\/em>) resultantes do MVCC e atualizar as estat\u00edsticas do planejador (por meio do <strong>ANALYZE<\/strong> autom\u00e1tico). Sem um <strong>autovacuum<\/strong> configurado corretamente, as tabelas podem sofrer <em>bloat<\/em> severo, levando a consultas cada vez mais lentas e uso excessivo de disco. Al\u00e9m disso, estat\u00edsticas desatualizadas fazem o planejador escolher planos ineficientes, criando um ciclo vicioso de degrada\u00e7\u00e3o.<\/p>\n<p>O comportamento do <strong>autovacuum<\/strong> \u00e9 controlado por uma s\u00e9rie de par\u00e2metros no arquivo <strong>postgresql.conf<\/strong>. Os mais importantes incluem <strong>autovacuum<\/strong> (habilita ou desabilita o processo), <strong>autovacuum_vacuum_threshold<\/strong> e <strong>autovacuum_vacuum_scale_factor<\/strong> (definem quando uma tabela \u00e9 varrida), <strong>autovacuum_analyze_threshold<\/strong> e <strong>autovacuum_analyze_scale_factor<\/strong> (definem quando as estat\u00edsticas s\u00e3o atualizadas), <strong>autovacuum_max_workers<\/strong> (n\u00famero m\u00e1ximo de workers simult\u00e2neos), <strong>autovacuum_naptime<\/strong> (intervalo entre varreduras do sistema) e <strong>autovacuum_vacuum_cost_delay<\/strong> e <strong>autovacuum_vacuum_cost_limit<\/strong> (controle de throttling para n\u00e3o sobrecarregar o servidor).<\/p>\n<p>\u00c9 comum encontrar inst\u00e2ncias com o <strong>autovacuum<\/strong> desabilitado ou com par\u00e2metros padr\u00e3o inadequados para o volume de dados. Em nossa consultoria na <strong>JRT Technology Solutions<\/strong>, j\u00e1 diagnosticamos bancos com <em>bloat<\/em> superior a 300% simplesmente porque o <strong>autovacuum<\/strong> estava desativado. Para verificar o estado atual do <strong>autovacuum<\/strong> em sua inst\u00e2ncia, execute o comando abaixo, que consulta a vis\u00e3o <strong>pg_stat_user_tables<\/strong> e mostra o n\u00famero de opera\u00e7\u00f5es de <strong>vacuum<\/strong> e <strong>analyze<\/strong> j\u00e1 realizadas, al\u00e9m da contagem de tuplas vivas e mortas.<\/p>\n<pre><code>-- Monitorar o autovacuum e a sa\u00fade das tabelas\nSELECT\n    schemaname || '.' || relname AS tabela,\n    n_live_tup AS tuplas_vivas,\n    n_dead_tup AS tuplas_mortas,\n    last_vacuum AS ultimo_vacuum,\n    last_autovacuum AS ultimo_autovacuum,\n    last_analyze AS ultimo_analyze,\n    last_autoanalyze AS ultimo_autoanalyze\nFROM pg_stat_user_tables\nORDER BY n_dead_tup DESC\nLIMIT 10;\n<\/code><\/pre>\n<p>A sa\u00edda esperada mostrar\u00e1 uma lista de tabelas com o n\u00famero de tuplas vivas e mortas, bem como os momentos da \u00faltima execu\u00e7\u00e3o manual e autom\u00e1tica de <strong>VACUUM<\/strong> e <strong>ANALYZE<\/strong>. Se a coluna <strong>n_dead_tup<\/strong> for muito alta e o <strong>last_autovacuum<\/strong> estiver nulo ou antigo, \u00e9 um sinal claro de que o <strong>autovacuum<\/strong> n\u00e3o est\u00e1 conseguindo acompanhar a carga de atualiza\u00e7\u00f5es e exclus\u00f5es. Nesse caso, ser\u00e1 necess\u00e1rio ajustar os par\u00e2metros de configura\u00e7\u00e3o, como veremos adiante.<\/p>\n<pre><code class=\"output\">          tabela          | tuplas_vivas | tuplas_mortas |        ultimo_vacuum        |      ultimo_autovacuum      |        ultimo_analyze       |      ultimo_autoanalyze\n--------------------------+--------------+---------------+-----------------------------+-----------------------------+-----------------------------+-----------------------------\n public.pedidos           |      5000000 |         12345 |                             | 2026-09-11 10:15:32.123456  | 2026-09-11 09:30:00.654321  | 2026-09-11 10:20:11.987654\n public.clientes          |       999999 |           800 |                             | 2026-09-11 10:15:32.123457  | 2026-09-11 09:30:00.654322  | 2026-09-11 10:20:11.987655\n(2 linhas)\n<\/code><\/pre>\n<p>Al\u00e9m da vis\u00e3o <strong>pg_stat_user_tables<\/strong>, voc\u00ea pode consultar a atividade atual do <strong>autovacuum<\/strong> por meio da vis\u00e3o <strong>pg_stat_activity<\/strong>, filtrando pelos processos de manuten\u00e7\u00e3o. O comando abaixo mostra todos os workers de <strong>autovacuum<\/strong> em execu\u00e7\u00e3o no momento, incluindo o nome da tabela, o estado e o tempo de execu\u00e7\u00e3o. Essa consulta \u00e9 \u00fatil para identificar se o <strong>autovacuum<\/strong> est\u00e1 ativo e se h\u00e1 gargalos de I\/O causados por m\u00faltiplas varreduras simult\u00e2neas.<\/p>\n<pre><code>-- Verificar processos de autovacuum em execu\u00e7\u00e3o\nSELECT\n    pid,\n    datname AS banco,\n    usename AS usuario,\n    state AS estado,\n    query AS consulta,\n    now() - xact_start AS duracao\nFROM pg_stat_activity\nWHERE backend_type = 'autovacuum worker';\n<\/code><\/pre>\n<p>A interpreta\u00e7\u00e3o correta do <strong>autovacuum<\/strong> exige monitoramento cont\u00ednuo. Em ambientes de alta transa\u00e7\u00e3o, \u00e9 recomend\u00e1vel habilitar o registro de logs do <strong>autovacuum<\/strong> no <strong>postgresql.conf<\/strong> para acompanhar suas decis\u00f5es. Par\u00e2metros como <strong>log_autovacuum_min_duration<\/strong> permitem registrar apenas opera\u00e7\u00f5es que excedem um determinado tempo, ajudando a identificar varreduras longas que possam estar competindo por recursos. Na pr\u00f3xima se\u00e7\u00e3o, voc\u00ea aplicar\u00e1 todos os ajustes necess\u00e1rios no <strong>postgresql.conf<\/strong> para otimizar tanto o <strong>autovacuum<\/strong> quanto a <strong>performance<\/strong> geral do servidor.<\/p>\n<h3>Tuning do postgresql.conf: Par\u00e2metros Cr\u00edticos para Alta Performance<\/h3>\n<p>O arquivo <strong>postgresql.conf<\/strong> \u00e9 o principal ponto de configura\u00e7\u00e3o do PostgreSQL. Ajustar corretamente seus par\u00e2metros \u00e9 uma das formas mais impactantes de melhorar a <strong>performance<\/strong> do banco de dados. Nesta se\u00e7\u00e3o, voc\u00ea ver\u00e1 um exemplo completo de arquivo de configura\u00e7\u00e3o otimizado para um servidor com 16 GB de RAM, 4 vCPUs e armazenamento SSD. Os valores podem e devem ser adaptados ao seu ambiente, mas os princ\u00edpios por tr\u00e1s de cada ajuste s\u00e3o universais.<\/p>\n<p>Antes de editar o arquivo, fa\u00e7a um backup da configura\u00e7\u00e3o atual. No Ubuntu\/Debian, o arquivo normalmente est\u00e1 em <strong>\/etc\/postgresql\/15\/main\/postgresql.conf<\/strong> (ajuste a vers\u00e3o), enquanto no CentOS\/RHEL\/Rocky est\u00e1 em <strong>\/var\/lib\/pgsql\/15\/data\/postgresql.conf<\/strong>. Voc\u00ea pode localizar o arquivo com o comando <strong>SHOW config_file;<\/strong> dentro do <strong>psql<\/strong>. Execute os comandos abaixo para fazer o backup, substituindo o caminho conforme sua distribui\u00e7\u00e3o.<\/p>\n<pre><code>-- No shell do sistema operacional (Ubuntu\/Debian)\nsudo cp \/etc\/postgresql\/15\/main\/postgresql.conf \/etc\/postgresql\/15\/main\/postgresql.conf.backup\n\n-- No shell do sistema operacional (CentOS\/RHEL\/Rocky)\nsudo cp \/var\/lib\/pgsql\/15\/data\/postgresql.conf \/var\/lib\/pgsql\/15\/data\/postgresql.conf.backup\n\n-- Verificar a localiza\u00e7\u00e3o exata do arquivo de configura\u00e7\u00e3o\nsudo -u postgres psql -c \"SHOW config_file;\"\n<\/code><\/pre>\n<p>A sa\u00edda do comando <strong>SHOW config_file;<\/strong> indicar\u00e1 o caminho exato do arquivo. Em uma instala\u00e7\u00e3o t\u00edpica do Ubuntu, o caminho ser\u00e1 <strong>\/etc\/postgresql\/15\/main\/postgresql.conf<\/strong>; no CentOS\/RHEL\/Rocky, ser\u00e1 <strong>\/var\/lib\/pgsql\/15\/data\/postgresql.conf<\/strong>. Anote esse caminho, pois ele ser\u00e1 usado nos pr\u00f3ximos passos.<\/p>\n<pre><code class=\"output\">               config_file\n-----------------------------------------\n \/etc\/postgresql\/15\/main\/postgresql.conf\n(1 linha)\n<\/code><\/pre>\n<p>Agora, apresentamos o conte\u00fado completo de um arquivo <strong>postgresql.conf<\/strong> otimizado para alta <strong>performance<\/strong>. Todos os par\u00e2metros est\u00e3o comentados com explica\u00e7\u00f5es detalhadas. Este arquivo \u00e9 funcional e pode ser usado como base, mas lembre-se de adequar os valores \u00e0 sua realidade de hardware e carga de trabalho. O arquivo abaixo foi validado em ambientes de produ\u00e7\u00e3o pela equipe da <strong>JRT Technology Solutions<\/strong> e segue as melhores pr\u00e1ticas do PostgreSQL 15\/16.<\/p>\n<pre><code>#------------------------------------------------------------------------------\n# CONFIGURA\u00c7\u00c3O OTIMIZADA PARA ALTA PERFORMANCE - PostgreSQL 15\/16\n# Servidor de refer\u00eancia: 16 GB RAM, 4 vCPUs, armazenamento SSD\n# Adapte os valores conforme seu ambiente\n#------------------------------------------------------------------------------\n\n# --- CONEX\u00d5ES E AUTENTICA\u00c7\u00c3O ---\nlisten_addresses = 'localhost, IP_DO_SERVIDOR'   # Interfaces de escuta\nport = 5432                                        # Porta padr\u00e3o\nmax_connections = 200                              # Conex\u00f5es simult\u00e2neas m\u00e1ximas\nsuperuser_reserved_connections = 5                # Conex\u00f5es reservadas para superusu\u00e1rio\n\n# --- RECURSOS DE MEM\u00d3RIA ---\n# Regra pr\u00e1tica: shared_buffers entre 15% e 25% da RAM total\nshared_buffers = 4GB                               # Cache compartilhado de p\u00e1ginas (25% de 16 GB)\n# effective_cache_size deve representar a mem\u00f3ria total dispon\u00edvel para cache de SO + shared_buffers\neffective_cache_size = 12GB                        # Estimativa de cache total (SO + PostgreSQL) para o planejador\nwork_mem = 64MB                                    # Mem\u00f3ria para opera\u00e7\u00f5es de ordena\u00e7\u00e3o e hash por n\u00f3 de execu\u00e7\u00e3o\nmaintenance_work_mem = 1GB                         # Mem\u00f3ria para manuten\u00e7\u00e3o (VACUUM, CREATE INDEX, etc.)\nhuge_pages = try                                   # Tentar usar huge pages do SO (requer configura\u00e7\u00e3o no SO)\ntemp_buffers = 32MB                                # Mem\u00f3ria para tabelas tempor\u00e1rias por sess\u00e3o\n\n# --- CUSTOS E PLANEJADOR ---\n# Em SSDs, random_page_cost deve ser reduzido para refletir baixa lat\u00eancia de acesso aleat\u00f3rio\nrandom_page_cost = 1.1                             # Custo de acesso aleat\u00f3rio a disco (SSD)\nseq_page_cost = 1.0                                # Custo de acesso sequencial\ncpu_tuple_cost = 0.03                              # Custo de processamento por tupla\ncpu_index_tuple_cost = 0.005                       # Custo de processamento por tupla de \u00edndice\ncpu_operator_cost = 0.0025                         # Custo de processamento por operador\neffective_io_concurrency = 200                     # N\u00famero de opera\u00e7\u00f5es de I\/O simult\u00e2neas (SSD NVMe)\ndefault_statistics_target = 200                    # N\u00edvel de detalhe das estat\u00edsticas coletadas\n# Evita que o planejador subestime a seletividade de colunas correlacionadas\n# (estat\u00edsticas estendidas podem ser criadas com CREATE STATISTICS)\n\n# --- WRITE AHEAD LOG (WAL) ---\nwal_level = replica                                # Necess\u00e1rio para replica\u00e7\u00e3o; 'minimal' reduz volume de WAL\nfsync = on                                         # Garantir durabilidade das transa\u00e7\u00f5es\nsynchronous_commit = off                           # Para m\u00e1xima performance (pode perder \u00faltimas transa\u00e7\u00f5es em crash)\nfull_page_writes = on                              # Prote\u00e7\u00e3o contra corrup\u00e7\u00e3o em caso de falha\nwal_buffers = 16MB                                 # Buffer para escrita de WAL (recomendado 1\/32 de shared_buffers)\ncheckpoint_timeout = 15min                         # Intervalo m\u00e1ximo entre checkpoints\nmax_wal_size = 8GB                                 # Tamanho m\u00e1ximo do WAL entre checkpoints\nmin_wal_size = 2GB                                 # Tamanho m\u00ednimo do WAL para reciclagem\ncheckpoint_completion_target = 0.9                 # Suavizar a escrita do checkpoint (90% do intervalo)\nwal_compression = on                               # Comprimir p\u00e1ginas completas no WAL (reduz I\/O)\n\n# --- AUTOVACUUM ---\nautovacuum = on                                    # Habilita a manuten\u00e7\u00e3o autom\u00e1tica\nautovacuum_max_workers = 4                         # N\u00famero de workers simult\u00e2neos para vacuum\/analyze\nautovacuum_naptime = 10s                           # Intervalo entre varreduras das tabelas\nautovacuum_vacuum_threshold = 50                   # N\u00famero m\u00ednimo de tuplas mortas para disparar vacuum\nautovacuum_vacuum_scale_factor = 0.01              # Fra\u00e7\u00e3o de tuplas mortas (1%) para disparar vacuum\nautovacuum_analyze_threshold = 50                  # N\u00famero m\u00ednimo de tuplas modificadas para disparar analyze\nautovacuum_analyze_scale_factor = 0.005            # Fra\u00e7\u00e3o de tuplas modificadas (0.5%) para disparar analyze\nautovacuum_vacuum_cost_delay = 2ms                 # Delay entre opera\u00e7\u00f5es para n\u00e3o sobrecarregar o servidor\nautovacuum_vacuum_cost_limit = 2000                # Custo m\u00e1ximo de I\/O antes de dormir\nlog_autovacuum_min_duration = 1000ms               # Registrar autovacuum com dura\u00e7\u00e3o > 1s\n\n# --- LOGGING E MONITORAMENTO ---\nlog_destination = 'stderr'                         # Enviar logs para stderr\nlogging_collector = on                             # Coletar logs em arquivos\nlog_directory = 'log'                              # Diret\u00f3rio de logs (relativo ao data_directory)\nlog_filename = 'postgresql-%a.log'                 # Rota\u00e7\u00e3o por dia da semana\nlog_truncate_on_rotation = on                      # Truncar arquivo na rota\u00e7\u00e3o\nlog_rotation_age = 1d                              # Rotacionar diariamente\nlog_min_duration_statement = 1000                  # Registrar consultas com dura\u00e7\u00e3o > 1s\nlog_checkpoints = on                               # Registrar ocorr\u00eancia de checkpoints\nlog_connections = on                               # Registrar tentativas de conex\u00e3o\nlog_disconnections = on                            # Registrar desconex\u00f5es\nlog_lock_waits = on                                # Registrar esperas por locks\nlog_temp_files = 64MB                              # Registrar arquivos tempor\u00e1rios maiores que 64 MB\nlog_timezone = 'America\/Sao_Paulo'                 # Fuso hor\u00e1rio dos logs\n\n# --- OUTROS PAR\u00c2METROS RELEVANTES ---\ntimezone = 'America\/Sao_Paulo'                     # Fuso hor\u00e1rio da sess\u00e3o\nlc_messages = 'pt_BR.UTF-8'                        # Idioma das mensagens\nlc_monetary = 'pt_BR.UTF-8'                        # Formato monet\u00e1rio\nlc_numeric = 'pt_BR.UTF-8'                         # Formato num\u00e9rico\nlc_time = 'pt_BR.UTF-8'                            # Formato de data\/hora\ndefault_text_search_config = 'pg_catalog.portuguese' # Busca textual em portugu\u00eas\n<\/code><\/pre>\n<p>Este arquivo de configura\u00e7\u00e3o \u00e9 um ponto de partida s\u00f3lido para a maioria dos servidores de aplica\u00e7\u00e3o. Cada bloco foi comentado com o objetivo de educar e orientar. No entanto, \u00e9 importante compreender que o <em>tuning<\/em> de <strong>performance<\/strong> n\u00e3o \u00e9 uma ci\u00eancia exata: voc\u00ea deve medir o impacto de cada altera\u00e7\u00e3o usando ferramentas como <strong>pgbench<\/strong>, <strong>EXPLAIN ANALYZE<\/strong> e monitoramento do sistema. Em implanta\u00e7\u00f5es na <strong>JRT Technology Solutions<\/strong>, sempre realizamos testes de carga antes e depois de cada mudan\u00e7a para garantir que os ganhos sejam reais e n\u00e3o meramente te\u00f3ricos.<\/p>\n<p>Ap\u00f3s editar o arquivo, \u00e9 necess\u00e1rio reiniciar o servi\u00e7o do PostgreSQL para que as novas configura\u00e7\u00f5es entrem em vigor. Os comandos variam conforme a distribui\u00e7\u00e3o:<\/p>\n<pre><code>-- No Ubuntu\/Debian (usando systemd)\nsudo systemctl restart postgresql\n\n-- No CentOS\/RHEL\/Rocky (usando systemd)\nsudo systemctl restart postgresql-15\n<\/code><\/pre>\n<p>Voc\u00ea pode verificar se o servi\u00e7o foi reiniciado com sucesso e se as configura\u00e7\u00f5es foram aplicadas consultando alguns par\u00e2metros diret<\/p>\n<div style=\"margin:52px 0 40px;padding:36px 28px;background:linear-gradient(135deg,#0f172a 0%,#1a2744 100%);border:2px solid #25D366;border-radius:18px;text-align:center;box-shadow:0 4px 28px rgba(37,211,102,0.18)\">\n<p style=\"margin:0 0 10px;font-size:18px;color:#ffffff;font-weight:700;line-height:1.4\">Quer aprender na pr\u00e1tica com especialistas?<\/p>\n<p style=\"margin:0 0 28px;font-size:15px;color:#94a3b8;font-weight:400;line-height:1.6\">A JRT Technology Solutions oferece treinamentos e implementa\u00e7\u00e3o de PostgreSQL para equipes corporativas.<\/p>\n<p>  <a href=\"https:\/\/api.whatsapp.com\/send\/?phone=5521980606699&#038;text=Ol%C3%A1!%20Tenho%20interesse%20no%20treinamento%20de%20PostgreSQL.&#038;type=phone_number&#038;app_absent=0\"\n     target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-flex;align-items:center;gap:12px;background:#25D366;color:#ffffff;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',sans-serif;font-size:16px;font-weight:700;padding:15px 32px;border-radius:100px;text-decoration:none;box-shadow:0 4px 16px rgba(37,211,102,0.45);letter-spacing:0.01em\"><br \/>\n    <svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"22\" height=\"22\" viewBox=\"0 0 24 24\" fill=\"#ffffff\"><path d=\"M17.472 14.382c-.297-.149-1.758-.867-2.03-.967-.273-.099-.471-.148-.67.15-.197.297-.767.966-.94 1.164-.173.199-.347.223-.644.075-.297-.15-1.255-.463-2.39-1.475-.883-.788-1.48-1.761-1.653-2.059-.173-.297-.018-.458.13-.606.134-.133.298-.347.446-.52.149-.174.198-.298.298-.497.099-.198.05-.371-.025-.52-.075-.149-.669-1.612-.916-2.207-.242-.579-.487-.5-.669-.51-.173-.008-.371-.01-.57-.01-.198 0-.52.074-.792.372-.272.297-1.04 1.016-1.04 2.479 0 1.462 1.065 2.875 1.213 3.074.149.198 2.096 3.2 5.077 4.487.709.306 1.262.489 1.694.625.712.227 1.36.195 1.871.118.571-.085 1.758-.719 2.006-1.413.248-.694.248-1.289.173-1.413-.074-.124-.272-.198-.57-.347m-5.421 7.403h-.004a9.87 9.87 0 01-5.031-1.378l-.361-.214-3.741.982.998-3.648-.235-.374a9.86 9.86 0 01-1.51-5.26c.001-5.45 4.436-9.884 9.888-9.884 2.64 0 5.122 1.03 6.988 2.898a9.825 9.825 0 012.893 6.994c-.003 5.45-4.437 9.884-9.885 9.884m8.413-18.297A11.815 11.815 0 0012.05 0C5.495 0 .16 5.335.157 11.892c0 2.096.547 4.142 1.588 5.945L.057 24l6.305-1.654a11.882 11.882 0 005.683 1.448h.005c6.554 0 11.89-5.335 11.893-11.893a11.821 11.821 0 00-3.48-8.413z\"\/><\/svg><br \/>\n    Falar no WhatsApp<br \/>\n  <\/a>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de &#8220;apertar bot\u00f5es&#8221;; trata-se de &#8230; <a title=\"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\" class=\"read-more\" href=\"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/\" aria-label=\"Read more about Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\">Ler mais<\/a><\/p>\n","protected":false},"author":1,"featured_media":2824,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"iawp_total_views":0,"footnotes":""},"categories":[75],"tags":[3447],"class_list":["post-2825","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-postgresql-do-zero-ao-avancado-performance-explain-analyze-autovacuum-e-tuning-do-postgresql-conf"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de &quot;apertar bot\u00f5es&quot;; trata-se de\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Thiago Paes Rodrigues\"\/>\n\t<meta name=\"google-site-verification\" content=\"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg\" \/>\n\t<link rel=\"canonical\" href=\"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_BR\" \/>\n\t\t<meta property=\"og:site_name\" content=\"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta property=\"og:description\" content=\"Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de &quot;apertar bot\u00f5es&quot;; trata-se de\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"100\" \/>\n\t\t<meta property=\"og:image:height\" content=\"75\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2026-09-11T20:50:05+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2026-09-11T20:50:05+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/profile.php?id=61590814880509\" \/>\n\t\t<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n\t\t<meta name=\"twitter:title\" content=\"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions\" \/>\n\t\t<meta name=\"twitter:description\" content=\"Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de &quot;apertar bot\u00f5es&quot;; trata-se de\" \/>\n\t\t<meta name=\"twitter:image\" content=\"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg\" \/>\n\t\t<script type=\"application\/ld+json\" class=\"aioseo-schema\">\n\t\t\t{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"BlogPosting\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#blogposting\",\"name\":\"Aula 23: Performance \\u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions\",\"headline\":\"Aula 23: Performance \\u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\",\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ai-image-1789159798370.jpg\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 23: Performance \\u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\"},\"datePublished\":\"2026-09-11T17:50:05-03:00\",\"dateModified\":\"2026-09-11T17:50:05-03:00\",\"inLanguage\":\"pt-BR\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#webpage\"},\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#webpage\"},\"articleSection\":\"DevOps, PostgreSQL \\u2014 Do Zero ao Avan\\u00e7ado: Performance \\u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#breadcrumblist\",\"itemListElement\":[{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"position\":2,\"name\":\"DevOps\",\"item\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/\",\"nextItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#listItem\",\"name\":\"Aula 23: Performance \\u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\"},\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog#listItem\",\"name\":\"Home\"}},{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#listItem\",\"position\":3,\"name\":\"Aula 23: Performance \\u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\",\"previousItem\":{\"@type\":\"ListItem\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/category\\\/devops\\\/#listItem\",\"name\":\"DevOps\"}}]},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"telephone\":\"+552138277513\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/03\\\/cropped-logo-mini.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#organizationLogo\",\"width\":100,\"height\":75},\"image\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#organizationLogo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/profile.php?id=61590814880509\",\"https:\\\/\\\/www.instagram.com\\\/jrtx.tech\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/\",\"name\":\"Thiago Paes Rodrigues\",\"image\":{\"@type\":\"ImageObject\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#authorImage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/cropped-foto-rascunho3-96x96.jpeg\",\"width\":96,\"height\":96,\"caption\":\"Thiago Paes Rodrigues\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#webpage\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/\",\"name\":\"Aula 23: Performance \\u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions\",\"description\":\"Bem-vindo \\u00e0 vig\\u00e9sima terceira aula do nosso curso PostgreSQL \\u2014 Do Zero ao Avan\\u00e7ado. Nesta etapa, voc\\u00ea vai mergulhar em um dos temas mais cr\\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\\u00e3o \\u00e9 apenas uma tarefa de \\\"apertar bot\\u00f5es\\\"; trata-se de\",\"inLanguage\":\"pt-BR\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#breadcrumblist\"},\"author\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"creator\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/author\\\/thiago\\\/#author\"},\"image\":{\"@type\":\"ImageObject\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/09\\\/ai-image-1789159798370.jpg\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#mainImage\",\"width\":1440,\"height\":1024,\"caption\":\"Aula 23: Performance \\u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/2026\\\/09\\\/11\\\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\\\/#mainImage\"},\"datePublished\":\"2026-09-11T17:50:05-03:00\",\"dateModified\":\"2026-09-11T17:50:05-03:00\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/\",\"name\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"alternateName\":\"JRT Technology Solutions | Tecnologia e Inova\\u00e7\\u00e3o para Empresas\",\"description\":\"Um espa\\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\\u00e1tica e atual. Aqui voc\\u00ea encontra novidades, an\\u00e1lises, tutoriais e reflex\\u00f5es sobre inova\\u00e7\\u00e3o, intelig\\u00eancia artificial, gadgets, programa\\u00e7\\u00e3o e tend\\u00eancias digitais. Nosso objetivo \\u00e9 simplificar o complexo, ajudar voc\\u00ea a se manter atualizado e transformar conhecimento em pr\\u00e1tica no seu dia a dia.\",\"inLanguage\":\"pt-BR\",\"publisher\":{\"@id\":\"https:\\\/\\\/jrtx.com.br\\\/blog\\\/#organization\"}}]}\n\t\t<\/script>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions","description":"Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de \"apertar bot\u00f5es\"; trata-se de","canonical_url":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/","robots":"max-image-preview:large","keywords":"","webmasterTools":{"google-site-verification":"QKPfpDCzHmzKyfFk5j1KZW3HhROYTPeqwBN5qcJ8qcg","miscellaneous":""},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"BlogPosting","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#blogposting","name":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions","headline":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf","author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/ai-image-1789159798370.jpg","width":1440,"height":1024,"caption":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf"},"datePublished":"2026-09-11T17:50:05-03:00","dateModified":"2026-09-11T17:50:05-03:00","inLanguage":"pt-BR","mainEntityOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#webpage"},"isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#webpage"},"articleSection":"DevOps, PostgreSQL \u2014 Do Zero ao Avan\u00e7ado: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf"},{"@type":"BreadcrumbList","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#breadcrumblist","itemListElement":[{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","position":1,"name":"Home","item":"https:\/\/jrtx.com.br\/blog","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","position":2,"name":"DevOps","item":"https:\/\/jrtx.com.br\/blog\/category\/devops\/","nextItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#listItem","name":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf"},"previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog#listItem","name":"Home"}},{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#listItem","position":3,"name":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf","previousItem":{"@type":"ListItem","@id":"https:\/\/jrtx.com.br\/blog\/category\/devops\/#listItem","name":"DevOps"}}]},{"@type":"Organization","@id":"https:\/\/jrtx.com.br\/blog\/#organization","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","url":"https:\/\/jrtx.com.br\/blog\/","telephone":"+552138277513","logo":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#organizationLogo","width":100,"height":75},"image":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#organizationLogo"},"sameAs":["https:\/\/www.facebook.com\/profile.php?id=61590814880509","https:\/\/www.instagram.com\/jrtx.tech\/"]},{"@type":"Person","@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author","url":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/","name":"Thiago Paes Rodrigues","image":{"@type":"ImageObject","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#authorImage","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/cropped-foto-rascunho3-96x96.jpeg","width":96,"height":96,"caption":"Thiago Paes Rodrigues"}},{"@type":"WebPage","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#webpage","url":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/","name":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions","description":"Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de \"apertar bot\u00f5es\"; trata-se de","inLanguage":"pt-BR","isPartOf":{"@id":"https:\/\/jrtx.com.br\/blog\/#website"},"breadcrumb":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#breadcrumblist"},"author":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"creator":{"@id":"https:\/\/jrtx.com.br\/blog\/author\/thiago\/#author"},"image":{"@type":"ImageObject","url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/09\/ai-image-1789159798370.jpg","@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#mainImage","width":1440,"height":1024,"caption":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf"},"primaryImageOfPage":{"@id":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/#mainImage"},"datePublished":"2026-09-11T17:50:05-03:00","dateModified":"2026-09-11T17:50:05-03:00"},{"@type":"WebSite","@id":"https:\/\/jrtx.com.br\/blog\/#website","url":"https:\/\/jrtx.com.br\/blog\/","name":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","alternateName":"JRT Technology Solutions | Tecnologia e Inova\u00e7\u00e3o para Empresas","description":"Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","inLanguage":"pt-BR","publisher":{"@id":"https:\/\/jrtx.com.br\/blog\/#organization"}}]},"og:locale":"pt_BR","og:site_name":"BLOG - JRT Technology Solutions - Um espa\u00e7o dedicado a explorar o universo da tecnologia de forma clara, pr\u00e1tica e atual. Aqui voc\u00ea encontra novidades, an\u00e1lises, tutoriais e reflex\u00f5es sobre inova\u00e7\u00e3o, intelig\u00eancia artificial, gadgets, programa\u00e7\u00e3o e tend\u00eancias digitais. Nosso objetivo \u00e9 simplificar o complexo, ajudar voc\u00ea a se manter atualizado e transformar conhecimento em pr\u00e1tica no seu dia a dia.","og:type":"article","og:title":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions","og:description":"Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de &quot;apertar bot\u00f5es&quot;; trata-se de","og:url":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/","og:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:secure_url":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg","og:image:width":100,"og:image:height":75,"article:published_time":"2026-09-11T20:50:05+00:00","article:modified_time":"2026-09-11T20:50:05+00:00","article:publisher":"https:\/\/www.facebook.com\/profile.php?id=61590814880509","twitter:card":"summary_large_image","twitter:title":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf - BLOG - JRT Technology Solutions","twitter:description":"Bem-vindo \u00e0 vig\u00e9sima terceira aula do nosso curso PostgreSQL \u2014 Do Zero ao Avan\u00e7ado. Nesta etapa, voc\u00ea vai mergulhar em um dos temas mais cr\u00edticos e, ao mesmo tempo, mais recompensadores para qualquer profissional de banco de dados: a performance. Otimizar o desempenho do PostgreSQL n\u00e3o \u00e9 apenas uma tarefa de &quot;apertar bot\u00f5es&quot;; trata-se de","twitter:image":"https:\/\/jrtx.com.br\/blog\/wp-content\/uploads\/2026\/03\/cropped-logo-mini.jpg"},"aioseo_meta_data":{"post_id":"2825","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_custom_url":null,"og_image_custom_fields":null,"og_image_url":null,"og_image_width":null,"og_image_height":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_image_url":null,"twitter_title":null,"twitter_description":null,"schema_type":"default","schema_type_options":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"limit_modified_date":false,"ai":null,"breadcrumb_settings":null,"seo_analyzer_scan_date":null,"created":"2026-09-11 20:51:07","updated":"2026-09-11 20:51:07","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"aioseo_breadcrumb":"<div class=\"aioseo-breadcrumbs\"><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\" title=\"Home\">Home<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\t<a href=\"https:\/\/jrtx.com.br\/blog\/category\/devops\/\" title=\"DevOps\">DevOps<\/a>\n\t\t<\/span><span class=\"aioseo-breadcrumb-separator\">&raquo;<\/span><span class=\"aioseo-breadcrumb\">\n\t\t\tAula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf\n\t\t<\/span><\/div>","aioseo_breadcrumb_json":[{"label":"Home","link":"https:\/\/jrtx.com.br\/blog"},{"label":"DevOps","link":"https:\/\/jrtx.com.br\/blog\/category\/devops\/"},{"label":"Aula 23: Performance \u2014 EXPLAIN ANALYZE, autovacuum e tuning do postgresql.conf","link":"https:\/\/jrtx.com.br\/blog\/2026\/09\/11\/aula-23-performance-explain-analyze-autovacuum-e-tuning-do-p\/"}],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/2825","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/comments?post=2825"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/2825\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/2824"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=2825"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=2825"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=2825"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}