W jakiej kolejności wiersze są pobierane nieobecne klauzula ORDER BY?

11

Jeden programista testuje i porównuje tę samą aplikację, która korzysta z tej samej struktury bazy danych i tych samych danych, tylko w dwóch oddzielnych bazach danych, jednej z Oracle 8 i jednej z Oracle 9.

Aplikacja uruchamia zapytanie bez ORDER BY klauzuli.

Twierdzi, że zapytanie ORDER-BY-less powinno zwrócić wiersze w tej samej kolejności w obu bazach danych.

Mówię mu, że nie ma gwarancji na to samo zamówienie rzędu, chyba że wyraźnie zastosujesz klauzulę ORDER BY.

Baza danych ma te same indeksy i klucze. Ale plan wyjaśniania pokazuje, że w jednej z baz danych silnik używa klucza jednej z połączonych tabel, podczas gdy w drugiej bazie danych używa innej.

Sugeruje, że dwa środowiska DB nie są sobie równe, ponieważ mają różne statystyki, różne silniki rdbms itp., Ale nie dlatego, że nie udało mi się zreplikować każdego indeksu, który ma oryginalna baza danych.

Mówię mu, że musi wyjaśnić ORDER BY, czy klauzula jest naprawdę ważna.

Pytanie

Więc mogę go lepiej wytłumaczyć:

W jakiej kolejności zapytanie pobiera wiersze, gdy nie jawnie zawiera klauzulę ORDER BY, i dlaczego to zapytanie nie zwraca wierszy w tej samej kolejności?

Tulains Córdova
źródło
3
Nie jest zdefiniowane. Nie wierzę, że specyfikacja SQL określa konkretną kolejność zwracania rekordów, więc będzie zależała od implementacji.
Robert Harvey,
1
@RobertHarvey Właśnie dlatego mu to mówię. W rzeczywistości: z definicji tabele relacyjne nie mogą mieć określonej kolejności.
Tulains Córdova,
1
Zastosowanie innego indeksu może mieć sens nawet w przypadku tej samej wersji oprogramowania, ponieważ może być bardziej selektywne w oparciu o statystyki indeksu zebrane dla dokładnych danych w tej bazie danych. Więc naprawdę nie możesz polegać na zamówieniu, jeśli go nie określisz.
psr
Możesz realistycznie oczekiwać, że pierwsze zapytanie według niezindeksowanej kolumny będzie zgodne z kolejnością „wstaw czas”; według zindeksowanego „czasu aktualizacji”. Kolejne żądania mogą być „skażone” wynikami z pamięci podręcznej, a więc dość losowe; niemniej jednak nigdy od tego nie zależy - może zmieniać się z wersji na wersję, według parametrów, operacji aktualizacji i złej pogody w pełni księżyca. „Niezdefiniowana” jest prawidłową odpowiedzią, a wszystko inne jest w najlepszym razie świadome domysły.
SF.
1
Zestawy wyników zwracane przez RDMBS-es są po prostu: zestawami , które z definicji nie mają określonej kolejności. Tak więc RDBMS może zwrócić je w dowolnej kolejności i ponownie zmienić kolejność przy następnym wykonaniu zapytania. Oparcie się na konkretnym zamówieniu bez klauzuli ORDER BY byłoby błędem. Zawsze staram się to wyjaśnić moim współpracownikom, ale udaje mi się to tylko przez połowę czasu: D.
Radu Murzea,

Odpowiedzi:

25

Z Wikipedii :

Klauzula ORDER BY określa, które kolumny są używane do sortowania danych wynikowych i w jakim kierunku powinny być sortowane (opcje rosnąco lub malejąco). Bez klauzuli ORDER BY kolejność wierszy zwróconych przez zapytanie SQL jest niezdefiniowana.

To jest niezdefiniowane.

Specyfikacja SQL nie określa konkretnej kolejności zwracania rekordów, więc będzie zależała od implementacji.

Bez indeksów w tabeli rozsądną kolejnością byłaby kolejność wstawiania rekordów. Przy zdefiniowanym kluczu podstawowym rozsądną kolejnością byłaby kolejność klucza podstawowego. Ale ponieważ specyfikacja ANSI nie wymaga konkretnego zamówienia, zależy to od dostawcy, a ich wrażliwość może różnić się od twojej lub mojej.

Ponieważ zamówienie nie jest określone w specyfikacji, nierozsądne jest poleganie na zachowaniu implementacji konkretnego dostawcy, ponieważ może się różnić od jednego dostawcy do drugiego, a dostawca może zmienić zamówienie w dowolnym momencie, bez ostrzeżenia.

Jak powiedziałeś, po prostu dołącz ORDER BYklauzulę, jeśli kolejność jest ważna.

Robert Harvey
źródło
Kwerenda ma kilka połączonych tabel. Tak więc jeden silnik DB sortuje zestaw wyników według jednego kryterium, a drugi DB używał innego kryterium. Oczywiście, gdy podano klauzulę ORDER BY, oba zapytania zwracają wiersze w określonej kolejności.
Tulains Córdova,
+1 AFAICR może nawet zmieniać się kolejność za każdym razem, gdy wykonasz dowolne zapytanie w określonej instancji bazy danych.
MarkJ
2
Powiedziałbym, że bez klauzuli ORDER BY jedynym rozsądnym porządkiem wyników jest to, co powoduje najmniejsze obciążenie. W przypadku prostych mechanizmów magazynowania DB i zapytań często będzie to kolejność wstawiania (a dla wygenerowanych kluczy podstawowych to samo, co kolejność kluczy podstawowych). Ale gdy tylko pojawi się skrót, spodziewam się, że kolejność będzie zasadniczo losowa.
Michael Borgwardt,
2

Oczywiście wskazanie, że specyfikacja nie określa kolejności danych, nie zadziałało. Prawdopodobnie dlatego, że wie, że dane są gdzieś na dysku lub w pamięci i dlatego ma to jako zamówienie. Zapytaj go, jaka jest kolejność obliczonych danych z kilku tabel. To znaczy stwórz przykład, w którym łączysz 4 tabele, wykonując obliczenia na 2 z nich i zwracając tylko obliczoną wartość.

Silnik zwraca dane w kolejności, w jakiej je znajduje (w przypadku braku kolejności), ale sposób ich znalezienia zależy od czynników, które mogą się zmienić - indeksu, statystyk, pamięci podręcznych. Zasadniczo dane będą w spójnej kolejności - ale jeśli zależysz od zamówienia, musisz o to poprosić.

jmoreno
źródło