Questão nº 40
Questão de Tecnologia da Informação · FGV TJ-MS 2024 (nº 40)
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; (alternativa correta)
- Eutilizar o Oracle Performance Analyzer para resolver o problema de gargalo de desempenho apresentado.
Resposta comentada
Gabarito Alternativa D
Quando você coloca uma função (como UPPER(), SUBSTR(), TO_CHAR()) em uma coluna na cláusula WHERE de uma consulta SQL, o banco de dados geralmente não consegue usar um índice comum que exista nessa coluna, porque ele precisa calcular a função para cada linha antes de comparar, tornando o índice inútil.
- (A) Incorreta: Índices bitmap são mais eficazes para colunas com poucos valores distintos (baixa cardinalidade) e não resolvem o problema fundamental de uma função impedir o uso de um índice existente na coluna.
- (B) Incorreta: Um índice convencional criado diretamente na coluna
Xnão será utilizado se a consulta usarFUNCAO(X)na cláusulaWHERE, pois o otimizador não consegue aplicar o índice ao resultado da função. Esta é a armadilha: o índice existe, mas a função o "esconde" do otimizador. - (C) Incorreta: Aumentar a SGA (área de memória do banco de dados) pode melhorar o desempenho geral ao permitir mais cache de dados e planos, mas não aborda o problema específico de uma função no
WHEREque impede o uso de um índice. - (D) Correta: Um índice baseado em função (Function-Based Index) é criado sobre o resultado da função aplicada à coluna (ex:
CREATE INDEX idx_nome_upper ON tabela (UPPER(coluna_nome))). Assim, quando a consulta usa a mesma função noWHERE(ex:WHERE UPPER(coluna_nome) = 'VALOR'), o otimizador pode usar este índice pré-calculado, otimizando a busca. - (E) Incorreta: O Oracle Performance Analyzer é uma ferramenta para identificar problemas de desempenho, como João já fez ao analisar o plano de execução. Ele não é uma solução para o problema técnico identificado, mas sim um meio de encontrá-lo.
Fonte: FGV TJ-MS 2024 Técnico de Nível Superior - Analista de Banco de Dados (Caderno Tipo 1). Reproduzida para fins de estudo.