Saya punya pertanyaan seperti ini:
SELECT col1
FROM MyTable
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Ini memberikan tooltip pada rencana eksekusi yang mirip dengan ini:
Apakah dateadd
bagian dari predikat pencarian dieksekusi untuk setiap baris dalam kueri? Atau apakah SQL Server menghitung nilai sekali untuk seluruh permintaan?
sumber
GETDATE()
.Rencana eksekusi itu bagus, tetapi kadang-kadang mereka tidak mengatakan yang sebenarnya kepada Anda. Jadi, inilah bukti berdasarkan tes kinerja.
(dan intinya - ekspresi tidak dievaluasi untuk setiap baris)
Ini adalah kueri OP dan butuh sekitar 12 detik untuk berjalan
Kueri ini yang menyimpan tanggal dalam parameter sebelum eksekusi, membutuhkan waktu yang hampir bersamaan, 12 detik.
Dan hanya untuk memverifikasi hasilnya -
Permintaan ini yang melakukan perhitungan pada col1 dan karena itu harus menghitung ulang ekspresi untuk setiap baris membutuhkan waktu sekitar 30 detik untuk dijalankan.
Semua kueri dieksekusi berulang kali menunjukkan tentang metrik yang sama
sumber