ฉันมีแบบสอบถามที่ใช้ฟังก์ชันในเพรดิเคตบางอย่างเช่นนี้:
commentType = 'EL'
AND commentDateTime >= DATEADD(month,datediff(month,0,getdate()) - 13,0)
ฉันมีดัชนีตัวกรองใน commentType ที่มีแถว 40K และเมื่อฉันเรียกใช้แบบสอบถามจำนวนแถวโดยประมาณสำหรับดัชนี Seek นั้นแม่นยำมาก (ประมาณ 11K) แต่สำหรับขั้นตอนต่อไป (ตัวดำเนินการเรียงลำดับ) จะไม่สนใจสถิติและ เพียงประมาณจำนวนแถวทั้งหมดในดัชนีที่กรอง
ทำไมสิ่งนี้จึงเกิดขึ้น ฉันรู้พื้นฐานเกี่ยวกับการsargabilityและฉันทดสอบเพียงเพื่อความมีสติแทน dateadd ตามวันที่จริง (2014-01-01) และ voila ... การเรียงลำดับเริ่มเดาจำนวนแถวอย่างถูกต้อง ...
เหตุใดสิ่งนี้จึงเกิดขึ้นและฉันจะแก้ไขได้อย่างไร ฉันไม่สามารถผ่านวันที่แน่นอน ...
DATEADD(month, -13, DATEADD(day, 1-DATEPART(day, SYSDATETIME()))
และดูว่ามีความแตกต่างหรือไม่?
(commentType, commentDate)
มันจะทำงานได้ดีขึ้นหรือไม่ เป็นเพียงดัชนีที่กรองบางครั้งสามารถรายงานประมาณการผิดที่จุดต่าง ๆ ในแผน การคาดคะเนดูเหมือนจะหมดไปด้วยการรายงานจำนวนทั้งหมดในดัชนีที่กรองแล้ว แต่ที่จริงแล้วแผนกำลังแสดงผิด
DATEADD(month,datediff(month,0,getdate()) - 13,0)
ไม่สมเหตุสมผลสำหรับฉัน คุณพยายามทำอะไรกับสิ่งนี้ มันอาจจะปรับปรุง / ประยุกต์?