Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Calculando SQL Server ROW_NUMBER() OVER() para uma tabela derivada


O Row_Number() OVER (ORDER BY (SELECT 1)) truque deve NÃO ser visto como uma maneira de evitar a alteração da ordem dos dados subjacentes. É apenas um meio de evitar que o servidor execute uma classificação adicional e desnecessária (ele ainda pode realizar a classificação, mas custará o mínimo possível quando comparado à classificação por coluna).

Todas as consultas no servidor SQL ABSOLUTAMENTE DEVEM tem um ORDER BY cláusula na consulta mais externa para que os resultados sejam ordenados de maneira confiável e de maneira garantida.

O conceito de "manter a ordem original" não existe em bancos de dados relacionais. Tabelas e consultas devem sempre ser consideradas não ordenadas até e a menos que um ORDER BY cláusula é especificada na consulta mais externa.

Você pode tentar a mesma consulta não ordenada 100.000 vezes e sempre recebê-la com a mesma ordenação e, assim, acreditar que pode confiar nessa ordenação. Mas isso seria um erro, porque um dia, algo vai mudar e não terá a ordem que você espera. Um exemplo é quando um banco de dados é atualizado para uma nova versão do SQL Server - isso fez com que muitas consultas alterassem sua ordem. Mas não precisa ser uma mudança tão grande. Algo tão pequeno quanto adicionar ou remover um índice pode causar diferenças. E mais:Instalando um service pack. Particionando uma tabela. Criando uma exibição indexada que inclui a tabela em questão. Alcançar algum ponto de inflexão onde uma varredura é escolhida em vez de uma busca. E assim por diante.

Não confie em resultados a serem ordenados a menos que você tenha dito "Servidor, ORDER BY ".