ฉันมีคำถามที่ค่อนข้างง่าย
SELECT TOP 1 dc.DOCUMENT_ID,
dc.COPIES,
dc.REQUESTOR,
dc.D_ID,
cj.FILE_NUMBER
FROM DOCUMENT_QUEUE dc
JOIN CORRESPONDENCE_JOURNAL cj
ON dc.DOCUMENT_ID = cj.DOCUMENT_ID
WHERE dc.QUEUE_DATE <= GETDATE()
AND dc.PRINT_LOCATION = 2
ORDER BY cj.FILE_NUMBER
นั่นทำให้ฉันมีประสิทธิภาพที่น่ากลัว (อย่างที่ไม่เคยใส่ใจที่จะรอให้มันจบ) แผนแบบสอบถามมีลักษณะดังนี้:
อย่างไรก็ตามถ้าฉันลบTOP 1
แผนการที่มีลักษณะเช่นนี้ออกและทำงานใน 1-2 วินาที:
แก้ไข PK & การทำดัชนีด้านล่าง
ความจริงที่ว่าTOP 1
แผนการสืบค้นที่เปลี่ยนแปลงนั้นไม่ได้ทำให้ฉันแปลกใจ แต่ฉันก็แปลกใจนิดหน่อยที่มันทำให้แย่ลงไปอีกมาก
หมายเหตุ: ฉันได้อ่านผลลัพธ์จากโพสต์นี้และเข้าใจแนวคิดของRow Goal
สิ่งอื่น ๆ แล้วสิ่งที่ฉันอยากรู้คือฉันจะเปลี่ยนการสืบค้นอย่างไรเพื่อที่จะใช้แผนการที่ดีกว่า ขณะนี้ฉันกำลังทิ้งข้อมูลลงในตารางชั่วคราวแล้วดึงแถวแรกออกมา ฉันสงสัยว่ามีวิธีที่ดีกว่านี้หรือไม่
แก้ไขสำหรับผู้ที่อ่านสิ่งนี้หลังจากข้อเท็จจริงที่นี่มีข้อมูลเพิ่มเติมอีกสองสามชิ้น
- Document_Queue - PK / CI คือ D_ID และมีแถว ~ 5k
- Correspondence_Journal - PK / CI คือ FILE_NUMBER, CORRESPONDENCE_ID และมีแถวประมาณ 1.4 ล้านแถว
เมื่อฉันเริ่มไม่มีดัชนีอื่น ๆ ฉันได้รับหนึ่งใน Correspondence_Journal (Document_Id, File_Number)
DOCUMENT_ID
ความสัมพันธ์ระหว่างสองตาราง (หรือว่าทุกระเบียนCORRESPONDENCE_JOURNAL
มีระเบียนที่ตรงกันDOCUMENT_QUEUE
หรือไม่)