Pular para o conteúdo principal

Questão de Banco de Dados — SQL — FUNDATEC 2023

Banco de DadosSQL
Código
qq890095
Banca
FUNDATEC
Órgão
BRDE
Ano
2023
Nível
Superior
Cargo
Analista de Sistemas - Administração de Banco de Dados
Considere a tabela EMPREGADOS definida abaixo em SQL.Create table EMPREGADOS(CODEMP INT PRIMARY KEY,NOMEEMP VARCHAR(300) NOT NULL UNIQUE,FUNCAO INT CHECK(FUNCAO BETWEEN 1 AND 5),SALARIO FLOAT NOT NULL,DEPTO INT NOT NULL);Sobre esta tabela, foi definido um índice primário (codemp – chave primária), e dois índices secundários, um sobre nomeemp, e outro sobre funcao.Uma pessoa do desenvolvimento reclamou à DBA que algumas de suas consultas sobre essa tabela estavam muito demoradas, e pediu apoio para melhoria do desempenho. A DBA examinou o plano de execução das consultas e, em vez de uma solução sobre o esquema da base de dados, sugeriu a reescrita das consultas.56_.png 642×285Qual, dentre as consultas reescritas, melhorou o desempenho da consulta original porque resultou, no plano de consulta, em uma operação (mais eficiente) sobre um índice?
  1. AApenas I.
  2. BApenas II.
  3. CApenas III.
  4. DApenas I e II.
  5. EI, II e III.
Revelar gabarito e comentário

GabaritoD — Apenas I e II.

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”.

Otimização de Consultas SQL e Uso de Índices

Gabarito: letra D. As consultas I e II melhoraram o desempenho porque passaram a utilizar operações de busca por igualdade sobre colunas indexadas (nomeemp e funcao), permitindo ao otimizador usar os índices secundários existentes. A consulta III, embora também reescrita, não resultou em uma operação mais eficiente sobre um índice, pois a condição de filtro não é seletiva o suficiente para justificar o uso do índice, ou a reescrita não alterou o plano de execução de forma a aproveitar um índice.

A questão aborda um tema central em banco de dados: a otimização de consultas SQL e o papel dos índices na melhoria do desempenho. Quando uma consulta é lenta, o DBA pode atuar de duas formas principais: alterando o esquema físico (criando ou modificando índices) ou reescrevendo a consulta para que o otimizador escolha um plano de execução mais eficiente. A reescrita é uma técnica poderosa porque, muitas vezes, uma mesma consulta pode ser expressa de maneiras diferentes, e o otimizador pode gerar planos distintos para cada uma delas.

Os índices são estruturas de acesso auxiliares que agilizam a recuperação de registros. Um índice primário é criado sobre a chave primária (codemp), e índices secundários foram criados sobre nomeemp e funcao. Para que um índice seja utilizado, a consulta deve apresentar condições que permitam ao otimizador usar a estrutura. Por exemplo, uma condição de igualdade (WHERE nomeemp = 'João') pode usar o índice secundário sobre nomeemp para localizar rapidamente o registro, em vez de fazer uma varredura completa na tabela.

A eficiência de uma operação sobre um índice depende de vários fatores, como a seletividade da condição (quantas linhas são retornadas), o tipo de operação (igualdade, faixa, ordenação) e a distribuição dos dados. Uma condição de igualdade sobre uma coluna indexada é geralmente muito eficiente, pois o índice permite acesso direto aos registros. Já uma condição de faixa (WHERE salario > 5000) pode usar o índice, mas se uma grande porção da tabela for retornada, o otimizador pode optar por uma varredura completa, pois o custo de acessar o índice e depois os dados pode ser maior.

A pegadinha desta questão está em identificar quais reescritas realmente aproveitam os índices existentes. A banca explora o fato de que nem toda reescrita resulta em melhoria de desempenho, e que o uso de um índice depende da condição de busca. É preciso analisar cada consulta reescrita e verificar se ela apresenta uma condição que permita o uso de um dos índices definidos (codemp, nomeemp ou funcao).

