Eu tenho uma tabela chamada STUDENT
+-----------+-----------+-----------+---------------+
| StudentID | FirstName | LastName | EnrollmenDate |
+-----------+-----------+-----------+---------------+
| 1 | x | x | x |
| 2 | x | x | x |
| 3 | x | x | x |
+-----------+-----------+-----------+---------------+
Escreva uma consulta que puxe o aluno que registrou o último?
a) selecione top 1 * de STUDENTorder by EnrollmentDate Desc
ou
b) selecione * de ALUNO onde EnrollmentDate = (selecione Max(Data de Matrícula) de ALUNO)
Costumo fazer essa pergunta em entrevistas. Um candidato respondeu b) Eu estava esperando a). Qual é a melhor consulta?
A segunda consulta não necessariamente faz isso, dependendo do tipo de dados da
EnrolmentDate
coluna e da granularidade dos dados. Se esta coluna não contiver um componente de tempo, a consulta retornará todos os alunos matriculados no último dia em que um aluno se matriculou, o que não satisfaz a pergunta. Se houver um componente de tempo, é possível (mas muito menos provável) que várias linhas sejam retornadas.(Edit: Alex Kuznetsov apontou corretamente nos comentários que a primeira consulta não retorna necessariamente o último aluno matriculado quando há empates. É, no entanto, garantido que retornará um registro nesse evento, ao invés de todos os registros, o que é normalmente satisfatório. Acho que meu ponto foi mais que comparar as duas consultas é comparar maçãs com laranjas, por assim dizer.)
De qualquer forma, se assumirmos que todas as datas/horas de inscrição são únicas, pelo que foi dado, a resposta para a pergunta também não é necessariamente clara. Você precisaria qualificar para mim o que quer dizer com mais eficiente.
A primeira consulta irá verificar apenas uma vez, mas pode incorrer em uma classificação cara (você não disse quais índices existem na tabela, então presumo que não haja). A última consulta fará uma varredura para encontrar o máximo e, em seguida, fará outra varredura para encontrar todas as linhas correspondentes, que possivelmente usariam menos CPU, mas E/Ss mais lógicas. É totalmente possível que a segunda consulta seja menos dispendiosa no geral (novamente, sem índices disponíveis).
Dito tudo isso, se eu fosse começar a fazer o ajuste de desempenho nessa operação de negócios, certamente começaria com a consulta (a).