Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FGV 2024

Banco de DadosSQL
Código
fg075961
Banca
FGV
Órgão
AL-TO
Ano
2024
Nível
Superior
Cargo
Analista Legislativo - Desenvolvimento de Sistema
A otimização de consultas em sistemas de bancos de dados relacionais envolve melhorar o desempenho das consultas SQL para garantir uma execução eficiente. Isso inclui ações como a escrita eficiente e reescrita de consultas, análise de plano de execução, manutenção de estatísticas de tabelas, entre outras. O objetivo é minimizar o tempo de resposta e maximizar o desempenho geral do sistema.No contexto de otimização de consultas, assinale a opção que indica uma equivalência que não é verdadeira.
  1. AImagem associada para resolução da questão
  2. BImagem associada para resolução da questão
  3. CImagem associada para resolução da questão
  4. DImagem associada para resolução da questão
  5. EImagem associada para resolução da questão
Revelar gabarito e comentário

GabaritoB — [imagem]

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”.
SE LIGUE NESSA!

Esta questão depende de figuras (imagens de equivalências SQL) que não foram transcritas no enunciado. O gabarito oficial é a letra B, mas a explicação abaixo descreve o método de análise sem acesso ao conteúdo visual.

Otimização de consultas SQL: equivalências lógicas

O gabarito é a letra B. A questão pede a alternativa que indica uma equivalência não verdadeira (i.e., uma transformação que altera o resultado da consulta original). Como as alternativas são imagens, vamos revisar o conceito de equivalência lógica em SQL e como identificar transformações inválidas.

Conceito fundamental

Em otimização de consultas, o banco de dados pode reescrever uma consulta SQL em outra forma que produza o mesmo resultado, mas com melhor desempenho. Essas transformações são chamadas de equivalências lógicas. Exemplos comuns incluem:

  • Comutatividade de junções: a ordem das tabelas em um JOIN pode ser trocada sem alterar o resultado (desde que seja INNER JOIN ou CROSS JOIN, mas com LEFT JOIN a ordem importa).

  • Associatividade de junções: a forma de agrupar junções (parênteses) pode ser alterada.

  • Predicate pushdown: aplicar filtros (WHERE) o mais cedo possível, antes das junções, reduz o volume de dados.

  • Distributividade de operadores: por exemplo, (A ∪ B) ∩ C equivale a (A ∩ C) ∪ (B ∩ C) (distributividade da interseção sobre união).

  • Eliminação de subconsultas: transformar IN em EXISTS ou JOIN (mas nem sempre é equivalente, pois IN trata NULLs de forma diferente).

  • Fundir filtros com junções: FROM A JOIN B ON cond1 WHERE cond2 pode ser equivalente a FROM A JOIN B ON cond1 AND cond2 se cond2 se refere apenas a uma tabela.

Como identificar a equivalência falsa (falsa equivalência)

Ao analisar as figuras, procure por transformações que violem as regras da álgebra relacional ou que dependam de características específicas dos dados (como valores nulos). Exemplos de equivalências não verdadeiras:

  1. Trocar a ordem de LEFT JOIN com filtro na tabela da direita:

    ```sql

    -- Original (correto)

    SELECT * FROM A LEFT JOIN B ON A.id = B.id WHERE B.valor > 10;

    -- Essa consulta se comporta como INNER JOIN (o filtro elimina NULLs de B).

    -- A equivalência falsa seria:

    SELECT * FROM (SELECT * FROM A WHERE A.id IN (SELECT id FROM B WHERE valor > 10)) LEFT JOIN B ...

    ```

  1. Considerar NOT IN equivalente a NOT EXISTS na presença de NULLs:

    ```sql

    SELECT * FROM A WHERE A.id NOT IN (SELECT B.id FROM B);

    -- se B.id contém NULL, a subconsulta retorna NULL e o NOT IN nunca é verdadeiro.

    -- Já NOT EXISTS funciona corretamente.

    ```

  1. Aplicar filtro WHERE após junção quando o predicado se refere a colunas da segunda tabela e a junção é um LEFT JOIN: o filtro converte o LEFT JOIN em INNER JOIN.

  1. Considerar que UNION e UNION ALL são equivalentes: UNION elimina duplicatas, UNION ALL não.

  1. Distribuir COUNT sobre união: COUNT(A UNION B) não equivale a COUNT(A) + COUNT(B) porque a união elimina duplicatas entre as duas tabelas.

Conclusão

Sem as imagens, não é possível apontar o erro exato de cada alternativa. O gabarito oficial é a letra B. Na prova, verifique a transformação proposta: ela deve preservar o resultado para qualquer banco de dados, considerando valores nulos, duplicatas e ordem dos operadores. A falsa equivalência geralmente ignora uma dessas nuances.

Dica: Estude as equivalências da álgebra relacional e os casos de pegadinha com NULLs em subconsultas (IN vs EXISTS, NOT IN vs NOT EXISTS). Revise também a semântica dos diferentes tipos de JOIN (left, right, full) quando combinados com filtros.

Gabarito: letra B.

Link permanente: /questoes/fg075961