Saya pikir saya mungkin memiliki penjelasan parsial untuk ini, tetapi jangan ragu untuk menembaknya atau memposting alternatif lain. @MartinSmith jelas melakukan sesuatu dengan menyoroti efek TOP dalam rencana eksekusi.
Sederhananya, 'Hitungan Baris Aktual' bukan hitungan dari baris yang diproses oleh operator, ini adalah berapa kali metode GetNext () dari operator dipanggil.
Diambil dari BOL :
Operator fisik menginisialisasi, mengumpulkan data, dan menutup. Secara khusus, operator fisik dapat menjawab tiga panggilan metode berikut:
- Init (): Metode Init () menyebabkan operator fisik menginisialisasi sendiri dan mengatur struktur data yang diperlukan. Operator fisik dapat menerima banyak panggilan Init (), meskipun biasanya operator fisik hanya menerima satu.
- GetNext (): Metode GetNext () menyebabkan operator fisik mendapatkan baris data pertama atau berikutnya. Operator fisik dapat menerima nol atau banyak panggilan GetNext ().
- Close (): Metode Close () menyebabkan operator fisik melakukan beberapa operasi pembersihan dan mematikannya sendiri. Operator fisik hanya menerima satu panggilan Tutup ().
Metode GetNext () mengembalikan satu baris data, dan berapa kali itu disebut muncul sebagai ActualRows dalam output Showplan yang dihasilkan dengan menggunakan SET STATISTIK PROFILI HIDUP atau SET STATISTIK XML ON.
Demi kelengkapan, sedikit latar belakang pada operator paralel berguna. Pekerjaan didistribusikan ke beberapa aliran dalam rencana paralel oleh aliran partisi ulang atau mendistribusikan operator aliran. Ini mendistribusikan baris atau halaman antara utas menggunakan salah satu dari empat mekanisme:
- Hash mendistribusikan baris berdasarkan hash dari kolom di baris
- Round-robin mendistribusikan baris dengan mengulangi daftar utas dalam satu lingkaran
- Siaran mendistribusikan semua halaman atau baris ke semua utas
- Partisi permintaan hanya digunakan untuk pemindaian. Utas berputar, meminta halaman data dari operator, memprosesnya dan meminta halaman lebih lanjut ketika selesai.
Operator aliran terdistribusi pertama (paling kanan dalam rencana) menggunakan partisi permintaan pada baris yang berasal dari pemindaian konstan. Ada tiga utas yang memanggil GetNext () 6, 4 dan 0 kali dengan total 10 'Baris Aktual':
<RunTimeInformation>
<RunTimeCountersPerThread Thread="2" ActualRows="6" ActualEndOfScans="1" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="1" ActualRows="4" ActualEndOfScans="1" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
</RunTimeInformation>
Di operator distribusi berikutnya kami memiliki tiga utas lagi, kali ini dengan 50, 50 dan 0 panggilan ke GetNext () dengan total 100:
<RunTimeInformation>
<RunTimeCountersPerThread Thread="2" ActualRows="50" ActualEndOfScans="1" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="1" ActualRows="50" ActualEndOfScans="1" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
</RunTimeInformation>
Ini di operator paralel berikutnya yang kemungkinan penyebab dan penjelasannya muncul.
<RunTimeInformation>
<RunTimeCountersPerThread Thread="2" ActualRows="1" ActualEndOfScans="0" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="1" ActualRows="10" ActualEndOfScans="0" ActualExecutions="1" />
<RunTimeCountersPerThread Thread="0" ActualRows="0" ActualEndOfScans="0" ActualExecutions="0" />
</RunTimeInformation>
Jadi kami sekarang memiliki 11 panggilan ke GetNext (), di mana kami mengharapkan untuk melihat 10.
Edit: 2011-11-13
Terjebak pada titik ini, saya pergi mencari jawaban dengan bab-bab dalam indeks berkerumun dan @MikeWalsh dengan ramah mengarahkan @SQLKiwi di sini .