Jawabannya, seperti biasa (baik-baik saja, sebagian besar waktu), terletak pada rencana eksekusi.
Ada operator tertentu yang meminta semua baris untuk sampai pada mereka sebelum mereka dapat mulai memproses baris tersebut, dan meneruskannya ke hilir, misalnya:
- Hash Join (untuk membuat tabel hash)
- Pertandingan Hash
- Sortir (Kecuali Perbedaan Aliran Hash)
Mereka disebut memblokir, atau menghentikan dan pergi karena itu, dan mereka sering dipilih ketika pengoptimal berpikir itu harus memproses banyak data untuk menemukan data Anda.
Ada operator lain yang dapat mulai streaming, atau melewati setiap baris yang ditemukan dengan segera
- Loop bersarang
- Indeks mendukung Gabung Bergabung
- Agregat Aliran
Ketika kueri mulai mengembalikan data dengan segera, tetapi tidak menyelesaikannya dengan segera, biasanya itu merupakan tanda bahwa pengoptimal memilih rencana untuk menemukan dan mengembalikan beberapa baris dengan cepat menggunakan operator yang memiliki biaya awal yang lebih rendah.
Ini dapat terjadi karena sasaran baris yang diperkenalkan oleh Anda, atau oleh pengoptimal.
Ini juga dapat terjadi jika rencana buruk dipilih karena beberapa alasan (kurangnya SARGability, parameter sniffing, statistik tidak mencukupi, dll.), Tetapi itu membutuhkan lebih banyak penggalian untuk mencari tahu.
Untuk informasi lebih lanjut, lihat blog Rob Farley di sini
Dan seri Paul White tentang tujuan baris di sini , di sini , di sini , dan di sini .
Perlu juga dicatat bahwa, jika Anda berbicara tentang SSMS, baris hanya muncul setelah seluruh buffer telah diisi, bukan hanya mau tak mau.
WHERE t.x IN (<complex SELECT subquery>)
KIRILEFT JOIN (<complex SELECT subquery>) AS r ON r.x = t.x .... WHERE r.x IS NULL
KIRIM yang setara ,, maka subquery juga akan dievaluasi, juga (jadi rencana kompleks yang sama dengan NOT Dalam versi).NOT EXISTS
tetapi OracleNOT IN
dalam kueri. Tapi hari ini itu harus dianggap sebagai kesalahan dalam generator rencana