Sempre que insiro manualmente uma linha em uma tabela no SQL Server Management Studio 2008 (o banco de dados é o SQL Server 2005), minha nova linha aparece no TOPO da lista, e não no final. Estou usando colunas de identidade e isso resulta em coisas como
id row
42 first row
1 second row
2 third row
Quando as linhas são buscadas e não explicitamente ordenadas. Isso resulta em uma aparência diferente quando as linhas são buscadas para o aplicativo da Web e altera o que uma TOP 1
consulta retorna.
Eu sei que posso order by
, mas por que isso está acontecendo? A maioria dos meus dados é inserida por meio de um aplicativo da Web, todas as inserções desse aplicativo resultam em uma ordem Primeiro a entrar, primeiro a sair, por exemplo, a inserção mais recente está na parte inferior, portanto, os ids estão todos em uma linha. Existe alguma configuração no servidor ou no Management Studio que causa essa ordem incorreta?
No mundo SQL, a ordem não é uma propriedade inerente de um conjunto de dados. Portanto, você não tem garantias de seu RDBMS de que seus dados retornarão em uma determinada ordem -- ou mesmo em uma ordem consistente -- a menos que você consulte seus dados com uma
ORDER BY
cláusula.De Craig Freedman :
Sempre use
ORDER BY
se você espera uma ordem bem definida e consistente em seu conjunto de resultados. Nunca confie em como seu banco de dados pode armazenar as linhas no disco (por exemplo, por meio de um índice clusterizado) para garantir uma certa ordem de dados em suas consultas.Apenas para aumentar as outras respostas: uma tabela é, por definição, um conjunto não ordenado de linhas. Se você não especificar uma
ORDER BY
cláusula, o SQL Server está livre para retornar as linhas na ordem que considerar mais eficiente. Isso geralmente coincide com a ordem de inserção, já que a maioria das tabelas possui um índice agrupado em identidade, data e hora ou outras colunas monotonicamente crescentes, mas você deve tratá-lo exatamente como isso: uma coincidência. Ele pode mudar com novos dados, uma atualização de estatísticas, um sinalizador de rastreamento, alterações em maxdop, dicas de consulta, alterações na junção ou cláusulas where na consulta, alterações no otimizador devido a um service pack/atualização cumulativa/hotfix/atualização, movendo o banco de dados para um servidor diferente, etc. etc.Em outras palavras, e eu sei que você já sabe a resposta, mas não pode ser declarada o suficiente:
É porque a tabela é uma tabela heap (provavelmente) e não está indexada. Torne a coluna ID a
PRIMARY KEY
, bem comoIDENTITY
. O SQL Server armazena fisicamente os dados com base nos índices - por exemplo, se id fosse um índice clusterizado (como uma chave primária), os dados seriam armazenados fisicamente na ordem dos ids e seriam retornados dessa maneira ( geralmente, mas nem sempre ) em uma consulta mesmo sem umaORDER BY
cláusula.De qualquer forma, a ordem das linhas não é importante para o banco de dados. Conseqüentemente, fazer com que um aplicativo dependa da ordem das linhas no banco de dados (bem como depender das colunas estarem em uma determinada ordem) não é uma boa prática. O aplicativo precisa trabalhar com quaisquer chaves existentes no banco de dados para identificar as linhas.