Questão de Banco de Dados — Otimização (Tuning) em Banco de Dados — FGV 2024
Banco de Dados›Otimizaçã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á:
Autilizar um índice bitmap para a coluna em questão;
Bcriar um índice convencional na coluna afetada pela função;
Caumentar a alocação de memória para o SGA (System Global Area);
Dimplementar um índice baseado em função (Function-Based Index) na coluna que utiliza a função;
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.