Setiap kali saya secara manual memasukkan baris ke tabel di SQL Server Management Studio 2008 (database SQL Server 2005) baris baru saya muncul di TOP daftar daripada di bagian bawah. Saya menggunakan kolom identitas dan ini menghasilkan hal-hal seperti
id row
42 first row
1 second row
2 third row
Ketika baris diambil dan tidak dipesan secara eksplisit. Ini menghasilkan tampilan yang berbeda ketika baris diambil untuk aplikasi web dan mengubah apa yang TOP 1
dikembalikan permintaan.
Saya tahu saya bisa order by
, tetapi mengapa ini terjadi? Sebagian besar data saya dimasukkan melalui aplikasi web, semua sisipan dari aplikasi ini menghasilkan pemesanan First In First Out, mis. Insert terbaru ada di bagian bawah, sehingga id semua dalam satu baris. Apakah ada pengaturan di server atau Management Studio yang menyebabkan pemesanan yang tidak tepat ini?
sumber
Jawaban:
Di dunia SQL, pesanan bukan properti yang melekat dari set data. Dengan demikian, Anda tidak mendapatkan jaminan dari RDBMS Anda bahwa data Anda akan kembali dalam urutan tertentu - atau bahkan dalam urutan yang konsisten - kecuali jika Anda meminta data Anda dengan
ORDER BY
klausa.Dari Craig Freedman :
Selalu gunakan
ORDER BY
jika Anda mengharapkan pesanan yang didefinisikan dengan baik dan konsisten dalam rangkaian hasil Anda. Jangan pernah mengandalkan bagaimana database Anda dapat menyimpan baris pada disk (misalnya melalui indeks berkerumun) untuk menjamin pemesanan data tertentu dalam permintaan Anda.sumber
Hanya untuk menambah jawaban lainnya: sebuah tabel, menurut definisi, adalah satu set baris yang tidak teratur. Jika Anda tidak menentukan
ORDER BY
klausa, SQL Server bebas untuk mengembalikan baris dalam urutan apa pun yang dianggap paling efisien. Ini sering terjadi bersamaan dengan urutan penyisipan, karena sebagian besar tabel memiliki indeks berkerumun pada identitas, datetime atau kolom yang meningkat secara monoton, tetapi Anda harus memperlakukannya persis seperti itu: kebetulan. Itu dapat berubah dengan data baru, pembaruan statistik, tanda jejak, perubahan ke maxdop, petunjuk kueri, perubahan pada bergabung atau di mana klausa dalam kueri, perubahan ke pengoptimal karena paket layanan / pembaruan kumulatif / perbaikan terbaru / peningkatan, memindahkan database ke server lain, dll. dll.Dengan kata lain, dan saya tahu Anda sudah tahu jawabannya, tetapi tidak cukup untuk menyatakan:
sumber
select
statmentsItu karena tabel adalah tabel tumpukan (kemungkinan besar) dan tidak diindeks. Membuat ID kolom
PRIMARY KEY
sertaIDENTITY
. SQL Server secara fisik menyimpan data berdasarkan indeks - misalnya, jika id adalah indeks berkerumun (seperti kunci utama) data akan secara fisik disimpan dalam urutan id dan akan dikembalikan seperti itu dalam permintaan bahkan tanpa sebuahORDER BY
klausa. Kalau tidak, pemesanan baris tidak penting untuk database sama sekali. Akibatnya, memiliki aplikasi bergantung pada urutan baris dalam basis data (dan juga tergantung pada kolom dalam urutan tertentu) bukan praktik yang baik. Aplikasi perlu bekerja dengan kunci apa pun yang ada dalam database untuk mengidentifikasi baris.sumber
order by
(ini adalah aplikasi bawaan dengan banyak praktik buruk) tetapi saya bertanya-tanya mengapa hal itu terjadi.SELECT *
tanpaORDER BY
mungkin kembali dalam urutan "benar" (tetapi masih belum dijamin)?ORDER BY
klausa adalah jaminan yang jauh lebih baik (apalagi mengganggu) daripada membuat skema perubahan ke tabel dan berharap bahwa pemesanan akan seperti yang Anda harapkan, selamanya.