คำถามเกี่ยวกับ SARGability


11

ฉันแค่ต้องยืนยันว่าฉันเข้าใจบางอย่างถูกต้อง:

ฉันเพิ่งดูคำถาม SO ที่ผู้ใช้โพสต์คำตอบใน Linq เช่น:

from p in db.table where p.column.AddMinutes(1) > DateTime.Now select p

สำหรับผู้ที่ไม่คุ้นเคยกับ Linq ฉันคาดหวังว่าผลลัพธ์ของคำแถลงนั้น (ไม่ได้ทดสอบอย่างยุติธรรม) จะเป็น:

SELECT *
FROM table t
WHERE DATEADD(min, 1, t.column) >= GETDATE() 

ฉันโพสต์คำตอบนี้บอกว่าการจัดการ datetime ควรจะอยู่ในตัวแปร (ในกรณีนี้GETDATE()) ดังนั้นในความเป็นจริงคำสั่งควรสะท้อนถึงสิ่งที่ชอบ:

SELECT *
FROM table t
WHERE t.column >= DATEADD(min, -1, GETDATE())

ในการตอบกลับของฉันบิตที่ฉันไม่แน่ใจตอนนี้ถือว่าต่อไปนี้:

  1. ดัชนีจะไม่ถูกใช้เนื่องจากการจัดการคอลัมน์
  2. แผนแบบสอบถามจะแตกต่างกันบางส่วนเนื่องจากการข้างต้น
  3. เนื่องจากการข้างต้นการสืบค้นที่ 1 จะทำงานได้แย่กว่าการสืบค้นที่ 2

คำถามของฉัน:

ฉันพลาดอะไรไปบ้างในการให้เหตุผลของฉัน? ฉันถูกไหม? สุดท้ายร่างกายใดมีบทความที่ดีเกี่ยวกับ SARGability?

คำตอบ:


6
  1. แก้ไข
  2. ไม่จำเป็น - มันขึ้นอยู่กับว่ามีดัชนีที่เหมาะสมอยู่หรือไม่และ CBO ตัดสินใจที่จะใช้มันหรือไม่ ตัวอย่างเช่นหากตารางมีขนาดเล็กหรือสถิตินำไปสู่เครื่องมือเพิ่มประสิทธิภาพที่จะเชื่อว่าตัวกรองจะเป็นจริงสำหรับเปอร์เซ็นต์ที่มากของผลลัพธ์อาจพิจารณาค่าใช้จ่ายของ FTS ที่ต่ำกว่า
  3. สิ่งนี้ไม่ได้รับประกัน - เป็นไปได้ว่าคำค้นหาที่สองจะทำงานได้แย่ลง - แต่เหตุผลของคุณดีกว่า ตัวอย่างเช่นในกรณีที่ขอบเมื่อ FTS จริงจะเร็วกว่า CBO อาจเลือกสแกนดัชนีแทนตามการคาดเดาที่ดีที่สุดของค่าใช้จ่าย - ซึ่งเป็นเพียงการประมาณแน่นอน

googling นิดหน่อยก็ถามคำถาม SOขึ้นมาและบทความที่น่าสนใจเกี่ยวกับ SARGability


5

แจ็คถูกต้องดังนั้นฉันจะไม่พูดซ้ำอีก

ฉันจะเพิ่มบทความบางอย่างที่ฉันชอบเกี่ยวกับความสามารถในการแสดงออกได้:

พวกเขาเป็นนักเขียนที่ยอดเยี่ยมที่มีประสบการณ์มากมายบน SQL Server

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.