0Pricing
SQL Academy · Aula

Índices parciais e de expressão

Indexe apenas as linhas relevantes usando cláusulas WHERE e indexe expressões calculadas (lower(email), date_trunc('day', ts)).

Índices parciais e de expressão é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 3 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.

Índice parcial: indexe um subconjunto

Um índice parcial abrange apenas as linhas que correspondem a uma cláusula WHERE no momento da criação do índice. Ele é menor, mais rápido e excelente para a consulta mais comum:

CREATE INDEX users_active_email_idx
  ON users(email)
  WHERE deleted_at IS NULL;

Quando os índices parciais são vantajosos

Use-os quando:

  • Você sempre filtra pelo mesmo predicado (por exemplo, exclusão lógica)
  • Um valor predomina na coluna (por exemplo, 95% das linhas têm status='closed')
  • Você quer um índice pequeno e frequentemente acessado no cache

Exemplo: sessões ativas

A maioria das sessões expirou; apenas as ativas são consultadas:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE expires_at > NOW();
-- Caveat: planner can't use NOW() in the index predicate — use a fixed timestamp
-- and reindex periodically, OR use a boolean column.

Melhor opção: use um predicado estável

O predicado do índice deve ser immutable. Expressões dependentes do tempo, como NOW(), não são qualificadas. Em vez disso, use uma coluna como is_active:

CREATE INDEX sessions_active_idx ON sessions(user_id)
  WHERE is_active = true;

-- The query must use the same predicate to match the index:
SELECT * FROM sessions WHERE is_active = true AND user_id = 42;

Índice de expressão

Indexe o resultado de uma função aplicada a uma coluna:

CREATE INDEX users_email_lower_idx ON users(LOWER(email));

SELECT * FROM users WHERE LOWER(email) = LOWER('Alice@Example.com');
-- Uses the expression index.

Índices de expressão comuns

  • LOWER(email) para pesquisas que não diferenciam maiúsculas de minúsculas
  • (price * tax_rate) para ordenação por valor calculado
  • date_trunc('day', created_at) para relatórios diários
  • (data ->> 'user_id')::BIGINT para extrações de JSONB

A expressão deve ser IMMUTABLE

A expressão deve ser marcada como IMMUTABLE — seu resultado depende apenas da entrada. RANDOM(), NOW() e CURRENT_USER não são qualificadas.

Combinação de índice parcial e de expressão

Os dois podem ser combinados:

CREATE INDEX articles_active_title_idx
  ON articles(LOWER(title))
  WHERE published_at IS NOT NULL;

Índices parciais exclusivos

O padrão clássico de "uma linha ativa":

CREATE UNIQUE INDEX users_one_active_email
  ON users(email)
  WHERE deleted_at IS NULL;

-- Same email can exist many times in deleted users, but only once active.

O predicado do índice deve corresponder à consulta

O planejador só usa o índice parcial quando a cláusula WHERE da consulta "implica" o predicado do índice:

-- Index:  WHERE is_active = true
-- Match:  WHERE is_active = true AND user_id = 42       ✓
-- Match:  WHERE is_active AND user_id = 42             ✓
-- No:     WHERE user_id = 42                           ✗
-- No:     WHERE is_active IS NOT FALSE                 ✗ (logically same but planner may not realise)

Não exagere no uso

Muitos índices parciais que abrangem subconjuntos disjuntos podem tornar as escritas mais lentas (cada INSERT precisa atualizar todos os índices relevantes). Use-os com moderação para consultas muito acessadas.

Recapitulação

Os índices parciais e de expressão oferecem mais desempenho por byte.

  • Parcial: indexa apenas o subconjunto consultado
  • De expressão: indexa valores calculados
  • Ambos exigem predicados IMMUTABLE
  • A consulta deve usar o mesmo predicado para haver correspondência

Verificação rápida

Você quer fazer buscas que não diferenciem maiúsculas de minúsculas por e-mail. Qual índice é mais eficiente?

Perguntas Frequentes

A aula “Índices parciais e de expressão” é grátis?

Sim — o texto completo de “Índices parciais e de expressão” é 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 parciais e de expressão”?

Indexe apenas as linhas relevantes usando cláusulas WHERE e indexe expressões calculadas (lower(email), date_trunc('day', ts)). 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 3 de 4.

Quanto tempo leva a aula “Índices parciais e de expressão”?

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

  1. Índices B-tree vs Hash vs GiST vs GIN
  2. Índices compostos e ordem das colunas
  3. Índices parciais e de expressão
  4. Manutenção de índices e fragmentação
← Voltar para SQL Academy