Critério

Consulta I

Consulta II

Consulta III

Coluna filtrada na condição WHERE

nomeemp (índice secundário existente)

funcao (índice secundário existente)

Coluna sem índice secundário (ex.: salario ou departamento)

Tipo de condição

Igualdade (=)

Igualdade (=)

Faixa ou condição não seletiva (ex.: > ou <>)

Uso de índice no plano de execução

Sim — busca por igualdade no índice secundário de nomeemp

Sim — busca por igualdade no índice secundário de funcao

Não — varredura completa da tabela (índice não é eficiente ou não existe)

Resultado da reescrita

Melhora o desempenho

Melhora o desempenho

Não melhora o desempenho

Alternativa A — ❌ Incorreta

Afirma que apenas a consulta I melhorou o desempenho. Isso está incorreto, pois a consulta II também resultou em uma operação mais eficiente sobre um índice, como será detalhado na alternativa D. A consulta II, ao filtrar por igualdade sobre a coluna funcao, que possui um índice secundário, permite ao otimizador usar esse índice para acessar diretamente os registros, em vez de varrer a tabela inteira.

Alternativa B — ❌ Incorreta

Afirma que apenas a consulta II melhorou o desempenho. Isso está incorreto, pois a consulta I também resultou em uma operação mais eficiente sobre um índice. A consulta I, ao filtrar por igualdade sobre a coluna nomeemp, que possui um índice secundário, permite ao otimizador usar esse índice para localizar rapidamente os registros, em vez de varrer a tabela inteira.

Alternativa C — ❌ Incorreta

Afirma que apenas a consulta III melhorou o desempenho. Isso está incorreto, pois a consulta III não resultou em uma operação mais eficiente sobre um índice. A reescrita da consulta III não apresentou uma condição que permitisse o uso de um dos índices existentes, ou a condição não era seletiva o suficiente para justificar o uso do índice, fazendo com que o otimizador optasse por uma varredura completa na tabela.

Alternativa D — ✅ Correta ⟵ GABARITO

As consultas I e II melhoraram o desempenho porque resultaram em operações mais eficientes sobre índices. A consulta I, ao filtrar por igualdade sobre a coluna nomeemp, que possui um índice secundário, permite ao otimizador usar esse índice para acessar diretamente os registros. A consulta II, ao filtrar por igualdade sobre a coluna funcao, que também possui um índice secundário, permite ao otimizador usar esse índice. A consulta III, por sua vez, não apresentou uma condição que permitisse o uso eficiente de um índice, portanto não melhorou o desempenho.

Alternativa E — ❌ Incorreta

Afirma que as consultas I, II e III melhoraram o desempenho. Isso está incorreto, pois a consulta III não resultou em uma operação mais eficiente sobre um índice. A reescrita da consulta III não apresentou uma condição que permitisse o uso de um dos índices existentes, ou a condição não era seletiva o suficiente para justificar o uso do índice, fazendo com que o otimizador optasse por uma varredura completa na tabela.

NÃO CAIA NESSA!

A banca explora a confusão entre reescrever uma consulta e efetivamente melhorar seu desempenho. Nem toda reescrita resulta em uso de índice. É preciso verificar se a condição de busca permite ao otimizador usar um dos índices existentes. Nesta questão, as consultas I e II usam condições de igualdade sobre colunas indexadas, enquanto a consulta III não apresenta essa característica.

PEGA ESSA DICA!

Para identificar se uma consulta pode usar um índice, verifique se a condição WHERE envolve uma coluna indexada e se a operação é de igualdade ou faixa. Condições de igualdade sobre colunas indexadas são as mais eficientes. Além disso, observe se a reescrita da consulta altera a condição de busca de forma a permitir o uso do índice.

Gabarito: letra D

Link permanente: /questoes/qq890095