Bagaimana SQL Server mengetahui urutan catatan di set hasil eksekusi kueri?
Saya mencoba membuat kepala atau ekor tetapi menemukan diri saya menggaruk-garuk kepala. Ketika saya mengubah bidang saya memilih urutan juga berubah. Ketika saya menjalankan SQL di bawah ini dengan SELECT *
saya mendapatkan catatan yang sama tetapi dalam urutan yang jauh berbeda.
SELECT TOP (900)
AD.ATTACHMENTID,
AD.NAME,
AD.ISINLINE,
AD.INSERTEDDATETIME,
ATMT.ATTACHMENTBLOB,
U.UFID
FROM ATTACHMENTDETAIL AD WITH (NOLOCK)
INNER JOIN MESSAGEATTACHMENT MA ON MA.ATTACHMENTID = AD.ATTACHMENTID
INNER JOIN ATTACHMENT ATMT ON ATMT.ATTACHMENTID = AD.ATTACHMENTID
INNER JOIN MESSAGE MSG ON MSG.ID = MA.MESSAGEID
INNER JOIN MESSAGEDETAIL MD ON MD.MESSAGEID = MA.MESSAGEID
INNER JOIN [USER] U ON U.ID = MD.USERID
LEFT OUTER JOIN XmlExtractionMapping XM ON MA.MESSAGEID = XM.MessageId
WHERE AD.FILEBOXTOKEN IS NULL
AND (XM.XMLEXTRACTIONDATE IS NOT NULL OR
(MSG.MESSAGESOURCEID = 1 AND MD.FolderId <> -4))
AND AD.ISINLINE = 'FALSE'
sql-server
order-by
kacalapy
sumber
sumber
NOLOCK
- Anda akan melihat segala macam alasan mengapa Anda tidak boleh menggunakannya. Untuk yang terakhir, lihat sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/...ORDER BY
klausa, SQL Server (dan RDBMS lainnya) melakukan apa pun rasanya .Jawaban:
Karena Anda belum memberi tahu SQL Server cara memesan hasil, itu bebas untuk melakukannya dalam apa pun yang paling efisien. Dengan cara ini akan tergantung pada apa yang termurah untuk disortir, dan kolom yang Anda pilih akan mengarahkannya karena pada gilirannya tergantung pada indeks termurah yang digunakan untuk mendapatkan informasi yang diminta oleh kueri. Ini dapat berubah dari eksekusi ke eksekusi tidak hanya dengan mengubah teks kueri tetapi juga oleh hal-hal seperti perubahan data, pembaruan statistik, freeproccache, paket layanan, perbaikan terbaru, dll. Ini sangat mudah berubah dengan begitu banyak tabel yang terlibat jika data yang mendasarinya berubah dengan cepat , seperti yang cenderung dilakukan dalam aplikasi OLTP.
Jika Anda ingin pesanan yang dapat diprediksi, mengapa Anda tidak menggunakan
ORDER BY
permintaan itu? Seperti ditulis, menspesifikasikan SQL yang setiap 900 baris dapat diterima, dalam urutan apapun.Meskipun, dalam banyak kasus, Anda melihat urutan yang sama berulang kali untuk permintaan yang sama, tidak ada jaminan kecuali jika Anda mengatakannya
ORDER BY <something>
.sumber