Questão nº 39

Questão de Banco de Dados · FGV CGE-SC 2022 (nº 39)

FGV2022Auditor do Estado - Ciências da ComputaçãoBanco de Dados
Gabarito: Cver comentário ↓
Select at.customerid, at.tdate
from salestransaction at
where at.tdate > GETDATE() - 10
order by at.tdate desc

A instrução SQL acima é executada milhões de vezes por dia em um SGBDR Microsoft SQL Server. Considerando que 'customerid' é parte da chave primária e que 'tdate' não está indexada e não apresenta valores únicos, assinale o índice a seguir que irá prover uma melhor otimização para essa consulta.

Resposta comentada

Gabarito Alternativa C

Um índice é uma estrutura especial que o banco de dados usa para localizar dados rapidamente, similar ao índice de um livro. Em vez de ler a tabela inteira (o que é lento para tabelas grandes), o banco pode usar o índice para ir direto às linhas que interessam. Um índice não clusterizado é uma estrutura separada da tabela que contém as chaves do índice e ponteiros para as linhas da tabela. Para otimizar uma consulta que seleciona colunas que não fazem parte da chave do índice, podemos usar um índice cobridor (covering index), que inclui essas colunas adicionais no próprio índice, evitando que o banco precise buscar os dados na tabela principal.

(A) Incorreta: Este índice otimiza a busca e ordenação por `tdate`. No entanto, como a consulta também seleciona `customerid`, e `customerid` não está na chave do índice, o SQL Server precisaria realizar uma operação extra (chamada "key lookup" ou "bookmark lookup") para cada linha encontrada no índice, buscando o `customerid` na tabela principal. Isso adiciona sobrecarga e reduz a eficiência, especialmente para muitas linhas.

(B) Incorreta: Um índice `UNIQUE` impõe que todos os valores na coluna (ou combinação de colunas) sejam únicos. O problema afirma que `tdate` não apresenta valores únicos. Se `tdate` não é único, a combinação `(tdate, customerid)` pode não ser única (ex: o mesmo cliente pode ter várias transações na mesma data), o que impediria a criação deste índice. Mesmo que a combinação fosse única, o principal objetivo de um índice `UNIQUE` é garantir a unicidade dos dados, não apenas otimizar a consulta.

(C) Correta: Este é um índice não clusterizado na coluna `tdate`, o que é excelente para otimizar a cláusula `WHERE` (`tdate > GETDATE() - 10`) e a cláusula `ORDER BY tdate desc`. A parte `INCLUDE ([customerid])` é crucial: ela adiciona a coluna `customerid` ao nível folha do índice sem que ela faça parte da chave do índice. Isso transforma o índice em um índice cobridor, pois todas as colunas necessárias para a consulta (`tdate` para filtro/ordenação e `customerid` para seleção) estão disponíveis diretamente no índice. Dessa forma, o SQL Server não precisa acessar a tabela principal, resultando em uma execução muito mais rápida.

(D) Incorreta: Um índice clusterizado define a ordem física dos dados na tabela e só pode haver um por tabela. O problema menciona que `customerid` é parte da chave primária, que no SQL Server, por padrão, cria um índice clusterizado. Criar um novo índice clusterizado em `tdate` exigiria a remoção do índice clusterizado existente (se houver) e a reconstrução física de toda a tabela, uma operação extremamente cara e demorada para uma tabela com milhões de linhas. Além disso, `tdate` não é única, o que pode adicionar complexidade interna ao índice clusterizado. A cláusula `INCLUDE` é redundante para índices clusterizados, pois todas as colunas da tabela já estão no nível folha do índice clusterizado.

(E) Incorreta: Um PRIMARY XML INDEX é um tipo de índice especializado para colunas que armazenam dados no formato XML. As colunas `tdate` e `customerid` são tipos de dados comuns (como `datetime` e `int`), não XML. Portanto, este tipo de índice é completamente inadequado e não teria qualquer efeito na otimização desta consulta.

Fonte: FGV CGE-SC 2022 Auditor do Estado - Ciências da Computação (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho