OPTION FORCE ORDER ปรับปรุงประสิทธิภาพจนกว่าแถวจะถูกลบ


9

ฉันมีแบบสอบถาม SQL Server 2008 ที่ค่อนข้างซับซ้อน (ประมาณ 200 บรรทัดของ SQL ที่มีความหนาแน่นพอสมควร) ซึ่งไม่ทำงานตามที่ฉันต้องการ เมื่อเวลาผ่านไปประสิทธิภาพจะลดลงจากประมาณ 0.5 วินาทีเป็นประมาณ 2 วินาที

ดูที่แผนการดำเนินการมันค่อนข้างชัดเจนว่าการเรียงลำดับตัวเชื่อมใหม่จะทำให้ประสิทธิภาพดีขึ้น ฉันทำและมันลงไปถึงประมาณ 3 วินาที ตอนนี้แบบสอบถามมีคำแนะนำ "คำสั่งตัวเลือกการบังคับ"และชีวิตเป็นสิ่งที่ดี

ตามมาด้วยฉันวันนี้ล้างฐานข้อมูล ฉันเก็บประมาณ 20% ของแถวที่จะดำเนินการในฐานข้อมูลที่เกี่ยวข้องอื่นใดนอกจากการลบแถว ... แผนปฏิบัติการที่ได้รับการทยอย มันผิดทั้งหมดจำนวนแถวย่อยบางอย่างจะกลับมาและ (ตัวอย่าง) แทนที่ a:

<Hash>

กับ

<NestedLoops Optimized='false' WithUnorderedPrefetch='true'>

ในขณะนี้เวลาของแบบสอบถามเริ่มจากประมาณ. 3 ถึงประมาณ 18 วินาที (!) เพียงเพราะฉันลบแถว หากฉันลบคำใบ้คำค้นหาฉันกลับไปใช้เวลาสอบถามข้อมูลประมาณ 2 วินาที ดีกว่า แต่แย่กว่านั้น

ฉันได้ทำซ้ำปัญหาหลังจากกู้คืนฐานข้อมูลไปยังสถานที่และเซิร์ฟเวอร์หลายแห่ง เพียงลบประมาณ 20% ของแถวจากแต่ละตารางจะทำให้เกิดปัญหานี้เสมอ

  1. เป็นเรื่องปกติหรือไม่ที่คำสั่งการเข้าร่วมที่ถูกบังคับจะทำให้การประมาณการแบบสอบถามไม่ถูกต้องสมบูรณ์ (และทำให้เวลาในการสืบค้นไม่แน่นอน)
  2. ฉันควรคาดหวังว่าฉันจะต้องยอมรับประสิทธิภาพการค้นหาย่อยที่ดีที่สุดหรือดูมันเหมือนเหยี่ยวและแก้ไขคำแนะนำการค้นหาด้วยตนเองบ่อยครั้งหรือไม่ หรืออาจจะบอกใบ้ให้ทุกคนเข้าร่วมด้วยเช่นกัน? .3s to 2s เป็นเกมยอดนิยมที่ต้องทำ
  3. ชัดเจนหรือไม่ว่าทำไมเครื่องมือเพิ่มประสิทธิภาพจึงเกิดขึ้นหลังจากลบแถว? ตัวอย่างเช่น "ใช่ใช้การสแกนตัวอย่างและเนื่องจากฉันเก็บถาวรแถวส่วนใหญ่ก่อนหน้านี้ในประวัติข้อมูลที่ตัวอย่างให้ผลลัพธ์แบบกระจัดกระจาย

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

                             /  Clustered Index Scan (908:7229)
Nested Loops (Inner Join) --<
                             \  NonClustered Index Seek (1:7229)

หมายเหตุคาดว่าวงด้านในจะสแกน 908 แถว แต่สแกน 52,258,441 แทน ถ้ามันถูกต้องสาขานี้จะวิ่งประมาณ 2 มิลลิวินาทีมากกว่า 12 วินาที ก่อนที่จะลบแถวการประมาณการการเข้าร่วมภายในนี้ปิดเพียงปัจจัยรวม 2 เท่านั้นและดำเนินการเป็นการจับคู่แบบแฮชบนดัชนีสองคลัสเตอร์

คำตอบ:


6

เป็นเรื่องปกติหรือไม่ที่คำสั่งการเข้าร่วมที่ถูกบังคับจะทำให้การประมาณการแบบสอบถามไม่ถูกต้องสมบูรณ์ (และทำให้เวลาในการสืบค้นไม่แน่นอน)

