ปรับปรุงความเร็วในการลบสำหรับ SQL Server


12

เรามีฐานข้อมูลการผลิตขนาดใหญ่มีขนาดประมาณ 300GB มีวิธีการใดในการปรับปรุงประสิทธิภาพของคิวรีการลบหรือไม่ ตอนนี้ความเร็วในการลบอยู่ระหว่าง 1-10k ต่อนาทีมันช้ามากสำหรับเรา


2
1,000 แถวต่อนาทีฟังดูช้ามาก คุณกำลังประสบการบล็อกหรือไม่ หรือช้าเกินไปในการเลือกแถวด้วยซึ่งจะแนะนำให้ต้องการดัชนี?
James Z

อาจเป็นไปได้ว่าคุณต้องสร้างดัชนีเพื่อให้ครอบคลุมเกณฑ์การลบของคุณ
Ginden

6
มีรายละเอียดไม่เพียงพอที่จะให้คำตอบ คุณใช้แบบสอบถามใด คุณมีดัชนีในคอลัมน์เกณฑ์ที่เกี่ยวข้อง (ถ้ามี) หรือไม่? คุณมีทริกเกอร์ในการลบหรือไม่? ...
Sébastien Sevrin

3
คุณกำลังพยายามลบหนึ่งพันล้านแถวต่อครั้งหรือไม่ เป็นไปได้ไหมว่าคุณกำลังรอ autogrow หลังจาก autogrow หลังจาก autogrow (เป็นไปได้มากกว่าที่จะเป็นกิจกรรมการบันทึกที่คุณรออยู่ไม่ใช่กิจกรรมการลบจริง) ดูบทความนี้ ...
Aaron Bertrand

3
ด้วย ข้อ จำกัด กุญแจต่างประเทศใด ๆ โปรดระบุคำจำกัดความของตารางแบบสอบถามและแผนการดำเนินการที่สมบูรณ์
Martin Smith

คำตอบ:


20

หากคุณพยายามที่จะลบแถวจำนวนมากในคำสั่งเดียวก็เป็นไปได้ว่าคุณกำลังรอกิจกรรมการบันทึก คุณสามารถ:

  1. ตรวจสอบให้แน่ใจว่าบันทึกของคุณมีขนาดเพียงพอเพื่อให้กิจกรรมการเจริญเติบโตไม่ทำให้คุณช้าลง ด้วยค่าเริ่มต้นบันทึกของคุณอาจเริ่มต้นที่ 1MB พร้อมการเติบโต 10% เหตุการณ์การเติบโตมีราคาแพงและหากคุณบันทึกการลบถึง 10 GB สิ่งนี้จะทำลายประสิทธิภาพไม่เพียง แต่ตอนนี้ แต่ในอนาคต (เนื่องจากสิ่งนี้ทำกับ VLF)
  2. หากคุณกำลังลบทั้งตารางการใช้TRUNCATEหรือ/DROPCREATE
  3. หากคุณกำลังลบตารางส่วนใหญ่ให้ใช้SELECT INTOเพื่อใส่ข้อมูลที่คุณต้องการเก็บไว้ในตารางอื่นจากTRUNCATEนั้นย้ายส่วนเล็ก ๆ กลับ (หรือเพียงวางตารางเก่าเปลี่ยนชื่อใหม่และใช้ข้อ จำกัด / สิทธิ์อีกครั้ง)
  4. ลดผลกระทบของการเข้าสู่ระบบให้น้อยที่สุดโดยการลบข้อมูลในกลุ่มแทนที่จะเป็นทั้งหมดพร้อมกัน ดูบทความนี้ คุณยังสามารถพิจารณาเปลี่ยนเป็นการกู้คืนแบบง่าย ๆ ชั่วคราวได้เพื่อให้คุณต้องCHECKPOINTล้างข้อมูลบันทึกแทนที่จะใช้การสำรองข้อมูลบันทึก แต่คุณต้องแน่ใจว่าได้ตั้งค่ากลับมาและใช้การสำรองข้อมูลเต็มรูปแบบใหม่เพื่อเริ่มต้นห่วงโซ่การบันทึกใหม่ .

+1 จากฉันสำหรับบทความที่ยอดเยี่ยม สิ่งนี้ช่วยฉันในอดีตเพื่อให้นักพัฒนาของเราเข้าใจการลบเมื่อพวกเขาเพียงแค่ติดต่อเราเพื่อความช้าและการเติบโตในล็อกไฟล์
KASQLDBA

นอกจากนี้หากมีดัชนีที่ไม่จำเป็นการทิ้งมันจะเพิ่มความเร็วในการลบ อีกครั้งถ้าลบข้อมูลทั้งหมดหรือเกือบทั้งหมดทิ้งดัชนีทั้งหมดก่อนและสร้างอีกครั้งหลังจากนั้นอาจมีผลกระทบที่ดี
Tony Hinkle

