{"id":1075,"date":"2026-06-14T18:02:52","date_gmt":"2026-06-14T21:02:52","guid":{"rendered":"https:\/\/jrtx.com.br\/blog\/2026\/06\/14\/aula-13-indices-no-postgresql-b-tree-gist-gin-brin-e-hash\/"},"modified":"2026-06-14T18:02:52","modified_gmt":"2026-06-14T21:02:52","slug":"aula-13-indices-no-postgresql-b-tree-gist-gin-brin-e-hash","status":"publish","type":"post","link":"https:\/\/jrtx.com.br\/blog\/2026\/06\/14\/aula-13-indices-no-postgresql-b-tree-gist-gin-brin-e-hash\/","title":{"rendered":"Aula 13: \u00cdndices no PostgreSQL \u2014 B-tree, GiST, GIN, BRIN e Hash"},"content":{"rendered":"<p>Nesta aula, exploraremos detalhadamente os \u00edndices no PostgreSQL, uma funcionalidade vital para otimizar consultas e garantir o desempenho eficiente dos bancos de dados. Voc\u00ea aprender\u00e1 sobre os diversos tipos de \u00edndices dispon\u00edveis como B-tree, GiST, GIN, BRIN e Hash, entendendo suas diferen\u00e7as e aplica\u00e7\u00f5es pr\u00e1ticas. Ao final desta aula, voc\u00ea estar\u00e1 apto a criar \u00edndices eficazmente, interpretar suas estruturas e resolver problemas comuns relacionados. Esta habilidade \u00e9 essencial para administradores de banco de dados, desenvolvedores e profissionais de TI que buscam maximizar a performance de suas aplica\u00e7\u00f5es. Nos projetos da JRT Technology Solutions, nossos especialistas utilizam \u00edndices diariamente para otimizar sistemas cr\u00edticos implementados para nossos clientes.<\/p>\n<h3>O que voc\u00ea vai aprender nesta aula<\/h3>\n<ul>\n<li>Conceitos fundamentais de \u00edndices no PostgreSQL<\/li>\n<li>Cria\u00e7\u00e3o e gerenciamento de \u00edndices B-tree, GiST, GIN, BRIN e Hash<\/li>\n<li>Quest\u00f5es de desempenho associadas a diferentes tipos de \u00edndices<\/li>\n<li>Testagem e verifica\u00e7\u00e3o de cria\u00e7\u00e3o e efic\u00e1cia de \u00edndices<\/li>\n<li>Resolu\u00e7\u00e3o de problemas comuns relacionados a \u00edndices<\/li>\n<\/ul>\n<h3>Pr\u00e9-requisitos e Ambiente<\/h3>\n<p>Antes de iniciar, voc\u00ea deve ter o PostgreSQL instalado e funcionando em sua m\u00e1quina. \u00c9 prefer\u00edvel que voc\u00ea j\u00e1 tenha conhecimentos b\u00e1sicos sobre comandos SQL e tenha completado as aulas anteriores deste curso. Vamos cobrir procedimentos em sistemas baseados em Ubuntu\/Debian e CentOS\/RHEL\/Rocky Linux.<\/p>\n<h3>Conceitos Fundamentais sobre \u00cdndices no PostgreSQL<\/h3>\n<p>No PostgreSQL, os \u00edndices s\u00e3o usados para aumentar a velocidade das opera\u00e7\u00f5es de recupera\u00e7\u00e3o de dados. Um \u00edndice \u00e9 uma estrutura separada que armazena um subconjunto dos dados de uma tabela, permitindo que a recupera\u00e7\u00e3o ocorra mais rapidamente em compara\u00e7\u00e3o com uma varredura sequencial atrav\u00e9s da tabela.<\/p>\n<p>Os tipos de \u00edndices no PostgreSQL incluem:<\/p>\n<ul>\n<li><strong>B-tree<\/strong>: O tipo de \u00edndice padr\u00e3o, ideal para consultas de correspond\u00eancia exata e intervalos.<\/li>\n<li><strong>GiST<\/strong>: Suporta operadores complexos e \u00e9 \u00fatil para dados geoespaciais e de pesquisa em extens\u00e3o.<\/li>\n<li><strong>GIN<\/strong>: \u00datil para pesquisa de valores que cont\u00eam conjuntos de itens, como arrays ou textos de palavras.<\/li>\n<li><strong>BRIN<\/strong>: Frugal em espa\u00e7o, ideal para grandes tabelas e permite opera\u00e7\u00f5es de varredura r\u00e1pidas dentro de intervalos.<\/li>\n<li><strong>Hash<\/strong>: Para buscas de igualdade, mas menos \u00fatil para opera\u00e7\u00f5es de intervalo e n\u00e3o suportando replica\u00e7\u00e3o de alguma forma at\u00e9 vers\u00f5es recentes.<\/li>\n<\/ul>\n<h3>Passo a Passo \u2014 Cria\u00e7\u00e3o de \u00cdndices no PostgreSQL<\/h3>\n<p>A seguir, vamos criar e gerenciar diferentes tipos de \u00edndices em suas tabelas no PostgreSQL. Este guia fornecer\u00e1 passos para cada tipo de \u00edndice mencionado acima.<\/p>\n<ol>\n<li>Conecte-se ao seu banco de dados PostgreSQL com o psql:\n<pre><code>psql -U seu_usuario -d seu_banco_de_dados<\/code><\/pre>\n<\/li>\n<li>Crie uma tabela de exemplo para ensaiar a cria\u00e7\u00e3o de \u00edndices:\n<pre><code>CREATE TABLE alunos (\n    id SERIAL PRIMARY KEY,\n    nome VARCHAR(100),\n    idade INT,\n    turma VARCHAR(10)\n);<\/code><\/pre>\n<pre><code class=\"output\">CREATE TABLE<\/code><\/pre>\n<\/li>\n<li>Adicione alguns dados de exemplo:\n<pre><code>INSERT INTO alunos (nome, idade, turma) VALUES\n('Ana', 21, 'A1'),\n('Bruno', 22, 'A2'),\n('Carlos', 23, 'A3');<\/code><\/pre>\n<pre><code class=\"output\">INSERT 0 3<\/code><\/pre>\n<\/li>\n<li>Crie um \u00edndice B-tree com base no nome dos alunos:\n<pre><code>CREATE INDEX idx_nome ON alunos(nome);<\/code><\/pre>\n<pre><code class=\"output\">CREATE INDEX<\/code><\/pre>\n<\/li>\n<li>Crie um \u00edndice GiST em um campo geom\u00e9trico hipot\u00e9tico:\n<pre><code>\nCREATE EXTENSION IF NOT EXISTS btree_gist;\nCREATE INDEX idx_gist_nome ON alunos USING gist(id);\n        <\/code><\/pre>\n<pre><code class=\"output\">CREATE INDEX<\/code><\/pre>\n<\/li>\n<li>Criar um \u00edndice GIN em um campo array:\n<pre><code>ALTER TABLE alunos ADD COLUMN disciplinas TEXT[];\nCREATE INDEX idx_gin_disciplinas ON alunos USING gin (disciplinas);<\/code><\/pre>\n<pre><code class=\"output\">CREATE INDEX<\/code><\/pre>\n<\/li>\n<li>Crie um \u00edndice BRIN na idade:\n<pre><code>CREATE INDEX idx_brin_idade ON alunos USING brin(idade);<\/code><\/pre>\n<pre><code class=\"output\">CREATE INDEX<\/code><\/pre>\n<\/li>\n<li>Crie um \u00edndice Hash para pesquisa direta na turma:\n<pre><code>CREATE INDEX idx_hash_turma ON alunos USING hash(turma);<\/code><\/pre>\n<pre><code class=\"output\">CREATE INDEX<\/code><\/pre>\n<\/li>\n<\/ol>\n<h3>Verificando a Instala\u00e7\u00e3o \/ Testando a Configura\u00e7\u00e3o<\/h3>\n<p>Ap\u00f3s criar os \u00edndices, \u00e9 crucial verificar se eles est\u00e3o funcionando conforme o esperado. Voc\u00ea pode listar todos os \u00edndices de uma tabela com o seguinte comando:<\/p>\n<pre><code>SELECT indexname FROM pg_indexes WHERE tablename = 'alunos';<\/code><\/pre>\n<pre><code class=\"output\">\n indexname\n-----------\n idx_nome\n idx_gist_nome\n idx_gin_disciplinas\n idx_brin_idade\n idx_hash_turma\n(5 rows)\n<\/code><\/pre>\n<h3>Erros Comuns e Como Resolver<\/h3>\n<ul>\n<li><strong>Erro 1: &#8220;No such file or directory&#8221;<\/strong>\n<p>Causa: Tentativa de criar um \u00edndice sem a extens\u00e3o necess\u00e1ria instalada.<\/p>\n<p>Solu\u00e7\u00e3o: Use <strong>CREATE EXTENSION IF NOT EXISTS<\/strong> antes de criar \u00edndices especiais.<\/p>\n<\/li>\n<li><strong>Erro 2: &#8220;Index type hash does not exist&#8221;<\/strong>\n<p>Causa: O uso de \u00edndices Hash em vers\u00f5es mais antigas do PostgreSQL n\u00e3o suportava cria\u00e7\u00e3o direta em tabelas replicadas.<\/p>\n<p>Solu\u00e7\u00e3o: Atualize para uma vers\u00e3o do PostgreSQL que suporte totalmente \u00edndices Hash.<\/p>\n<\/li>\n<li><strong>Erro 3: &#8220;Access exclusive lock&#8221;<\/strong>\n<p>Causa: Tentar criar um \u00edndice quando a tabela est\u00e1 em uso intensa.<\/p>\n<p>Solu\u00e7\u00e3o: Tente criar o \u00edndice durante um per\u00edodo de baixa atividade ou considere o uso de <strong>CREATE INDEX CONCURRENTLY<\/strong>.<\/p>\n<\/li>\n<li><strong>Erro 4: &#8220;Column does not exist&#8221;<\/strong>\n<p>Causa: Refer\u00eancia a uma coluna que n\u00e3o foi criada ou foi mal especificada.<\/p>\n<p>Solu\u00e7\u00e3o: Verifique a sintaxe e assegure que a coluna exista na tabela alvo.<\/p>\n<\/li>\n<\/ul>\n<h3>Boas Pr\u00e1ticas e Dicas Avan\u00e7adas<\/h3>\n<p>Utilizar \u00edndices de forma eficaz pode resultar em grandes melhorias no desempenho. Aqui est\u00e3o algumas dicas de boas pr\u00e1ticas:<\/p>\n<ul>\n<li>Analise a frequ\u00eancia das consultas para decidir quais \u00edndices criar.<\/li>\n<li>Evite criar muitos \u00edndices em uma tabela, pois isso pode diminuir a performance de opera\u00e7\u00f5es de grava\u00e7\u00e3o.<\/li>\n<li>Use o comando <strong>EXPLAIN<\/strong> para entender como um \u00edndice est\u00e1 sendo utilizado em consultas.<\/li>\n<li>Mantenha os \u00edndices atualizados, especialmente ap\u00f3s grandes cargas de dados.<\/li>\n<\/ul>\n<h3>Resumo da Aula 13<\/h3>\n<p>Hoje cobrimos a import\u00e2ncia e a implementa\u00e7\u00e3o de diferentes tipos de \u00edndices no PostgreSQL, incluindo B-tree, GiST, GIN, BRIN e Hash. Aprendemos sobre as melhores ocasi\u00f5es para usar cada tipo de \u00edndice e como sua aplica\u00e7\u00e3o pode resultar em melhorias significativas de desempenho em consultas. A JRT Technology Solutions continua comprometida em oferecer suporte e servi\u00e7os de treinamento para otimizar suas solu\u00e7\u00f5es em PostgreSQL. Na pr\u00f3xima aula, vamos explorar as t\u00e9cnicas avan\u00e7adas de otimiza\u00e7\u00e3o de consultas em PostgreSQL, uma habilidade cr\u00edtica para qualquer DBA ou desenvolvedor que lide com grandes volumes de dados.<\/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>Domine os \u00edndices no PostgreSQL: B-tree, GiST, GIN, BRIN e Hash. Aula 13 explica tipos, usos e performance. Aprenda agora!<\/p>\n","protected":false},"author":1,"featured_media":1074,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"iawp_total_views":0,"footnotes":""},"categories":[75],"tags":[1879,1880,1878,1881,1882],"class_list":["post-1075","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-devops","tag-b-tree-postgresql","tag-gist-gin-brin","tag-indices-postgresql","tag-otimizacao-de-consultas","tag-tipos-de-indices-banco-de-dados"],"_links":{"self":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1075","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=1075"}],"version-history":[{"count":0,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/posts\/1075\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media\/1074"}],"wp:attachment":[{"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/media?parent=1075"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/categories?post=1075"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jrtx.com.br\/blog\/wp-json\/wp\/v2\/tags?post=1075"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}