Sunting: +1 berfungsi dalam situasi ini karena ternyata itu FILE_NUMBER
adalah versi string nol-empuk bilangan bulat. Solusi yang lebih baik di sini untuk string adalah menambahkan ''
(string kosong), karena menambahkan nilai dapat mempengaruhi urutan, atau untuk angka untuk menambahkan sesuatu yang konstan tetapi berisi fungsi non-deterministik, seperti sign(rand()+1)
. Gagasan 'melanggar semacam itu' masih berlaku di sini, hanya saja metode saya tidak ideal.
+1
Tidak, maksudku aku tidak setuju dengan apa pun, maksudku itu sebagai solusi. Jika Anda mengubah kueri untuk ORDER BY cj.FILE_NUMBER + 1
maka TOP 1
akan berperilaku berbeda.
Anda lihat, dengan sasaran baris kecil di tempat untuk permintaan yang dipesan, sistem akan mencoba untuk mengkonsumsi data dalam rangka, untuk menghindari memiliki operator Urutkan. Ini juga akan menghindari membangun tabel hash, dengan memperkirakan bahwa mungkin tidak perlu melakukan terlalu banyak pekerjaan untuk menemukan baris pertama. Dalam kasus Anda, ini salah - dari ketebalan panah-panah itu, sepertinya ia harus mengkonsumsi banyak data untuk menemukan satu kecocokan.
Ketebalan panah-panah itu menunjukkan bahwa DOCUMENT_QUEUE
tabel (DQ) Anda jauh lebih kecil dari CORRESPONDENCE_JOURNAL
tabel (CJ) Anda. Dan bahwa rencana terbaik sebenarnya adalah memeriksa melalui baris DQ sampai baris CJ ditemukan. Memang, itulah yang akan dilakukan oleh Pengoptimal Kueri (QO) jika tidak ada sial ORDER BY
di sana, itu didukung oleh indeks penutup pada CJ.
Jadi, jika Anda menjatuhkan ORDER BY
sepenuhnya, saya berharap Anda akan mendapatkan rencana yang melibatkan Nested Loop, iterasi di atas baris di DQ, mencari ke CJ untuk memastikan baris ada. Dan dengan TOP 1
, ini akan berhenti setelah satu baris ditarik.
Tetapi jika Anda benar-benar membutuhkan baris pertama dalam FILE_NUMBER
urutan, maka Anda dapat menipu sistem untuk mengabaikan indeks yang tampaknya (salah) sangat membantu, dengan melakukan ORDER BY CJ.FILE_NUMBER+1
- yang kita tahu akan menjaga urutan yang sama seperti sebelumnya, tetapi yang penting QO tidak. QO akan fokus untuk menyelesaikan keseluruhan, sehingga operator Sort N Top dapat puas. Metode ini harus menghasilkan rencana yang berisi operator Compute Scalar untuk menghitung nilai pemesanan, dan operator Sort N Top untuk mendapatkan baris pertama. Tetapi di sebelah kanan ini, Anda harus melihat Nested Loop yang bagus, melakukan banyak hal di CJ. Dan kinerja yang lebih baik daripada berlari melalui tabel besar baris yang tidak cocok dengan apa pun di DQ.
Pertandingan Hash tidak selalu buruk, tetapi jika rangkaian baris yang Anda kembali dari DQ jauh lebih kecil dari CJ (seperti yang saya perkirakan), maka Pertandingan Hash akan memindai lebih banyak CJ dari yang dibutuhkan.
Catatan: Saya menggunakan +1 sebagai ganti +0 karena pengoptimal kueri cenderung mengenali bahwa +0 tidak mengubah apa pun. Tentu saja, hal yang sama mungkin berlaku untuk +1, jika tidak sekarang, maka di beberapa titik di masa mendatang.
DOCUMENT_ID
hubungan antara dua tabel (atau apakah setiap catatanCORRESPONDENCE_JOURNAL
memiliki catatan yang cocok diDOCUMENT_QUEUE
)?