Tampilan awal pada rencana eksekusi menunjukkan bahwa ekspresi 1/0
didefinisikan dalam operator Compute Scalar:
Sekarang, meskipun rencana eksekusi mulai dijalankan di paling kiri, iteratif memanggil Open
dan GetRow
metode pada iterator anak untuk mengembalikan hasil, SQL Server 2005 dan kemudian berisi optimasi di mana ekspresi sering hanya didefinisikan oleh Compute Scalar, dengan evaluasi ditunda hingga berikutnya operasi membutuhkan hasilnya :
Dalam kasus ini, hasil ekspresi hanya diperlukan ketika merakit baris untuk kembali ke klien (yang dapat Anda pikirkan terjadi pada SELECT
ikon hijau ). Dengan logika itu, evaluasi yang ditunda akan berarti ekspresi tidak pernah dievaluasi karena tidak ada rencana yang menghasilkan baris kembali. Untuk sedikit mengusahakan poin, baik Indeks Clustered Seek maupun Table Scan tidak mengembalikan baris, jadi tidak ada baris untuk berkumpul untuk kembali ke klien.
Namun, ada optimasi terpisah di mana beberapa ekspresi dapat diidentifikasi sebagai konstanta runtime dan dievaluasi sekali sebelum eksekusi permintaan dimulai . Dalam hal ini, indikasi yang telah terjadi ini dapat ditemukan di showplan XML (rencana Pencarian Indeks Berkelompok di sebelah kiri, rencana Pemindaian Tabel di sebelah kanan):
Saya menulis lebih banyak tentang mekanisme yang mendasari dan bagaimana mereka dapat mempengaruhi kinerja dalam posting blog ini . Dengan menggunakan informasi yang disediakan di sana, kami dapat memodifikasi kueri pertama sehingga kedua ekspresi dievaluasi dan di-cache sebelum eksekusi dimulai:
select 1/0 * CONVERT(integer, @@DBTS)
from #temp
where id = 1
select 1/0
from #temp2
where id = 1
Sekarang, paket pertama juga berisi referensi ekspresi konstan, dan kedua kueri menghasilkan pesan kesalahan. XML untuk kueri pertama berisi:
Informasi lebih lanjut: Hitung Skalar, Ekspresi, dan Kinerja
Paul White mengatakan GoFundMonica
sumber