← Voltar ao Blog

Dominando Índices no Oracle e PostgreSQL: B-Tree, Bitmap e Quando Utilizar Cada Um

Publicado em: 18/05/2026 11:30 SQL

O Papel Fundamental dos Índices na Performance de Bancos Relacionais

Muitos desenvolvedores criam tabelas, adicionam chaves primárias e percebem que o sistema roda bem no ambiente de homologação. No entanto, quando a aplicação vai para produção e atinge milhões de linhas, as consultas começam a travar. O motivo mais comum para isso é a ausência de uma estratégia adequada de indexação.

Um índice funciona de forma muito similar ao índice remissivo no final de um livro técnico: em vez de o banco de dados precisar fazer um Full Table Scan (varrer a tabela inteira linha por linha), ele consulta a estrutura do índice para localizar o endereço exato do bloco físico onde o dado está armazenado.

Entendendo a Estrutura B-Tree (Balanced Tree)

O tipo de índice padrão em praticamente todos os sistemas relacionais comerciais (Oracle, PostgreSQL, MySQL/InnoDB) é o B-Tree. Ele organiza os dados em uma árvore balanceada de blocos, permitindo buscas, inserções e exclusões em tempo logarítmico O(log n).

As árvores B-Tree são extremamente eficientes para colunas de alta cardinalidade — ou seja, colunas cujos valores são altamente únicos ou possuem muitas variações distintas, tais como:

Exemplo de criação de um índice B-Tree:

CREATE INDEX idx_clients_email ON clients(email);

Quando Utilizar Índices Bitmap (Exclusivo Oracle / Data Warehouses)

Enquanto o B-Tree brilha em colunas de alta cardinalidade, os índices Bitmap são projetados especificamente para cenários de baixa cardinalidade e ambientes analíticos de grande volume (Data Warehouses), onde há poucas opções de valores distintos repetidos milhares de vezes na tabela.

Exemplos clássicos de colunas ideais para Bitmap:

O Bitmap armazena cada valor distinto associado a um mapa de bits (bits de 0 ou 1 correspondentes à linha física na tabela). Isso permite que operações lógicas complexas (como AND, OR e NOT) sejam resolvidas de forma ultra-rápida utilizando operações bitwise na CPU.

Exemplo de criação de um índice Bitmap:

CREATE BITMAP INDEX idx_orders_status ON orders(status_code);

Nota importante: Evite usar índices Bitmap em tabelas transacionais OLTP que sofrem concorrência pesada de comandos de escrita simultâneos (INSERT, UPDATE), pois o bloqueio de nível de bitmap pode gerar gargalos severos de concorrência.

O Custo Oculto dos Índices

Existe um mito comum no desenvolvimento de software de que "quanto mais índices, mais rápido o sistema fica". Isso é totalmente falso. Todo índice tem um custo de manutenção.

Sempre que um comando INSERT, UPDATE (na coluna indexada) ou DELETE é executado em uma tabela, o banco de dados não altera apenas a linha na tabela principal; ele também é obrigado a atualizar estruturalmente todos os índices associados a ela para manter o balanceamento da árvore ou do bitmap.

Boas práticas de manutenção:

Analisando o Plano de Execução (Execution Plan)

Nunca crie um índice "no escuro". Utilize sempre a ferramenta de plano de execução do seu SGBD para verificar se o otimizador realmente escolheu utilizar o índice criado.

-- Exemplo de comando básico no Oracle para gerar o plano de execução EXPLAIN PLAN FOR SELECT * FROM clients WHERE email = 'contato@devjorge.com.br'; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);

Se o plano retornar um TABLE ACCESS FULL em vez de um INDEX RANGE SCAN ou INDEX UNIQUE SCAN para uma consulta altamente seletiva, pode ser sinal de que estatísticas da tabela estão desatualizadas ou o volume de dados ainda é pequeno demais para compensar o custo de leitura do índice.

', '2026-05-12 09:15:00' );