เหตุใดจำนวนการดำเนินการสแกนดัชนีแบบกลุ่มจึงสูงมาก


15

ฉันมีสองแบบสอบถามที่คล้ายกันที่สร้างแผนแบบสอบถามเดียวกันยกเว้นว่าแผนแบบสอบถามหนึ่งดำเนินการสแกนดัชนีแบบกลุ่ม 1316 ครั้งในขณะที่คนอื่น ๆ ดำเนินการมัน 1 ครั้ง

ข้อแตกต่างระหว่างแบบสอบถามทั้งสองนี้คือเกณฑ์วันที่แตกต่างกัน แบบสอบถามที่ใช้เวลานานจริง ๆ แล้ว จำกัด วันที่ให้แคบลงและดึงข้อมูลน้อยลง

ฉันได้ระบุดัชนีบางอย่างที่จะช่วยในการสืบค้นทั้งสองข้อ แต่ฉันต้องการเข้าใจว่าทำไมตัวดำเนินการ Clustered Index Scan จึงเรียกใช้งาน 1,316 ครั้งสำหรับการสืบค้นที่เกือบจะเหมือนกับครั้งที่เรียกใช้งาน 1 ครั้ง

ฉันตรวจสอบสถิติเกี่ยวกับเภสัชจลนศาสตร์ที่กำลังถูกสแกนและพวกเขาค่อนข้างทันสมัย

ข้อความค้นหาเดิม:

select distinct FIR_Incident.IncidentID
from FIR_Incident
left join (
    select incident_id as exported_incident_id
    from postnfirssummary
) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid
where FI_IncidentDate between '2011-06-01 00:00:00.000' and '2011-07-01 00:00:00.000'
    and exported_incidents.exported_incident_id is not null

สร้างแผนนี้: ป้อนคำอธิบายรูปภาพที่นี่

หลังจากลดเกณฑ์ช่วงวันที่ให้แคบลง:

select distinct FIR_Incident.IncidentID
from FIR_Incident
left join (
    select incident_id as exported_incident_id
    from postnfirssummary
) exported_incidents on exported_incidents.exported_incident_id = fir_incident.incidentid
where FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'
    and exported_incidents.exported_incident_id is not null

สร้างแผนนี้: ป้อนคำอธิบายรูปภาพที่นี่


คุณสามารถคัดลอก / วางข้อความค้นหาของคุณในบล็อกรหัสแทนที่จะเป็นไฟล์รูปภาพได้หรือไม่?
Eric Humphrey - lotsahelp

แน่นอน - ฉันเพิ่มข้อความค้นหาที่สร้างแต่ละแผน
Seibar

ตารางใดที่การสแกนดัชนีแบบคลัสเตอร์เกิดขึ้น
Eric Humphrey - lotsahelp

การสแกนดัชนีแบบกลุ่มอยู่ที่แบบสอบถามย่อยในการเข้าร่วมด้านซ้าย (PostNFIRSS บทสรุป)
Seibar

1
ครั้งล่าสุดที่สถิติน่าจะได้รับการอัพเดตมีเพียงศูนย์หรือหนึ่งแถวที่FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'ตรงกับเกณฑ์และตั้งแต่นั้นมามีการเพิ่มจำนวนเม็ดมีดที่ไม่เหมาะสมในช่วงนั้น โดยประมาณจะต้องใช้การประมวลผลเพียง 1.07 รายการสำหรับช่วงวันที่นั้น ไม่ใช่ 1,316 ที่เกิดขึ้นจริง
Martin Smith

คำตอบ:


9

เข้าร่วมหลังจากการสแกนให้เบาะแส: มีแถวน้อยลงในด้านหนึ่งของการเข้าร่วมล่าสุด (อ่านจากขวาไปซ้ายของหลักสูตร) ​​เพิ่มประสิทธิภาพเลือก "ซ้อนวง" ไม่ใช่ "การเข้าร่วมแฮ"

อย่างไรก็ตามก่อนที่จะดูสิ่งนี้ฉันมีจุดมุ่งหมายที่จะกำจัดการค้นหาคีย์และ DISTINCT

  • การค้นหาคีย์: ดัชนีของคุณใน FIR_Incident ควรครอบคลุม(FI_IncidentDate, incidentid)หรืออาจเป็นวิธีอื่น หรือมีทั้งคู่และดูว่ามีการใช้งานบ่อยครั้งกว่ากัน (ทั้งคู่อาจเป็น)

  • เป็นผลมาจากการDISTINCT LEFT JOIN ... IS NOT NULLเครื่องมือเพิ่มประสิทธิภาพได้ลบออกไปแล้ว (แผนมี "เหลือกึ่งร่วม" ในการเข้าร่วมครั้งสุดท้าย) แต่ฉันจะใช้ EXISTS เพื่อความชัดเจน

สิ่งที่ต้องการ:

select 
    F.IncidentID
from 
    FIR_Incident F
where 
    exists (SELECT * FROM postnfirssummary P
           WHERE P.incident_id = F.incidentid)
    AND
    F.FI_IncidentDate between '2011-07-01 00:00:00.000' and '2011-07-02 00:00:00.000'

คุณยังสามารถใช้คำแนะนำแผนและคำแนะนำในการเข้าร่วมเพื่อให้ SQL Server ใช้การเข้าร่วมแฮช แต่พยายามทำให้มันทำงานได้ตามปกติก่อน: คำแนะนำหรือคำใบ้อาจจะไม่ทนต่อการทดสอบเพราะมันมีประโยชน์สำหรับข้อมูลและ แบบสอบถามที่คุณเรียกใช้ตอนนี้ไม่ใช่ในอนาคต

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