Apakah DB2 memesan data dengan kunci utama

8

Saya baru-baru ini berdiskusi dengan seorang kolega yang berusaha untuk menghapus pesanan dengan klausa dari permintaan produksi karena pesanan dengan kolom sama dengan kunci utama .

Setelah diskusi panjang di mana saya mencoba menjelaskan bahwa dia tidak dapat menjamin pemesanan berdasarkan kunci utama kesimpulan akhir adalah bahwa dia tidak akan mendorong permintaan MSSQL untuk diubah.
Tapi dia masih akan mengubah permintaan DB2.

Saya tidak bisa segera menemukan artikel yang membuktikan bahwa DB2 memesan dengan kunci utama, dan saat ini saya bertanya-tanya apakah itu benar atau tidak.

Jadi pertanyaan saya adalah, bagaimana cara memesan permintaan jika tidak ada pesanan dengan klausa DB2? Apakah menggunakan kunci utama?
Bagaimana Anda bisa menjamin data keluar dipesan dengan benar, tanpa pesanan dengan klausa, dalam sistem paralel?

Reaces
sumber

Jawaban:

18

Tidak, kolega Anda salah.

Semua proroduct SQL - DBMS yang berperilaku sesuai dengan standar SQL - tidak memberikan jaminan bahwa hasil output kueri akan dipesan dengan cara apa pun, kecuali ada ORDER BYklausa dalam kueri .

Seperti yang disebutkan oleh IBM DB2 docs :

Pemesanan dilakukan sesuai dengan aturan perbandingan yang dijelaskan dalam elemen Bahasa. Nilai nol lebih tinggi dari semua nilai lainnya. Jika spesifikasi pemesanan Anda tidak menentukan pemesanan lengkap, baris dengan nilai duplikat dari kunci sortir yang diidentifikasi memiliki perintah arbitrer. Jika Anda tidak menentukan ORDER BY, baris dari tabel hasil memiliki perintah acak.

ypercubeᵀᴹ
sumber
"Jika mereka berperilaku dengan standar SQL" adalah besar jika ... IBM docs FTW.
WernerCD
@WernerCD Tidak ada DBMS yang memenuhi 100% standar (dan ada banyak versi). Tetapi mereka mengklaim mematuhi banyak bagian. Saya berharap setidaknya ada perbedaan, didokumentasikan.
ypercubeᵀᴹ
Ya, itu sebabnya saya memberi +1 untuk dokumen IBM di atas "Standar". "Diharapkan" vs "Aktual" bisa, dan pasti akan, menggigitmu di tombol.
WernerCD
11

Seperti yang ditunjukkan dalam jawaban ypercube, ketika tidak ada ORDER BYklausa, tidak ada urutan yang ditentukan .

Apa yang ingin saya tambahkan adalah bahwa penting untuk menyadari bahwa SQL sangat abstraksi, itu tidak menentukan langkah demi langkah apa yang harus dilakukan DBMS tetapi lebih menentukan persyaratan Anda dari hasil akhir.

Ini menyiratkan bahwa jika data sudah dicari dengan cara yang memastikan urutan yang benar, ini karena DBMS memutuskan strategi seperti itu dan kemudian akan tahu bahwa tidak ada pekerjaan penyortiran tambahan yang diperlukan untuk memenuhi persyaratan ORDER BYklausa. .

Di sisi lain, jika Anda tidak menentukan bahwa pesanan itu penting bagi Anda (meskipun sebenarnya?), DBMS akan mempertimbangkan ini dan jika ia menemukan strategi berbeda yang lebih efisien untuk menemukan data yang tepat di beberapa pesanan lain akan memanfaatkan fakta bahwa Anda tampaknya tidak peduli dengan pesanan. (Strategi yang dipilih bisa sangat berubah dari waktu ke waktu juga, berdasarkan peningkatan jumlah data dalam tabel yang relevan, tambalan perangkat lunak, dll.)

Yaitu, menghapus ORDER BYklausa memiliki sangat sedikit terbalik (ukuran permintaan sedikit lebih kecil) tetapi berpotensi downside besar jika pesanan sebenarnya penting. Terutama, karena ini bisa sangat baik bekerja dengan dataset uji dan melewati pengujian penerimaan hanya untuk menyebabkan masalah serius di telepon.

Håkan Lindqvist
sumber
1
Alasan dia memberi pada lembar penempatannya adalah bahwa "Memesan dengan mengambil sumber daya CPU, sedangkan pesanan sudah tersirat oleh kunci utama". Yang kedengarannya sangat salah bagi saya (sebagaimana dibuktikan oleh jawaban sejauh ini)
Reaces
@Reaces apakah DB2 menggunakan tabel 'heap' secara default atau lebih seperti SQL Server dengan indeks berkerumun? Itu tidak mengubah jawaban, tetapi mungkin membuatnya lebih mudah untuk membuktikan :)
Jack mengatakan coba topanswers.xyz
@ Jack Douglas, pengelompokan dalam SQL Server dan DB2 adalah konsep yang berbeda. Saya belajar banyak tentang pengelompokan dalam SQL server di utas ini: groups.google.com/d/msg/comp.databases.ms-sqlserver/P7Wcs4NcF4s/… . Saya kenal dengan SQL server tetapi tidak dengan DB2 Anda mungkin ingin melihatnya.
Lennart
@Reaces tabel dalam DB2 biasanya "berkerumun" pada kunci utama secara default, kecuali indeks pengelompokan ditentukan.
Chris Aldrich
1
@ChrisAldrich - pernyataan ini hanya berlaku untuk DB2 pada z / OS.
mustaccio