Dlaczego SSMS wstawia nowe wiersze na górze tabeli, a nie na dole?


9

Ilekroć ręcznie wstawiam wiersz do tabeli w SQL Server Management Studio 2008 (baza danych to SQL Server 2005), mój nowy wiersz pojawia się na górze listy, a nie na dole.Używam kolumn tożsamości, co powoduje takie rzeczy

id row
42 first row
1 second row
2 third row

Gdy wiersze są pobierane i nie są wyraźnie uporządkowane.Powoduje to inny wygląd, gdy wiersze są pobierane do aplikacji internetowej i zmienia to, co zwraca zapytanie TOP 1 .

Wiem, że mogę je order by , ale dlaczego tak się dzieje?Większość moich danych jest wstawiana przez aplikację internetową, wszystkie wstawki z tej aplikacji powodują zamawianie First In First Out, np. Najnowsza wkładka 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?

  0

Jak widziałem czasami, zależy to od kolejności PK, w jaki sposób są wyświetlane wiersze, jeśli wybierzesz pojedynczą tabelę.Jeśli zrobisz jakieś połączenia, może się to zmienić w zależności od innych tabel PK, FK i indeksów ... 18 lip. 132013-07-18 22:00:36

  0

Bądź również świadomy skanów [wesołych świąt] (http://technet.microsoft.com/en-us/library/ms191475%28v=sql.105%29.aspx). 01 kwi. 152015-04-01 03:49:03

17

W świecie SQL kolejność nie jest wrodzoną właściwością zestawu danych.Dzięki temu nie otrzymujesz żadnych gwarancji od swoich RDBMS, że twoje dane powrócą w określonej kolejności - lub nawet w spójnej kolejności - chyba że zapytasz swoje dane za pomocąORDER BYklauzula.

ZCraig Freedman:

Połączenie TOP z ORDER BY dodaje determinizm do zestawu zwracanych wierszy.Bez ORDER BY zestaw zwracanych wierszy zależy od planu kwerend i może nawet różnić się od wykonania do wykonania.

Zawsze używajORDER BYjeśli oczekujesz dobrze określonej i spójnej kolejności w zestawie wyników.Nigdy nie polegaj na tym, jak twoja baza danych może przechowywać wiersze na dysku (np. Za pomocą indeksu klastrowego), aby zagwarantować pewne uporządkowanie danych w zapytaniach.


0

To dlatego, że tabela jest tabelą sterty (najprawdopodobniej) i nie jest indeksowana.Utwórz kolumnę identyfikacyjną aPRIMARY KEYjak równieżIDENTITY.SQL Server fizycznie przechowuje dane na podstawie indeksów - na przykład, jeśli identyfikator byłby indeksem klastrowym (takim jak klucz podstawowy), dane byłyby fizycznie przechowywane w kolejności identyfikatorów i byłyby zwracane w ten sposób w zapytaniu nawet bez naORDER BYklauzula.W przeciwnym razie kolejność wierszy w ogóle nie jest ważna dla bazy danych.W konsekwencji posiadanie aplikacjizależećkolejność wierszy w bazie danych (a także w zależności od kolumn w określonej kolejności) nie jest dobrą praktyką.Aplikacja musi pracować z dowolnymi kluczami w bazie danych, aby zidentyfikować wiersze.

  0

Dobrze wiedzieć.Wiedziałem, że to była wskazówka, aby zmienić aplikację, aby używać 'order by' (jest to odziedziczona aplikacja z dużą ilością złych praktyk), ale zastanawiałem się, dlaczego tak się stało. 14 wrz. 112011-09-14 19:49:38

+4

Zmień strukturę tabeli tak, aby 'SELECT *' bez 'ORDER BY' *** mogło *** powrócić w„ właściwym ”porządku (ale nadal nie można zagwarantować)? 14 wrz. 112011-09-14 20:22:26

  0

Na prostym SELECT z tabeli z indeksem klastrowym wróciłby w kolejności indeksu klastrowego.Nie było tak jasne, jak powinienem być, ponieważ stanowiło ilustrację tego, kiedy dane są porządkowane fizycznie przez konkretną kolumnę, ale zdecydowanie nie jest to wskazane, że w każdym zapytaniu będzie zwracane poprawnie.Mea culpa. 14 wrz. 112011-09-14 20:27:39

+4

Nie ma znaczenia, jaki jest indeks klastrowy.SQL Server może nadal zwracać zamówienie na podstawie innego indeksu opartego na wielu różnych czynnikach.Utworzenie klucza podstawowego w jakiejś kolumnie *** NIE *** nie gwarantuje, że wybór bez zamówienia będzie nagle wracał uporządkowany według tej kolumny zawsze.Czy możesz to zauważyć przez większość czasu?Pewnie.Ale to nie to samo, co gwarancja.Nigdy nie widziałem niedźwiedzia polarnego na mojej ulicy, ale nie ma pola siłowego dla niedźwiedzi polarnych, które by temu zapobiec. 14 wrz. 112011-09-14 20:41:09

+3

W każdym razie chodziło mi o to, że dodanie klauzuli „ORDER BY” jest znacznie lepszą gwarancją (nieważne o wiele mniej destrukcyjną) niż wprowadzanie zmian w schemacie do tabeli i * mając nadzieję, że zamawianie będzie zgodne z oczekiwaniami na zawsze. 14 wrz. 112011-09-14 20:42:25


10

Aby poszerzyć inne odpowiedzi: tabela jest z definicji nieuporządkowanym zestawem wierszy.Jeśli nie określiszORDER BYklauzula SQL Server może zwrócić wiersze w dowolnej kolejności, którą uzna za najbardziej efektywną.Często zdarza się, że pokrywa się to z kolejnością wstawiania, ponieważ większość tabel ma indeks skupiony na tożsamości, datetime lub innych monotonicznie rosnących kolumnach, ale powinieneś 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 zapytania, zmianami w klauzulach join lub where 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, wiem, że znasz już odpowiedź, ale nie można powiedzieć wystarczająco dużo:

Jeśli chcesz polegać na kolejności zapytań,ZAWSZEDodajORDER BY.

  0

Nie planowałem w zależności od zamówienia, ale wizualnie jest trochę irytujące, że moje ostatnio włożone przedmioty są nagle na górze. 14 wrz. 112011-09-14 20:18:15

  0

Przypuszczam, że to dlatego, że używasz Open Table.W Management Studio 2008 polecenie to zostało podzielone na „Edytuj najlepsze n wierszy” i „Wybierz N najlepszych wierszy” - po wybraniu tego ostatniego możesz edytować wynikowe zapytanie, np. Usunąć górę i dodać zamówienie według. 14 wrz. 112011-09-14 20:21:07

  0

It's Management studio 2008, serwer 2005, powinien być bardziej przejrzysty.Nie wiedziałem, że istnieje polecenie „open table”, zawsze korzystałem ze statystyk „select” 14 wrz. 112011-09-14 20:36:30

+4

Ok, cóż, nadal pozostaje, rozumiem, że denerwujące jest to, że dane wracają w kolejności, której się nie spodziewasz, ale mam nadzieję, że teraz jest jasne, dlaczego SQL Server tak naprawdę nie dba o to, jakiej kolejności oczekujesz *, chyba że * powiesz, że zależy ci na dodaniu klauzuli zamówienia.:-) 14 wrz. 112011-09-14 20:37:35