3
@Tony การวางดัชนีจะต้องถูกบันทึกด้วยเช่นกัน (เช่นเดียวกับการสร้างดัชนี) ดังนั้นอาจเป็นเรื่องของเวลาที่คุณต้องการจ่ายค่าใช้จ่าย หากไม่มีการทดสอบฉันไม่เชื่อว่าจะมีข้อได้เปรียบอย่างมากสำหรับสถานการณ์การลบ (เช่นจะมีการแทรก / อัปเดต) เว้นแต่คุณจะมีดัชนีที่คุณจะไม่ติดตามต่อไป
Aaron Bertrand

การปิดใช้งานข้อ จำกัด FK ชั่วคราวสามารถปรับปรุงการสืบค้นได้หรือไม่
Lev Z

3

มีคำใบ้อยู่บ้าง แต่คุณใช้เวอร์ชั่นไหน? มันเป็นรุ่นขององค์กร? อย่างไรก็ตาม:

  1. ถ้าทำได้ให้ย้ายบันทึกธุรกรรมไปยังดิสก์ที่เร็วกว่า
  2. วิเคราะห์ที่ มันจะใช้ดัชนีเพื่อระบุระเบียนที่จะลบหรือไม่ ถ้าไม่คุณสามารถเพิ่มดัชนีได้หรือไม่?
  3. คุณมีดัชนีใด ๆ บนตารางที่คุณสามารถดร็อปได้หรือไม่? ถ้าใช่ปล่อยพวกเขา
  4. คุณมีกุญแจต่างประเทศเมื่อเทียบกับตารางนี้หรือไม่? สิ่งเหล่านี้สามารถชะลอการลบของคุณได้
  5. หากคุณมีรุ่นองค์กรและคอขวดคือดิสก์ IO การบีบอัดที่ระดับแถวสามารถให้ความช่วยเหลือได้เล็กน้อย (ขึ้นอยู่กับข้อมูลของคุณ)
  6. คุณแบ่งพาร์ติชั่นโต๊ะได้ไหม? ดัชนีโลคัลและดร็อปพาร์ติชันสามารถเร็วขึ้น
  7. ตรวจสอบว่าคอขวดอยู่ที่ไหนผ่านการตรวจสอบกิจกรรม

เพิ่มรายละเอียดเมื่อคุณทำงานกับฐานข้อมูลขนาดใหญ่ไม่มีคำตอบที่ถูกต้องเพียงคำเดียว


0

คุณควรลองลบมันออกเป็นชิ้น ๆ โดยอาจจะเป็นการลบแบบวนซ้ำแต่ละครั้งจะเป็นการลบทรานแซกชันของมันเองและจากนั้นทำการล้างบันทึกในตอนท้ายของการวนซ้ำแต่ละครั้ง

นอกจากนี้คุณจะต้องค้นหาหมายเลขที่คุณจะใช้เป็นค่าในกลุ่มสำหรับการลบระเบียน มันต้องมีการทดสอบอย่างละเอียดจะดีกว่าถ้าคุณสามารถทดสอบมูลค่าก้อนในหน่วย UAT ก่อน

เกี่ยวกับวิธีการดำเนินการต่อจะแนะนำให้คุณแบ่งการดำเนินการลบขนาดใหญ่ออกเป็นชิ้น ๆ


0

การลบอาจช้าถ้าตารางขนาดใหญ่มีคีย์ต่างประเทศแบบเรียกซ้ำ

ถ้าเป็นเช่นนั้นหาเวลาที่เหมาะสมปิดการใช้งานบริการขึ้นอยู่กับปิดการใช้งานต่างประเทศที่สำคัญ recursive ดำเนินการลบมากแล้วเรียกคืนที่สำคัญต่างประเทศอีกครั้ง


นี่คือกรณีของฉันอย่างแน่นอน มันค่อนข้างเสี่ยงที่จะปิดการใช้งานข้อ จำกัด แต่การลบถูกลบจาก 1 แถว / seocnd เป็น 500 / วินาที
4709

0

กำลังเพิ่มคะแนนอีกไม่กี่ ...

  1. ลองตรวจสอบว่าภาคแสดงมีดัชนีอยู่หรือไม่และดูสถิติด้วย
  2. หากคุณกำลังลบแถวจำนวนมากและคุณไม่ต้องการตัวเลือกตารางชั่วคราว ไปสำหรับtablockตัวเลือก
  3. ดูว่าคุณมีทริกเกอร์หรือไม่โดยเฉพาะหลังจากลบทริกเกอร์

หากต้องการความช่วยเหลือเพิ่มเติมให้โพสต์คำถามที่คุณใช้ข้อมูลตารางรวมถึงข้อมูลการบล็อก

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