Índices Espaciais (GiST)
Torne rápidas as consultas de localização.
Índices Espaciais (GiST) é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Por que as consultas de localização ficam lentas
Imagine uma tabela com milhões de localizações de restaurantes. Se você perguntar "Encontre todos os restaurantes a até 5 km de mim", o banco de dados terá de verificar cada linha para calcular a distância. Isso é chamado de varredura sequencial e se torna dolorosamente lento à medida que a tabela cresce.
Os índices espaciais resolvem esse problema organizando os dados de geometria em uma estrutura de árvore, permitindo que o banco de dados ignore instantaneamente grandes partes da tabela.
O que é um índice GiST?
GiST significa árvore de pesquisa generalizada. É uma estrutura flexível de índices integrada ao PostgreSQL que oferece suporte a muitos tipos de dados, incluindo formas geométricas e geometrias do PostGIS.
Diferentemente de um índice B-tree (que funciona com valores ordenáveis, como números inteiros ou strings), o GiST pode indexar dados multidimensionais, como pontos, polígonos e linhas. O PostGIS usa o GiST internamente para criar seus índices espaciais.
Criando um índice espacial
Criar um índice GiST em uma coluna de geometria é simples. Use CREATE INDEX com a cláusula USING gist. Essa única instrução pode transformar uma consulta que levava minutos em uma que leva milissegundos.
CREATE INDEX idx_restaurants_geom
ON restaurants
USING gist (geom);Como o GiST funciona: caixas delimitadoras
Um índice espacial GiST não armazena as geometrias exatas. Em vez disso, armazena caixas delimitadoras — o menor retângulo que envolve cada geometria. A árvore é construída agrupando caixas delimitadoras próximas em cada nível.
Quando uma consulta é executada, o PostgreSQL desce pela árvore, eliminando ramificações cujas caixas delimitadoras não se sobrepõem à área de pesquisa. Somente as linhas candidatas restantes são verificadas com precisão. Essa abordagem em duas fases (consulta ao índice + nova verificação) é extremamente eficiente.
Configurando uma tabela de exemplo
Antes de explorar o comportamento dos índices, vamos criar uma tabela de exemplo com pontos de cidades e preenchê-la com algumas linhas. A coluna geom armazena cada cidade como um ponto em WGS 84 (SRID 4326).
CREATE TABLE cities (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
geom GEOMETRY(Point, 4326)
);
INSERT INTO cities (name, geom) VALUES
('Paris', ST_SetSRID(ST_MakePoint(2.3522, 48.8566), 4326)),
('Berlin', ST_SetSRID(ST_MakePoint(13.4050, 52.5200), 4326)),
('Madrid', ST_SetSRID(ST_MakePoint(-3.7038, 40.4168), 4326)),
('Rome', ST_SetSRID(ST_MakePoint(12.4964, 41.9028), 4326)),
('Warsaw', ST_SetSRID(ST_MakePoint(21.0122, 52.2297), 4326));Adicionando o índice GiST
Com a tabela preenchida, adicione um índice GiST à coluna geom. Em tabelas de produção com milhões de linhas, essa instrução pode levar alguns minutos, mas precisa ser executada apenas uma vez. Depois disso, todas as consultas espaciais nessa coluna serão beneficiadas automaticamente.
CREATE INDEX idx_cities_geom
ON cities
USING gist (geom);
-- Verify the index exists
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'cities';Operador de caixa delimitadora &&
O PostGIS disponibiliza o operador && para testar se duas caixas delimitadoras se sobrepõem. Esse operador reconhece índices — o planejador usa o índice GiST automaticamente. Ele é muito mais rápido que calcular interseções exatas entre geometrias e costuma ser usado como pré-filtro rápido.
-- Find cities whose bounding box overlaps a search rectangle
SELECT name
FROM cities
WHERE geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);Pesquisa do vizinho mais próximo com <->
O operador <-> retorna a distância entre duas geometrias e também é acelerado pelo GiST. Combiná-lo com ORDER BY ... LIMIT produz uma consulta de k vizinhos mais próximos (KNN) extremamente rápida — sem necessidade de uma varredura completa da tabela.
-- Find the 3 cities closest to a reference point (Brussels)
SELECT name,
ST_Distance(
geom::geography,
ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)::geography
) / 1000 AS distance_km
FROM cities
ORDER BY geom <-> ST_SetSRID(ST_MakePoint(4.3517, 50.8503), 4326)
LIMIT 3;Verificando o uso do índice com EXPLAIN
Sempre use EXPLAIN ou EXPLAIN ANALYZE para confirmar que o planejador está realmente usando seu índice. Procure por Bitmap Index Scan ou Index Scan using idx_cities_geom na saída. Se aparecer Seq Scan, a tabela pode ser pequena demais para que o planejador prefira o índice.
EXPLAIN
SELECT name
FROM cities
WHERE geom && ST_MakeEnvelope(-5, 40, 15, 50, 4326);Criação concorrente de índices
Criar um índice espacial grande com o comando padrão CREATE INDEX bloqueia a tabela para operações de escrita. Em produção, use CREATE INDEX CONCURRENTLY para criar o índice sem bloquear inserções ou atualizações. A desvantagem é que a operação demora mais e não pode ser executada dentro de um bloco de transação.
-- Safe for production tables (no write lock)
CREATE INDEX CONCURRENTLY idx_restaurants_geom
ON restaurants
USING gist (geom);Mantendo seu índice espacial
Com o tempo, muitas inserções, atualizações e exclusões podem causar fragmentação do índice — ele cresce fragmentado e se torna menos eficiente. Use REINDEX para reconstruí-lo de forma limpa ou programe VACUUM ANALYZE periodicamente para atualizar as estatísticas, permitindo que o planejador de consultas tome decisões melhores.
-- Rebuild the index to remove bloat
REINDEX INDEX idx_cities_geom;
-- Update planner statistics for the table
ANALYZE cities;Verificação rápida: índices GiST
Teste sua compreensão sobre índices espaciais com GiST no PostGIS.
Recapitulação: índices espaciais com GiST
Nesta lição, você aprendeu por que os índices espaciais são essenciais para consultas de localização eficientes e como o GiST as viabiliza no PostgreSQL e no PostGIS.
Principais conclusões:
- GiST (árvore de pesquisa generalizada) é um tipo flexível de índice que oferece suporte a dados de geometria multidimensionais.
- Crie um índice espacial com
CREATE INDEX ... USING gist (geom). - O GiST armazena caixas delimitadoras e elimina ramificações da árvore de pesquisa, evitando varreduras completas da tabela.
- O operador
&&(sobreposição de caixas delimitadoras) e o operador<->(distância/KNN) são acelerados pelo GiST. - Use
EXPLAINpara verificar o uso do índice eCREATE INDEX CONCURRENTLYem produção para evitar bloqueios de escrita. - Mantenha os índices com
REINDEXeANALYZEpara conservar a rapidez das consultas ao longo do tempo.
Perguntas Frequentes
A aula “Índices Espaciais (GiST)” é grátis?
Sim — o texto completo de “Índices Espaciais (GiST)” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Índices Espaciais (GiST)”?
Torne rápidas as consultas de localização. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.
Quanto tempo leva a aula “Índices Espaciais (GiST)”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Tipos de Dados Espaciais
- Distância e Vizinhos Mais Próximos
- Junções Espaciais e Contenção
- Índices Espaciais (GiST)