เมื่อใดที่ตกลงเพื่อลดขนาดฐานข้อมูล


43

ฉันรู้ว่าหดตัวเป็นปีศาจ: มันกลับคำสั่งหน้าและรับผิดชอบต่อโรคมะเร็งผิวหนัง, การกระจายตัวของข้อมูลและภาวะโลกร้อน รายการไปที่ ... ที่กล่าวว่าฉันมีฐานข้อมูล 100 GB และฉันลบข้อมูล 50 GB - ไม่ได้อยู่ในตารางเดียว แต่ pruning ทั่วไปของข้อมูลเก่าในระดับกว้างฐานข้อมูลครอบคลุม 90% ของ ตาราง - นี่เป็นกรณีการใช้งานที่เหมาะสมสำหรับลดขนาดฐานข้อมูลหรือไม่?

หากไม่เป็นเช่นนั้นขั้นตอนที่เหมาะสมในการทำความสะอาดบ้านหลังจากลบข้อมูลที่มีเปอร์เซ็นต์สูงจากฐานข้อมูลคืออะไร ฉันสามารถนึกถึงสอง: สร้างดัชนีและอัปเดตสถิติใหม่ มีอะไรอีกบ้าง?

คำตอบ:


13

ไม่แนะนำให้ทำการจัดระเบียบใหม่และหดตัว

หากคุณสามารถใช้แอปที่ให้บริการฐานข้อมูลแบบออฟไลน์คุณสามารถเร่งกระบวนการและลดการกระจายตัวของดัชนีโดยการลบดัชนีและข้อ จำกัด คีย์หลัก / ต่างประเทศทั้งหมดก่อนที่จะย่อขนาดลง (หมายความว่ามีข้อมูลน้อยกว่าที่จะย้ายไปรอบ ๆ หน้าข้อมูลจะไม่สับหน้าดัชนีที่ไม่มีอยู่ตอนนี้เร่งกระบวนการ) จากนั้นสร้างดัชนีและคีย์ทั้งหมดใหม่

การสร้างดัชนีใหม่หลังจากการย่อขนาดหมายความว่าไม่ควรมีการแยกส่วนอย่างมีนัยสำคัญและการทำให้ดัชนีหายไปในระหว่างการย่อขนาดหมายความว่าการสร้างใหม่จะไม่ทำให้เกิด "รู" เล็ก ๆ จำนวนมากในการจัดสรรหน้าภายในไฟล์

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

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

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

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

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

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

สำหรับการดำเนินการคัดลอก SSIS หรือฐาน T-SQL ก็ใช้ได้เช่นกัน (ตัวเลือก SSIS อาจมีประสิทธิภาพน้อยกว่า แต่อาจง่ายต่อการดูแลในภายหลัง) หากคุณสร้างความสัมพันธ์ของ FK ในตอนท้ายพร้อมกับดัชนีคุณสามารถทำง่ายๆ "สำหรับแต่ละตารางคัดลอก" ในกรณีใดกรณีหนึ่ง แน่นอนว่าสำหรับการออกครั้งเดียวการจัดระเบียบใหม่ + การจัดระเบียบใหม่ก็อาจจะใช้ได้เช่นกัน แต่ฉันก็แค่อยากจะทำให้ผู้คนกลัวว่าจะไม่พิจารณาการหดตัวแบบปกติ! (ฉันรู้จักคนจัดตารางเวลาทุกวัน)


16

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

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

สิ่งที่คุณอาจลองทำตอนนี้เมื่อคุณมีพื้นที่ว่างทั้งหมดในไฟล์กำลังสร้างดัชนีของคุณใหม่เพื่อให้ได้ประสิทธิภาพที่ดีที่สุด (และจะเจ็บปวดน้อยกว่าเมื่อคุณมีพื้นที่ว่างให้ทำเช่นนี้ - ลองคิดเปลี่ยนเสื้อกันหนาวในตู้เสื้อผ้าเล็ก ๆ กับห้องนอนใหญ่)

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


@Aarron Bertrand มันใช้เวลา 10 ปีกว่าจะได้มาซึ่งเรื่องใหญ่และดิสก์นั้นเป็นเรื่องที่น่ากังวลอย่างมาก ฉันคิดว่าจะลดขนาดลงเหลือ 60GB ด้วยการเพิ่มความจุ 5gb จริงๆสิ่งเดียวที่คุณแนะนำคือสร้างดัชนีใหม่ใช่มั้ย ฉันคิดว่าคนจะมีคำแนะนำเพิ่มเติม
bumble_bee_tuna

