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?
Odpowiedzi:
Z Wikipedii :
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 BY
klauzulę, jeśli kolejność jest ważna.źródło
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ć.
źródło