Selain fungsi non-deterministik, masalah yang saya lihat adalah Anda melakukan perhitungan di lapangan. Ini (biasanya) membuat indeks apa pun di bidang tidak dapat digunakan oleh kueri.
Paragraf kedua dari tautan ini (Sepuluh Kesalahan Pemrograman SQL Umum (Fungsi pada kolom yang diindeks dalam predikat) ) memberikan info lebih detail tentang kapan hal ini terjadi, cara menghindarinya, dan bagaimana terkadang pengoptimal dapat menggunakan indeks meskipun menggunakan fungsi.
Singkatnya, alih-alih mengandalkan pengoptimal yang ditingkatkan, seringkali mungkin untuk mengubah kueri dengan menjaga bidang tetap utuh (tanpa melakukan perhitungan apa pun di atasnya), melainkan melakukan perhitungan (terbalik) ke nilai lainnya. Dalam kasus Anda hingga tanggal saat ini yang disediakan oleh GetDate()
. Kemudian kueri dapat menggunakan indeks bidang table1.Date
.
Jadi, Anda dapat menggunakan sesuatu seperti:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
BETWEEN
/* First Day of Current Month */
AND
/* Last Day of Current Month */
Dan Anda hanya perlu menemukan fungsi yang memberi Anda hari pertama dan terakhir bulan ini.
Posting blog ini dapat membantu Anda:sql-server-query-to-find-first-and-last-day-of-current-month/
Lebih baik lagi, pertanyaan/jawaban StackOverflow ini:cara-tersederhana-untuk-membuat-tanggal-itu-adalah-hari-pertama-bulan-diberikan -tanggal lain
Saya harus menguji tetapi saya pikir sedikit variasi di atas ini akan berhasil:
SELECT COUNT(*)
FROM table1
WHERE table1.Date
>= /* First Day of Current Month */
DATEADD(mm, DATEDIFF(mm, 0, GetDate() ), 0)
AND table1.Date
< /* First Day of Next Month */
DATEADD(mm, 1 + DATEDIFF(mm, 0, GetDate() ), 0)