Simple DELETE แต่แผนการดำเนินการที่ซับซ้อน


9

เมื่อฉันเรียกใช้การลบนี้:

DELETE FROM ETLHeaders WHERE ETLHeaderID < 32465870

... ลบแถวที่ 39,157 ควรง่ายเพราะจะลบ ETLHeaderID ซึ่งเป็นดัชนีคลัสเตอร์และคีย์หลัก แต่ (ตามแผนการดำเนินการ) ดูเหมือนว่าจะมีการกดปุ่ม 361,190 แถวและใช้ดัชนีอื่น ตารางมีเขตข้อมูลที่มีชนิดข้อมูล XML (ในกรณีที่มีผลต่อการลบนี้)

ความคิดใดที่เป็นสาเหตุและวิธีที่ฉันสามารถเร่งความเร็วการลบนี้

แผนการดำเนินการที่นี่: http://sharetext.org/qwDY สคีมาของตารางที่นี่: http://sharetext.org/Vl9j

ขอบคุณ

คำตอบ:


10

ระดับสูงสุดของแผนเกี่ยวข้องกับการลบแถวออกจากตารางฐาน (ดัชนีคลัสเตอร์) และการบำรุงรักษาดัชนีที่ไม่ใช่คลัสเตอร์ ดัชนีสองตัวนี้ได้รับการดูแลรักษาแบบแถวต่อแถวในเวลาเดียวกันการลบดัชนีแบบกลุ่มจะถูกประมวลผล นี่คือ "+2 ดัชนีที่ไม่ทำคลัสเตอร์" เน้นด้วยสีเขียวด้านล่าง

สำหรับอีกสองดัชนีที่ไม่ได้ทำคลัสเตอร์ตัวเพิ่มประสิทธิภาพได้ตัดสินใจว่าเป็นการดีที่สุดที่จะบันทึกคีย์ของดัชนีเหล่านี้ลงในตารางงาน tempdb (Eager Spool) จากนั้นเล่นสปูลสองครั้งเรียงลำดับโดยคีย์ดัชนีเพื่อส่งเสริมรูปแบบการเข้าถึงตามลำดับ

การบำรุงรักษาดัชนีปกติ

ลำดับการดำเนินการขั้นสุดท้ายเกี่ยวข้องกับการบำรุงรักษาxmlดัชนีหลักและรองซึ่งไม่รวมอยู่ในสคริปต์ DDL ของคุณ:

การบำรุงรักษาดัชนี XML

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

ที่กล่าวว่าxmlดัชนีมีปัญหาโดยเฉพาะอย่างยิ่ง มันเป็นเรื่องยากมากสำหรับเครื่องมือเพิ่มประสิทธิภาพในการประเมินจำนวนแถวที่จะมีสิทธิ์ในสถานการณ์นี้อย่างแม่นยำ ในความเป็นจริงมันประเมินเกินกว่าxmlดัชนีอย่างดุเดือดส่งผลให้หน่วยความจำเกือบ 12GB ได้รับการสืบค้นสำหรับแบบสอบถามนี้ (แม้ว่าจะใช้เพียง 28MB ที่รันไทม์):

จำนวนแถวโดยประมาณ

คุณสามารถลองทำการลบในแบตช์ขนาดเล็กลงโดยหวังว่าจะลดผลกระทบของการจัดสรรหน่วยความจำมากเกินไป

คุณสามารถทดสอบประสิทธิภาพของแผนได้โดยไม่ต้องใช้วิธีแปลกOPTION (QUERYTRACEON 8795)ๆ นี่เป็นแฟล็กการติดตามที่ไม่มีเอกสารดังนั้นคุณควรลองใช้กับระบบการพัฒนาหรือทดสอบเท่านั้นไม่ควรใช้งานจริง หากแผนผลลัพธ์เร็วขึ้นมากคุณสามารถดักจับ XML แผนและใช้เพื่อสร้าง Guide Planสำหรับคิวรีการผลิต


3

คุณกำลังติดตามถูกต้อง - ดัชนี XML เป็นปัญหา เห็นได้ชัดว่ามีดัชนีหลักและดัชนี XML รอง

เมื่อทำการลบกับตารางฐาน (ETLHeaders) ข้อมูลจะต้องถูกลบออกจากทุกดัชนีของตารางนี้ด้วย ค่าใช้จ่ายนี้อาจมีความสำคัญโดยเฉพาะอย่างยิ่งสำหรับดัชนี XML

ดัชนีที่ทำให้ระยะเวลานานคือดัชนี XML รอง [XML_IX_ETLHeaders_Property] แถว 39,157 ใน "ตารางเชิงสัมพันธ์" ของคุณอ้างถึง 361,190 แถวในดัชนี XML หลัก [XML_IX_ETLHeaders] และแถว 361k เหล่านั้นจำเป็นต้องเรียงลำดับเพื่อให้สามารถใช้เพื่อลบดัชนีรองได้ และการดำเนินการเรียงลำดับนี้ทำให้เกิดการสอบถามเป็นระยะเวลานาน (ตามหมายเหตุด้านสถิติดัชนีของดัชนี xml ทั้งสองดูเหมือนจะไม่เป็นเช่นนั้น: ขนาดข้อมูลจริงของแถว xml หลัก 361k คือ 160MB ในขณะที่ขนาดข้อมูลโดยประมาณเกือบ 4TB (ใช่, 4 TerraByte !!) .

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

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