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 BY
klausa 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?
Jawaban:
Dari Wikipedia :
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 BY
klausa, jika pesanan penting.sumber
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.
sumber