SELECT TOP 1 เป็นอันตรายต่อประสิทธิภาพการค้นหา มีวิธีเข้าถึง dba เพื่อเอาชนะสิ่งนี้หรือไม่


13

ในแอปพลิเคชันที่ใช้งานจริง (C # กำลังพูดคุยกับ SQL Server 2014 Standard) มีข้อความค้นหาที่มีลักษณะดังนี้ด้านล่าง เวลาส่วนใหญ่จะทำงานในหน่วยมิลลิวินาที แต่บางครั้ง (สำหรับค่าบางอย่าง@Id) มันจะไปถั่วและใช้เวลาประมาณหนึ่งนาที นี่เป็นเวลานานกว่าการหมดเวลาของแอปดังนั้นแอปจึงล้มเหลวสำหรับผู้ใช้

ในกรณี "go nuts" ชุดผลลัพธ์ที่ส่งคืนจะว่างเปล่าอย่างถูกต้องเนื่องจากอยู่ในหลาย ๆ กรณี แต่ไม่ใช่ทุกกรณี

โชคดีที่สิ่งนี้สามารถทำซ้ำได้ทั้งในสภาพแวดล้อมการผลิตและการพัฒนา

นักพัฒนาซอฟต์แวร์แจ้งว่าการลบ "TOP 1" ออกจากคำค้นหาจากนั้นตรวจสอบให้แน่ใจว่าแอปนั้นใช้แถวเพิ่มเติมของชุดผลลัพธ์เพื่อล้างปัญหาด้านประสิทธิภาพ

ตัววางแผนคิวรีไม่แนะนำดัชนีเมื่อTOP 1มีอยู่ (ใน dev)

กำลังเปลี่ยนคิวรีและแก้ไขแอปอยู่ในระหว่างดำเนินการ การเปิดตัวใช้เวลาสักครู่

คำถามของฉัน:มีวิธีใดบ้างที่สามารถเข้าถึง DBA ในการปรับแต่งหรือปรับแต่งอินสแตนซ์ SQL Server ที่ใช้งานได้เพื่อแก้ไขปัญหานี้ก่อนที่แอพจะเปลี่ยนด้วยการสืบค้นใหม่

SELECT TOP 1
       subscription_id 
  FROM subscription AS sub
  JOIN billing_info AS bi ON bi.billing_info_id = sub.billing_info_id   
  JOIN person_group AS apg ON apg.person_id = bi.person_id
  JOIN pplan ON pplan.plan_id = sub.plan_id
  JOIN product ON product.product_id = [plan].product_id 
  JOIN product_attribute ON product_attribute.product_id = product.product_id 
 WHERE apg.group_id = @Id
   AND apg.start_date < GETDATE()
   AND (apg.end_date IS NULL OR apg.end_date > GETDATE()) 
   AND (sub.end_date IS NULL OR sub.end_date > GETDATE()) 
   AND product_attribute.attribute_type = 'special feature' 
   AND product_attribute.attribute_data = '1' 
 ORDER BY sub.start_date ASC;

คุณเคยลองเป็นคิวรีย่อยหรือไม่? เช่นเลือกด้านบน 1 Subscription_id จาก (เลือก [ส่วนที่เหลือของคำค้นหาของคุณโดยไม่มีด้านบน 1]
SeanR

บางทีการปรับแต่งข้อความค้นหา "ปกติ" บางอย่างอาจใช้งานได้ หากดัชนีน่าดึงดูดเพียงพอการสแกนก็จะหายไป ที่น้อยกว่าการรุกรานกว่าคู่มือแผน
usr

ดังนั้นค่าเดียวกันของ@ID มักจะทำให้มัน "ไปถั่ว"? ถ้าเป็นเช่นนั้นทดสอบโดยใช้หนึ่งในค่าเหล่านั้นและจับแผนแบบสอบถามจริง นั่นจะบอกคุณว่าเกิดอะไรขึ้น หากค่า "ไม่ดี" ไม่สอดคล้องกันอาจเป็นไปได้ว่านี่คือการดมกลิ่นพารามิเตอร์ (ดูคำตอบของ @ MartinSmith สำหรับวิธีการแก้ปัญหา) หรือปัญหาการล็อคที่เกี่ยวข้องกับวิธีการที่ลูกค้าร้องขอและใช้ชุดผลลัพธ์
RBarryYoung

คำตอบ:


12

หากคุณไม่สามารถเปลี่ยนแบบสอบถามคุณสามารถใช้คำแนะนำแผน

ทดสอบประสิทธิภาพของแบบสอบถามด้วยOPTION (QUERYTRACEON 4138)(จะต้องมีผู้ที่มีsysadminสิทธิ์ในการลองใช้)

หากสิ่งนั้นให้ผลการดำเนินงานที่น่าพึงพอใจคุณสามารถใช้สิ่งนี้กับคู่มือวางแผน ถ้ามันไม่ได้ผลที่น่าพึงพอใจลองค้นหาคำใบ้ดูสิ อาจเป็นไปได้OPTION (HASH JOIN, MERGE JOIN)ว่าลูปซ้อนกันไม่เหมาะสมเป็นปัญหา คุณอาจต้องหันไปใช้USE PLAN N'...'คำใบ้

เมื่อคุณรู้ว่าคำใบ้ (s) ที่จำเป็นคุณสามารถใช้พวกเขาโดยใช้ข้อมูลที่นี่


OPTION (QUERYTRACEON 4138)ทำเคล็ดลับ ขอบคุณ ตอนนี้เพื่อคัดออกคำแนะนำแผน
O. Jones

0

สำหรับ grins ให้ลองนี้
`> ถูกเปลี่ยนเป็น> = ดังนั้นจึงไม่ใช่คำค้นหาเดียวกัน

SELECT TOP 1
       subscription_id 
  FROM subscription AS sub
  JOIN billing_info AS bi 
        ON bi.billing_info_id = sub.billing_info_id   
  JOIN person_group AS apg 
        ON apg.person_id = bi.person_id 
       AND apg.group_id = @Id
       AND apg.start_date < GETDATE()
       AND isnnull(apg.end_date, GETDATE()) >= GETDATE()             
  JOIN pplan 
        ON pplan.plan_id = sub.plan_id
       AND isnnull(sub.end_date, GETDATE()) >= GETDATE()
  JOIN product 
        ON product.product_id = [plan].product_id 
  JOIN product_attribute 
        ON product_attribute.product_id = product.product_id 
       AND product_attribute.attribute_type = 'special feature' 
       AND product_attribute.attribute_data = '1' 
 ORDER BY sub.start_date ASC;

"การเปลี่ยนแปลงคิวรีและแก้ไขแอปอยู่ในระหว่างดำเนินการการเปิดตัวใช้เวลาสักครู่" OP กำลังมองหาโซลูชันที่แก้ไขประสิทธิภาพ "ตามสภาพ"
Martin Smith

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