Ilekroć ręcznie wstawiam wiersz do tabeli w SQL Server Management Studio 2008 (bazą danych jest SQL Server 2005), mój nowy wiersz pojawia się na górze listy, a nie na dole. Używam kolumn tożsamości, a to skutkuje takimi rzeczami
id row
42 first row
1 second row
2 third row
Gdy wiersze są pobierane i nie są jawnie uporządkowane. Powoduje to inny wygląd, gdy wiersze są pobierane do aplikacji sieci web i zmienia to, co TOP 1
zwraca zapytanie.
Wiem, że potrafię order by
, ale dlaczego tak się dzieje? Większość moich danych jest wstawianych za pośrednictwem aplikacji internetowej, wszystkie wstawki z tej aplikacji skutkują kolejnością Pierwsze na Pierwsze Wyjście, np. Najnowsza wstawka znajduje się na dole, więc identyfikatory są w jednym rzędzie. Czy jest jakieś ustawienie w serwerze lub Management Studio, które powoduje to niewłaściwe zamówienie?
źródło
Odpowiedzi:
W świecie SQL porządek nie jest nieodłączną właściwością zestawu danych. W ten sposób nie otrzymujesz żadnych gwarancji z RDBMS, że twoje dane wrócą w określonej kolejności - lub nawet w spójnej kolejności - chyba że zapytasz o dane
ORDER BY
klauzulą.Od Craiga Freedmana :
Zawsze używaj,
ORDER BY
jeśli spodziewasz się dobrze zdefiniowanej i spójnej kolejności w zestawie wyników. Nigdy nie polegaj na tym, jak baza danych może przechowywać wiersze na dysku (np. Poprzez indeks klastrowany), aby zagwarantować pewną kolejność danych w zapytaniach.źródło
Aby uzupełnić pozostałe odpowiedzi: tabela jest z definicji nieuporządkowanym zestawem wierszy. Jeśli nie określisz
ORDER BY
klauzuli, SQL Server może zwrócić wiersze w dowolnej kolejności, którą uzna za najbardziej wydajną. Często zdarza się, że pokrywa się to z kolejnością wstawiania, ponieważ większość tabel ma indeks klastrowy dotyczący tożsamości, daty i godziny lub innych monotonicznie rosnących kolumn, ale należy traktować to dokładnie tak: zbieg okoliczności. Może się zmieniać wraz z nowymi danymi, aktualizacją statystyk, flagą śledzenia, zmianami w maxdop, wskazówkami do zapytań, zmianami przyłączenia lub klauzulami zapytania w zapytaniu, zmianami w optymalizatorze z powodu dodatku Service Pack / aktualizacji zbiorczej / poprawki / aktualizacji, przeniesienie bazy danych na inny serwer itp. itp.Innymi słowy i wiem, że znasz już odpowiedź, ale nie można jej powiedzieć wystarczająco:
źródło
select
statystykJest tak, ponieważ tabela jest tabelą sterty (najprawdopodobniej) i nie jest indeksowana. Ustaw także kolumnę identyfikatora
PRIMARY KEY
jakoIDENTITY
. SQL Server fizycznie przechowuje dane na podstawie indeksów - na przykład, jeśli id byłby indeksem klastrowym (takim jak klucz podstawowy), dane byłyby fizycznie przechowywane w kolejności identyfikatorów i byłyby w ten sposób zwracane w zapytaniu nawet bezORDER BY
klauzula. W przeciwnym razie kolejność wierszy nie jest istotna dla bazy danych. W konsekwencji, mając aplikacji zależy od kolejności wierszy w bazie danych (a także w zależności od kolumn znajdujących się w określonej kolejności) nie jest dobra praktyka. Aplikacja musi pracować z dowolnymi kluczami w bazie danych, aby identyfikować wiersze.źródło
order by
(jest to aplikacja odziedziczona z dużą ilością złych praktyk), ale zastanawiałem się, dlaczego tak się stało.SELECT *
bez niejORDER BY
mogła wrócić w „właściwej” kolejności (ale nadal nie ma gwarancji)?ORDER BY
myśli, że dodanie klauzuli jest o wiele lepszą gwarancją (nie wspominając o dużo mniej destrukcyjnym) niż wprowadzanie zmian w schemacie do tabeli i nadzieja, że porządkowanie będzie zgodne z oczekiwaniami, na zawsze.