Dalam urutan apa baris diambil tidak ada ORDER BY klausa?

11

Satu programmer sedang menguji dan membandingkan aplikasi yang sama yang menggunakan struktur database yang sama, dan data yang sama, hanya dalam dua database terpisah, satu dengan Oracle 8 dan satu dengan Oracle 9.

Aplikasi menjalankan kueri tanpa ORDER BY klausa.

Dia mengklaim bahwa permintaan ORDER-BY-less harus mengembalikan baris dalam urutan yang sama di kedua database.

Saya katakan kepadanya bahwa tidak ada jaminan untuk urutan baris yang sama kecuali Anda secara eksplisit memberikan klausa ORDER BY.

Basis data memiliki indeks dan kunci yang sama. Tetapi rencana menjelaskan menunjukkan bahwa di salah satu database mesin menggunakan kunci dari salah satu tabel yang digabungkan sedangkan di database lain itu menggunakan yang lain.

Dia menyatakan bahwa kedua lingkungan DB tidak sama, yang karena mereka memiliki statistik yang berbeda, mesin rdbms yang berbeda, dll, tetapi bukan karena saya gagal mereplikasi setiap indeks yang dimiliki database asli.

Saya mengatakan kepadanya bahwa dia harus jelas memberikan ORDER BYklausa jika urutannya benar-benar penting.

Pertanyaan

Jadi saya bisa menjelaskannya dengan lebih baik:

Dalam urutan apa kueri mengambil baris ketika Anda tidak menjelaskan menyediakan klausa ORDER BY, dan mengapa kueri itu tidak mengembalikan baris dalam urutan yang sama?

Tulains Córdova
sumber
3
Itu tidak terdefinisi. Saya tidak percaya bahwa spesifikasi SQL menyatakan urutan spesifik bahwa catatan harus dikembalikan, jadi itu akan tergantung pada implementasi.
Robert Harvey
1
@RobertHarvey. Itulah sebabnya saya memberitahunya. Bahkan: menurut definisi, tabel relasional tidak boleh memiliki urutan tertentu.
Tulains Córdova
1
Mungkin masuk akal bahkan pada versi perangkat lunak yang sama persis untuk menggunakan indeks yang berbeda karena mungkin lebih selektif berdasarkan statistik indeks yang telah dikumpulkan untuk data yang tepat dalam database itu. Jadi Anda benar - benar tidak bisa mengandalkan pesanan jika Anda tidak menentukannya.
psr
Anda dapat secara realistis mengharapkan permintaan pertama dengan kolom yang tidak terindeks untuk mengikuti pesanan "masukkan waktu"; oleh "waktu pembaruan" yang diindeks. Permintaan berturut-turut mungkin "ternoda" oleh hasil yang di-cache dan jadi cukup acak; namun tidak pernah bergantung padanya - ini dapat berubah dari versi ke versi, dengan parameter, dengan memperbarui operasi dan oleh cuaca buruk di bulan purnama. "Tidak terdefinisi" adalah jawaban yang benar, dan yang lainnya hanya menebak-nebak informasi.
SF.
1
Set hasil dikembalikan oleh RDMBS-es hanya itu: set , yang menurut definisi tidak memiliki urutan tertentu. Jadi RDBMS dapat mengembalikannya dalam urutan apa pun yang diinginkan dan mengubah urutan lagi pada eksekusi kueri berikutnya. Mengandalkan perintah tertentu tanpa klausa ORDER BY akan menjadi kesalahan. Saya selalu mencoba menjelaskan hal ini kepada rekan kerja saya, tetapi saya hanya berhasil separuh waktu: D.
Radu Murzea

Jawaban:

25

Dari Wikipedia :

Klausa ORDER BY mengidentifikasi kolom mana yang digunakan untuk mengurutkan data yang dihasilkan, dan ke arah mana mereka harus diurutkan (opsi naik atau turun). Tanpa klausa ORDER BY, urutan baris yang dikembalikan oleh query SQL tidak ditentukan.

Jadi itu tidak terdefinisi.

Spesifikasi SQL tidak menyatakan urutan spesifik bahwa catatan harus dikembalikan, jadi itu akan tergantung pada implementasi.

Tanpa indeks di atas meja, urutan yang masuk akal akan menjadi urutan di mana catatan dimasukkan. Dengan Kunci Utama ditentukan, urutan yang masuk akal akan menjadi urutan Kunci Utama. Tetapi karena spesifikasi ANSI tidak memerlukan pesanan khusus, terserah vendor, dan kepekaan mereka mungkin berbeda dari milik Anda atau milik saya.

Karena pesanan tidak dinyatakan dalam spesifikasi, tidak bijaksana untuk mengandalkan perilaku implementasi vendor tertentu, karena dapat bervariasi dari satu vendor ke vendor lainnya, dan vendor dapat mengubah pesanan kapan saja mereka inginkan, tanpa peringatan.

Seperti yang Anda katakan, cukup sertakan ORDER BYklausa, jika pesanan penting.

Robert Harvey
sumber
Kueri memiliki beberapa tabel bergabung. Jadi satu mesin DB mengurutkan resultset dengan satu kriteria dan DB lainnya menggunakan kriteria lain. Obvioulsy, ketika klausa ORDER BY disediakan, kedua kueri mengembalikan baris dalam urutan yang ditentukan.
Tulains Córdova
+1 AFAICR, urutan bahkan diizinkan untuk bervariasi setiap kali Anda menjalankan kueri yang diberikan pada contoh basis data tertentu.
MarkJ
2
Saya akan mengatakan bahwa, tanpa klausa ORDER BY, satu-satunya urutan hasil yang masuk akal adalah apa pun yang menciptakan overhead paling sedikit. Untuk mesin dan permintaan penyimpanan DB sederhana, itu akan sering berupa urutan penyisipan (dan untuk kunci primer yang dihasilkan sama dengan urutan kunci primer). Tapi begitu Anda memiliki hash bergabung di sana, saya berharap urutannya pada dasarnya acak.
Michael Borgwardt
2

Jelas menunjukkan bahwa spesifikasi tidak mengatakan urutan data apa yang masuk, tidak berfungsi. Mungkin karena dia tahu data ada di disk atau di memori di suatu tempat dan dengan demikian memilikinya sebagai perintah. Tanyakan padanya apa urutan data yang dihitung dari beberapa tabel. Yaitu membuat contoh di mana Anda bergabung dengan 4 tabel, melakukan perhitungan pada 2 dari mereka dan mengembalikan hanya nilai yang dihitung.

Mesin mengembalikan data dalam urutan yang ditemukannya (tidak ada pesanan oleh), tetapi bagaimana menemukannya tergantung pada faktor-faktor yang dapat berubah - indeks, statistik, cache. Secara umum data akan berada dalam urutan yang konsisten - tetapi jika Anda bergantung pada urutannya, Anda harus memintanya.

jmoreno
sumber