Pergunta: supondo que eu tenha uma Orders
tabela com um índice (UserId, CreatedTime)
, faz diferença se eu adicionar DESC
se CreatedTime
desejo listar os pedidos de apenas um único usuário?
Por exemplo:
SELECT *
FROM Orders -- Also potentially have row limit
WHERE UserId = @UserId
ORDER BY CreatedTime DESC;
O que não entendo é que, se a resposta for sim, por que o banco de dados não pode simplesmente começar de baixo e subir, já que @UserId
já conhece o intervalo?
Também trabalho com SQL Server e SQLite, então gostaria de saber se a resposta seria diferente para cada SGBD.
Ainda não entendi muito bem os índices do SQL Server - ascendentes ou descendentes, que diferença isso faz? e aparentemente no MongoDB isso não importa ( A ordem dos índices importa no MongoDB? ).
Voltando à consulta acima, mesmo que eu listasse todos os usuários e suas ordens correspondentes em ordem decrescente CreatedTime
, por que o banco de dados não pode fazer isso:
- Para o usuário nº 1, suas linhas vão de nº 1 a nº 10, portanto, busque as linhas de nº 1 a nº 10 na ordem inversa.
- Para o usuário nº 2, suas linhas vão de 11 a 13, portanto, busque as linhas 11 a 13 na ordem inversa.
- ...
Eu até perguntei à IA e ela simplesmente me disse que é mais lento buscar de baixo para cima sem maiores explicações, mesmo quando tentei pressioná-lo para obter uma.
No SQLite, o índice será usado independentemente de você classificar por CriadoTime em ordem crescente ou decrescente.
Dado:
Os planos de consulta para ambos os tipos são idênticos:
Se, em vez disso, você estiver fazendo uma consulta de intervalo em user_id e depois classificando por
user_id, created_time
, uma tabela temporária adicional será usada somente secreated_time
estiver classificada em ordem decrescente:Para esta consulta, você precisará de um índice para
created_time desc
:=>