Sempre que insiro manualmente uma linha em uma tabela no SQL Server Management Studio 2008 (o banco de dados é SQL Server 2005), minha nova linha aparece na parte superior da lista e não na parte inferior. 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 são ordenadas explicitamente. Isso resulta em uma aparência diferente quando as linhas são buscadas para o aplicativo 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 um pedido de primeiro a entrar, por exemplo, a inserção mais recente fica na parte inferior, para que os IDs sejam todos seguidos. Existe alguma configuração no servidor ou no Management Studio que causa esse pedido incorreto?
fonte
Respostas:
No mundo SQL, order não é uma propriedade inerente a um conjunto de dados. Portanto, você não recebe garantias do 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 no 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 em cluster) para garantir uma certa ordem de dados em suas consultas.fonte
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 poderá retornar as linhas na ordem que julgar mais eficiente. Isso geralmente coincide com a ordem da inserção, já que a maioria das tabelas possui um índice agrupado em identidade, data e hora ou outras colunas que aumentam monotonicamente, mas você deve tratá-lo exatamente assim: uma coincidência. Ele pode ser alterado com novos dados, atualização de estatísticas, sinalizador de rastreamento, alterações no maxdop, dicas de consulta, alterações na cláusula join ou where da 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 afirmada o suficiente:
fonte
select
statmentsÉ porque a tabela é uma tabela de heap (provavelmente) e não está indexada. Torne a coluna ID
PRIMARY KEY
tão boa quantoIDENTITY
. O SQL Server armazena fisicamente os dados com base nos índices - por exemplo, se o ID fosse um índice em cluster (como uma chave primária), os dados seriam fisicamente armazenados na ordem dos IDs e seriam retornados dessa maneira em uma consulta mesmo sem umaORDER BY
cláusula. Caso contrário, a ordem das linhas não é importante para o banco de dados. Conseqüentemente, ter um aplicativo depende da ordem das linhas no banco de dados (assim como das colunas estarem em uma determinada ordem) não é uma boa prática. O aplicativo precisa trabalhar com as chaves existentes no banco de dados para identificar linhas.fonte
order by
(é um aplicativo herdado com muita prática incorreta), mas estava pensando exatamente por que isso aconteceu.SELECT *
semORDER BY
possa voltar na ordem "certa" (mas ainda não seja garantida)?ORDER BY
cláusula é uma garantia muito melhor (não importa muito menos perturbadora) do que fazer alterações de esquema na tabela e esperar que a ordem seja a esperada para sempre.