Saya akan menduga bahwa ketika sebuah kueri menyertakan TOP dan mesin database akan menjalankan kueri mengabaikan klausa TOP, dan kemudian pada akhirnya hanya mengecilkan hasil yang ditetapkan ke n jumlah baris yang diminta. Rencana eksekusi grafis tampaknya mengindikasikan hal ini - TOP adalah langkah "terakhir". Tetapi tampaknya ada lebih banyak hal yang terjadi.
Cara di atas diungkapkan membuat saya berpikir Anda mungkin memiliki gambaran mental yang salah tentang bagaimana sebuah query dieksekusi. Operator dalam rencana kueri bukan langkah (di mana set hasil lengkap dari langkah sebelumnya dievaluasi oleh yang berikutnya.
SQL Server menggunakan model eksekusi pipelined , di mana setiap operator memperlihatkan metode seperti Init () , GetRow () , dan Close () . Seperti yang ditunjukkan oleh nama GetRow () , operator menghasilkan satu baris pada saat dibutuhkan (seperti yang disyaratkan oleh operator induknya). Ini didokumentasikan dalam referensi Buku Logistik Online dan Operator Fisik , dengan lebih detail di posting blog saya Mengapa Rencana Kueri Jalankan Mundur . Model baris per waktu ini sangat penting dalam membentuk intuisi suara untuk eksekusi permintaan.
Pertanyaan saya adalah, bagaimana (dan mengapa) sebuah TOP
klausa berdampak pada rencana eksekusi permintaan?
Beberapa operasi logis seperti TOP
, semi gabung dan FAST n
petunjuk kueri memengaruhi cara pengoptimal biaya menentukan alternatif rencana eksekusi. Ide dasarnya adalah bahwa satu bentuk rencana yang mungkin dapat mengembalikan n baris pertama lebih cepat daripada rencana lain yang dioptimalkan untuk mengembalikan semua baris.
Misalnya, loop bersarang yang diindeks bergabung seringkali merupakan cara tercepat untuk mengembalikan sejumlah kecil baris, meskipun hash atau gabungan penggabungan dengan pemindaian mungkin lebih efisien pada set yang lebih besar. Cara pengoptimal kueri alasan tentang pilihan-pilihan ini adalah dengan menetapkan Tujuan Baris pada titik tertentu di pohon logis operasi.
Sasaran baris memodifikasi cara alternatif rencana kueri dihitung biayanya. Inti dari itu adalah bahwa pengoptimal dimulai dengan menghitung biaya setiap operator seolah-olah set hasil penuh diperlukan, menetapkan tujuan baris pada titik yang sesuai, dan kemudian bekerja kembali ke pohon rencana memperkirakan jumlah baris yang diharapkan perlu untuk memeriksa untuk memenuhi tujuan baris.
Misalnya, logis TOP(10)
menetapkan sasaran baris 10 pada titik tertentu di pohon kueri logis. Biaya operator yang mengarah ke sasaran baris dimodifikasi untuk memperkirakan berapa banyak baris yang harus mereka hasilkan untuk memenuhi sasaran baris. Perhitungan ini bisa menjadi rumit, sehingga lebih mudah untuk memahami semua ini dengan contoh yang berfungsi penuh dan rencana eksekusi beranotasi. Sasaran baris dapat memengaruhi lebih dari pilihan jenis gabungan atau apakah pencarian dan pencarian lebih disukai daripada pemindaian. Lebih detail tentang itu di sini .
Seperti biasa, rencana eksekusi yang dipilih berdasarkan sasaran baris tunduk pada kemampuan penalaran pengoptimal dan kualitas informasi yang diberikan kepadanya. Tidak setiap rencana dengan sasaran baris akan menghasilkan jumlah baris yang diperlukan lebih cepat dalam praktiknya, tetapi menurut model penetapan biaya akan melakukannya.
Jika rencana sasaran baris terbukti tidak lebih cepat, biasanya ada cara untuk mengubah kueri atau memberikan informasi yang lebih baik kepada pengoptimal sehingga rencana yang dipilih secara alami adalah yang terbaik. Pilihan mana yang sesuai dalam kasus Anda tergantung pada rinciannya. Fitur tujuan baris umumnya sangat efektif (meskipun ada bug yang harus diperhatikan ketika digunakan dalam rencana eksekusi paralel).
Permintaan dan rencana khusus Anda mungkin tidak cocok untuk analisis terperinci di sini (dengan segala cara sediakan rencana eksekusi aktual jika Anda mau), tetapi mudah-mudahan gagasan yang diuraikan di sini akan memungkinkan Anda untuk membuat kemajuan ke depan.
ORDER BY
klausa. MenambahkanTOP
perubahan di mana dalam rencana semacam ini terjadi, tapi saya lebih khawatir tentang bagaimana hal itu mempengaruhi jumlah eksekusi indeks yang dicari terhadap tabel B ... (tentu saja keduanya mungkin terkait - saya tidak tahu)