และฉันจะแนะนำเฉพาะการสร้างใหม่หากพวกเขาต้องการมัน แต่ฉันจะทำก่อนที่คุณจะย่อขนาดไฟล์ นึกไม่ออกเลยว่าหัวคุณจะทำอะไรกับพื้นที่ว่างที่จะทำให้เกิดประสิทธิภาพสูงสุดในกรณีทั่วไป ...
Aaron Bertrand

2

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

หากเป้าหมายสุดท้ายของคุณคือลดขนาดการสำรองข้อมูลตรวจสอบให้แน่ใจว่าคุณใช้กลยุทธ์การสำรองข้อมูลแบบครบวงจรเพื่อล้างบันทึกธุรกรรมและเมื่อคุณสำรองฐานข้อมูลให้ใช้ตัวเลือกการบีบอัด

ฉันจะไม่แนะนำการเติบโตอัตโนมัติ 5GB เว้นแต่ว่าโดยปกติคุณจะคาดหวังว่าจะเติบโต 5GB บ่อยครั้ง คุณอาจมีปัญหาเรื่องประสิทธิภาพเป็นระยะ ๆ เป็นอย่างอื่น ขนาดข้อมูลของคุณควรถูกตั้งค่าเป็นสิ่งที่คุณคิดว่าจำเป็นสำหรับพูดปีและการตั้งค่าการเติบโตอัตโนมัติควรเป็นขนาดที่คุณทดสอบไม่ส่งผลกระทบต่อประสิทธิภาพการทำงาน ดูอย่าแตะต้องปุ่มลดขนาดฐานข้อมูลใน SQL Server! โดย Mike Walsh

การสร้างดัชนีใหม่ก่อนที่จะย่อขนาดจะทำให้ดัชนีถูกจัดวางอย่างไม่เหมาะสม มันไม่ดีเลยที่จะสร้างใหม่แล้วหดตัว การหดขนาดทำให้ดัชนีมีการพันกันเพื่อกู้คืนพื้นที่ - ดังนั้นการสร้างใหม่ล่วงหน้าก่อนจากนั้นการหดจะไม่มีประโยชน์ ดูเวลาที่จะใช้ Auto Shrinkโดย Thomas LaRock


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

และแน่นอนว่านี่คือการสมมติว่าดัชนีของข้อมูลที่ยังคงอยู่จะต้องถูกสร้างขึ้นมาใหม่จริง ๆ บางทีพวกมันอาจจะอยู่ในสภาพที่ดีอยู่แล้ว
Aaron Bertrand

1

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


1

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

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

ยิ่งไปกว่านั้นนี่เป็นสถานการณ์ที่ยอดเยี่ยมสำหรับการย่อขนาด:

  1. สร้างสคริปต์ที่จะค้นหาวัตถุทั้งหมดและกลุ่มไฟล์ในฐานข้อมูลของคุณ (ตัวอย่างมากมายออนไลน์) ใช้สิ่งนี้เพื่อสร้างส่วนคำสั่งหล่นรวมถึงสร้างคำจำกัดความสำหรับดัชนีและข้อ จำกัด ทุกข้อของคุณ
  2. สร้างไฟล์ & กลุ่มไฟล์ใหม่และทำให้เป็นค่าเริ่มต้น
  3. ปล่อยดัชนีที่ไม่เป็นคลัสเตอร์ทั้งหมด (หมายเหตุดัชนีบางตัวอาจมีข้อ จำกัด )
  4. สร้างดัชนีคลัสเตอร์ของคุณในกลุ่มไฟล์ใหม่ด้วย DROP_EXISTING = ON (ซึ่ง btw เป็นการดำเนินการที่รวดเร็วและมีการบันทึกที่น้อยมากเพื่อเริ่มต้นด้วยการเปรียบเทียบกับทางเลือกอื่น ๆ )
  5. สร้างดัชนีที่ไม่คลัสเตอร์ของคุณใหม่
  6. สุดท้าย SHRINK ไฟล์ข้อมูลเก่าของคุณ (ปกติจะเป็นไฟล์หลัก)

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

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