Pular para o conteúdo principal

Questão de Banco de Dados — Otimização (Tuning) em Banco de Dados — FGV 2024

Banco de DadosOtimização (Tuning) em Banco de Dados
Código
fg165248
Banca
FGV
Órgão
TJ MS
Ano
2024
Cargo
Tec NS ( )
João está analisando o plano de execução de uma consulta SQL complexa e percebe que o seu desempenho é insatisfatório. Após uma análise detalhada, ele identifica que a consulta está usando, na cláusula “WHERE”, uma função em uma coluna da tabela, o que está afetando negativamente a sua execução.   Com a intenção de melhorar o desempenho da consulta, João deverá:
  1. Autilizar um índice bitmap para a coluna em questão;
  2. Bcriar um índice convencional na coluna afetada pela função;
  3. Caumentar a alocação de memória para o SGA (System Global Area);
  4. Dimplementar um índice baseado em função (Function-Based Index) na coluna que utiliza a função;
  5. Eutilizar o Oracle Performance Analyzer para resolver o problema de gargalo de desempenho apresentado.
Revelar gabarito e comentário

GabaritoD — implementar um índice baseado em função (Function-Based Index) na coluna que utiliza a função;

Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.

Índices baseados em função (Function-Based Index) e otimização de consultas SQL

Gabarito: letra D. Quando uma consulta aplica uma função sobre uma coluna na cláusula WHERE (ex.: WHERE UPPER(nome) = 'JOÃO'), o otimizador não consegue usar um índice comum criado diretamente sobre essa coluna, pois o valor indexado não corresponde ao valor transformado pela função. A solução é criar um índice baseado em função (Function-Based Index), que armazena o resultado da expressão aplicada à coluna, permitindo que o SGBD utilize o índice para acelerar a busca. Essa é uma técnica clássica de tuning em bancos como o Oracle.

O problema descrito no enunciado é um caso típico de consulta não-SARGable (do inglês Search ARGumentable): quando se aplica uma função a uma coluna no predicado, o índice convencional sobre aquela coluna se torna inútil, pois o SGBD precisaria calcular a função para cada linha antes de comparar com o valor filtrado. Isso força uma varredura completa da tabela (full table scan), que é lenta em tabelas grandes. A solução mais direta e eficaz é criar um índice que já armazene o valor da expressão, de modo que o otimizador possa fazer uma busca por intervalo ou por igualdade diretamente no índice.

Vamos entender melhor os tipos de índices e quando cada um é adequado. O índice B-tree (ou árvore B) é o padrão e funciona bem para colunas com alta cardinalidade (muitos valores distintos). O índice bitmap é eficiente para colunas com baixa cardinalidade (poucos valores distintos, como sexo ou status), sendo muito usado em data warehouses. Já o índice baseado em função é específico para situações em que a consulta filtra por uma expressão aplicada à coluna, como WHERE UPPER(nome) = 'JOÃO' ou WHERE data + 30 > SYSDATE. Ele armazena o resultado da expressão, permitindo que o otimizador o utilize.

Na prática, se João tem uma consulta com WHERE FUNCAO(coluna) = valor, ele deve criar um índice como CREATE INDEX idx_funcao ON tabela (FUNCAO(coluna)). Assim, o SGBD pode consultar o índice diretamente, evitando o full table scan. Essa é a recomendação padrão em manuais de otimização do Oracle e de outros SGBDs relacionais.

A pegadinha desta questão está em distinguir o índice baseado em função das outras alternativas: um índice convencional na coluna (alternativa B) não resolve, pois a função impede seu uso; o índice bitmap (alternativa A) é para baixa cardinalidade, não para funções; aumentar a SGA (alternativa C) pode ajudar em outros gargalos, mas não resolve o problema específico de função no WHERE; e o Oracle Performance Analyzer (alternativa E) é uma ferramenta de diagnóstico, não uma solução de indexação.

Guarde o critério: função na coluna do WHERE → índice baseado em função. É exatamente essa a fronteira que separa a alternativa correta das demais.

Alternativa A — ❌ Incorreta

O índice bitmap é indicado para colunas com baixa cardinalidade (poucos valores distintos), como sexo, status ou categoria. Ele não resolve o problema de uma função aplicada à coluna, pois o bitmap indexa os valores originais da coluna, não o resultado da expressão. Além disso, em bancos transacionais com muitas operações de escrita, o índice bitmap pode até prejudicar o desempenho devido ao custo de manutenção. Portanto, não é a solução para o caso de João.

Alternativa B — ❌ Incorreta

Criar um índice convencional (B-tree) na coluna afetada pela função não resolve o problema. O índice armazena os valores originais da coluna, mas a consulta filtra pelo valor transformado pela função. O otimizador não consegue usar o índice porque precisaria aplicar a função a cada valor indexado antes de comparar — o que inviabiliza a busca direta. Por isso, a consulta continua fazendo full table scan. A solução correta é indexar a expressão (função aplicada à coluna), não a coluna pura.

Alternativa C — ❌ Incorreta

Aumentar a alocação de memória para a SGA (System Global Area) pode melhorar o desempenho geral do banco, pois mais blocos de dados podem ser mantidos em cache, reduzindo leituras em disco. Porém, isso não ataca a causa raiz do problema: a função na coluna impede o uso de índice, e mais memória não faz o otimizador usar um índice que não existe para a expressão. A SGA ajuda em gargalos de I/O, mas não em consultas não-SARGable.

Alternativa D — ✅ Correta ⟵ GABARITO

O índice baseado em função (Function-Based Index) é exatamente a solução para consultas que aplicam uma função a uma coluna no WHERE. Ele armazena o resultado da expressão aplicada à coluna, permitindo que o otimizador use o índice para buscar diretamente os valores transformados. Por exemplo, se a consulta é WHERE UPPER(nome) = 'JOÃO', o índice CREATE INDEX idx_upper_nome ON tabela (UPPER(nome)) permite que o SGBD encontre rapidamente as linhas sem varrer a tabela inteira. Essa é uma técnica consagrada de tuning em Oracle e outros SGBDs.

Alternativa E — ❌ Incorreta

O Oracle Performance Analyzer (na verdade, o Oracle Performance Analyzer é parte do Oracle Enterprise Manager, usado para analisar mudanças de desempenho) é uma ferramenta de diagnóstico que ajuda a identificar gargalos, mas não resolve o problema diretamente. Ele pode apontar que a consulta está fazendo full table scan por causa da função, mas a solução efetiva é criar o índice baseado em função. A ferramenta é um passo para descobrir o problema, não a correção em si.

Gabarito: letra D — implementar um índice baseado em função na coluna que utiliza a função.

Link permanente: /questoes/fg165248