การใช้คำสั่งบังคับไม่ได้ทำให้การประมาณการไม่ถูกต้องการลบแถวทำได้ การบังคับให้อัปเดตสถิติในตารางอาจช่วยเพิ่มความแม่นยำในการประมาณการ

ฉันควรคาดหวังว่าฉันจะต้องยอมรับประสิทธิภาพการค้นหาย่อยที่ดีที่สุดหรือดูมันเหมือนเหยี่ยวและแก้ไขคำแนะนำการค้นหาด้วยตนเองบ่อยครั้งหรือไม่ หรืออาจจะบอกใบ้ให้ทุกคนเข้าร่วมด้วยเช่นกัน? .3s to 2s เป็นเกมยอดนิยมที่ต้องทำ

ดีกว่าคือเพื่อให้มั่นใจว่าเครื่องมือเพิ่มประสิทธิภาพจะได้รับข้อมูลที่จำเป็นในการสร้างแผนที่ดีที่สุดโดยไม่ต้องใช้คำใบ้บังคับใบสั่ง โดยการทำเช่นนี้ควรจัดการได้ดีขึ้นกับการเปลี่ยนแปลงการกระจายข้อมูลพื้นฐานโดยไม่ต้องมีการแทรกแซงด้วยตนเอง ที่กล่าวว่าหากลักษณะของข้อมูลเป็นเช่นนั้นความสำคัญเชิงหัวใจอาจแตกต่างกันอย่างมีนัยสำคัญทุกชั่วโมงหรือทุกวันพิจารณาใช้คู่มือแผนเพื่อให้แน่ใจว่ามีการแก้ไขแผน

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

คุณไม่ได้พูดถึงจำนวนแถวในตารางปัญหา แต่อาจเป็นไปได้ว่าการลบอย่างใดอย่างหนึ่ง:

  • มีแถวไม่เพียงพอที่จะเรียกใช้การอัปเดตสถิติ สิ่งนี้จะเกิดขึ้นเมื่อ 20% ของแถวถูกแก้ไข แต่มีตัวเลือกให้ใช้การตั้งค่าสถานะการสืบค้นกลับ 2371เพื่อเปิดใช้งานเกณฑ์แบบไดนามิก
  • ทริกเกอร์การอัปเดตสถิติ แต่ตัวอย่างที่รวบรวมมาไม่ได้เป็นตัวแทน แก้ไขปัญหานี้โดยใช้การปรับปรุงคู่มือกับ FULLSCAN

นอกจากนี้คุณยังอาจพบปัญหาการดมกลิ่นพารามิเตอร์แบบเก่าที่ดีซึ่งมีตัวเลือกมากมายให้แก้ไข ด้วย RECOMPILEอาจเป็นตัวเลือกที่มีราคาแพงในการระบุด้วยข้อความค้นหาขนาดใหญ่ แต่ก็คุ้มค่าที่จะตรวจสอบทั้งในขั้นตอนและระดับคำสั่ง


อาจจะเป็นเพียงความหมาย: "การใช้คำสั่ง FORCE ไม่ทำให้การประมาณการไม่ถูกต้องการลบแถวทำได้" ดังนั้นคุณคิดว่าเป็นเพียงการสุ่มเลือกที่จะลบ "FORCE ORDER" เพื่อปรับปรุงคิวรีมากขึ้นหรือไม่ คำใบ้นั้นไม่ทำให้โปรแกรมเพิ่มประสิทธิภาพพึ่งพาสถิติที่ควรให้ความสำคัญน้อยกว่าหรือไม่ถูกค้นพบในการทดสอบแอปพลิเคชันเพราะสถิติที่เชื่อถือได้น้อยกว่านี้แทบไม่สำคัญ
แชนนอน

ฉันคิดว่าเป็นเช่นนั้นในการเพิ่มประสิทธิภาพที่ต้องการตัวเลือกของแผนเกิดขึ้นเพื่อรับมือกับสถิติที่ไม่ถูกต้อง แต่แผนที่เป็นผลมาจากคำสั่งเข้าร่วมถูกบังคับไม่ได้ ฉันไม่ทราบว่า FORCE ORDER ORDER ทำให้เกิดการเปลี่ยนแปลงใด ๆ ในการประเมินผลสถิติบุคคลอื่นจะพูดสอดหากพวกเขารู้ว่าสิ่งใดที่ตรงกันข้าม ยังต้องพิจารณาด้วยว่าค่าที่คุณเลือกเพื่อเพิ่มประสิทธิภาพนั้นเหมาะสมหรือไม่ อาจเป็นได้ว่าสถิตินั้นค่อนข้างดี แต่คุณบังคับใช้แผนตามค่าที่ไม่ได้เป็นตัวแทน
Mark Storey-Smith

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