Auditor Estadual de Controle - Tecnologia da Informação - tarde
No SQL Server, uma das práticas recomendadas para otimizar o desempenho de consultas complexas, é o uso de índices compostos. Considere a seguinte situação:Uma tabela de vendas (Vendas) contém as colunas data_venda, id_cliente, valor_total. Deseja-se otimizar a consulta que filtra registros por id_cliente e ordena por data_venda.Assinale a opção que indica a configuração de índice mais adequada.
AÍndice apenas em valor_total.
BÍndice apenas em data_venda.
CÍndice composto em (data_venda, id_cliente).
DÍndice composto em (id_cliente, data_venda).
EÍndice filtrado em valor_total com condição valor_total > 1000.
Revelar gabarito e comentário▾
GabaritoD — Índice composto em (id_cliente, data_venda).
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 compostos no SQL Server: ordem das colunas é crucial
Gabarito: letra D. O índice composto mais adequado é (id_cliente, data_venda). Isso porque a consulta filtra por id_cliente (WHERE) e ordena por data_venda (ORDER BY). Em um índice composto, a primeira coluna deve ser a que aparece no filtro de igualdade, e a segunda coluna auxilia na ordenação. Essa estrutura permite que o índice seja usado para ambas as operações sem necessidade de acesso aleatório à tabela.
A questão testa o princípio de que, em índices compostos, a ordem das colunas define a utilidade. Colocar data_venda primeiro (alternativa C) tornaria o índice útil apenas para ordenação, mas não para o filtro específico por id_cliente, exceto se o filtro também fosse por data_venda.
Alternativa
Colunas do índice
Tipo de índice
Adequação para a consulta (WHERE id_cliente, ORDER BY data_venda)
Motivo
A
valor_total
Simples
❌ Irrelevante
A consulta não filtra por valor_total.
B
data_venda
Simples
❌ Parcial
Ajuda na ordenação, mas não acelera a filtragem por id_cliente.
C
(data_venda, id_cliente)
Composto
❌ Inadequado
A primeira coluna (data_venda) não é usada no filtro; o índice não será eficiente para localizar o cliente.
D
(id_cliente, data_venda)
Composto
✅ Correta (Gabarito)
A primeira coluna atende ao filtro de igualdade; a segunda já está ordenada dentro de cada cliente, atendendo ao ORDER BY.
E
valor_total (filtrado: > 1000)
Filtrado
❌ Irrelevante
A consulta não filtra por valor_total.
Alternativa A — ❌ Incorreta
Índice apenas em valor_total é irrelevante para a consulta, que não filtra por valor_total.
Alternativa B — ❌ Incorreta
Índice apenas em data_venda ajuda na ordenação, mas não acelera a filtragem por id_cliente. O banco precisaria varrer toda a tabela ou índice para encontrar os registros do cliente.
Alternativa C — ❌ Incorreta
Índice composto em (data_venda, id_cliente): a primeira coluna é data_venda. Como a consulta filtra por id_cliente (não por data_venda), o índice não será usado para o filtro – apenas para a ordenação, e ainda assim de forma limitada (só se houver poucos registros por data). A ordem correta para essa consulta é coluna de filtro primeiro.
Alternativa D — ✅ Correta ⟵ GABARITO
Índice composto em (id_cliente, data_venda). A primeira coluna atende a condição WHERE id_cliente = ?; a segunda coluna já está ordenada dentro de cada grupo de id_cliente, satisfazendo a ORDER BY data_venda. Isso permite que o índice seja varrido na ordem correta, sem necessidade de ordenação extra.
Alternativa E — ❌ Incorreta
Índice filtrado em valor_total com condição valor_total > 1000 é irrelevante para a consulta, que não menciona valor_total.
NÃO CAIA NESSA!
A armadilha está em achar que inverter a ordem das colunas não faz diferença. Muitos escolhem (data_venda, id_cliente) pensando que a ordenação é o principal, mas na verdade o filtro define a primeira coluna. Lembre-se: em um índice composto, a coluna de igualdade (WHERE) vem primeiro; a coluna de ordenação (ORDER BY) vem em segundo lugar.