Saya memiliki kueri yang menggunakan fungsi pada predikat, seperti ini:
commentType = 'EL'
AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0)
Saya memiliki indeks yang difilter pada commentType yang memiliki baris 40K dan ketika saya menjalankan kueri, perkiraan jumlah baris untuk Index Seek sangat akurat (sekitar 11K), tetapi untuk langkah berikutnya (operator sortir) itu benar-benar mengabaikan statistik dan hanya perkirakan jumlah total baris dalam indeks yang difilter.
Mengapa ini terjadi? Saya tahu dasar-dasar tentang sargability , dan saya telah menguji hanya demi kewarasan mengganti dateadd dengan tanggal aktual (2014-01-01) dan voila ... Semacam itu mulai menebak jumlah baris dengan benar ...
Mengapa ini terjadi dan bagaimana saya bisa memperbaikinya? Saya tidak bisa melewati tanggal yang pasti ...
DATEADD(month, -13, DATEADD(day, 1-DATEPART(day, SYSDATETIME()))
dan melihat apakah ada perbedaan?
(commentType, commentDate)
tidak difilter , apakah berperilaku lebih baik di sana? Hanya saja, indeks yang difilter terkadang dapat salah melaporkan perkiraan pada titik yang berbeda dalam paket. Perkiraan itu tampaknya jalan keluar dengan melaporkan jumlah total dalam indeks yang difilter, tetapi sebenarnya rencana itu ditampilkan salah.
DATEADD(month,datediff(month,0,getdate()) - 13,0)
tidak masuk akal bagi saya. Apa yang kamu coba lakukan dengan ini? Bisakah itu diperbaiki / disederhanakan?