ขนาดฐานข้อมูล SQL Server ไม่ลดลงหลังจากลบแถวจำนวนมาก


26

ฉันไม่เก่งเรื่อง SQL แต่มีฐานข้อมูลที่จะดูแล

แทบจะไม่มีที่เหลือเลยดังนั้นฉันจึงตัดสินใจลบข้อมูลทั้งหมดสำหรับปี 2008 หลังจากดำเนินการลบแบบสอบถาม (มีการทำความสะอาดประมาณ 10,000,000 แถว) และการทำความสะอาดบันทึกธุรกรรมฉันพบว่าฉัน การกระทำไม่มีผลกับขนาดฐานข้อมูล มีอะไรอีกบ้างที่ฉันต้องทำ?

คำตอบ:


16

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

ในโลกอุดมคติ - คุณต้องสร้างฐานข้อมูลของคุณด้วยพื้นที่ว่างมากมายเพื่อเติบโต ฉันเรียกสิ่งนี้ว่า "Right Sizing" ฐานข้อมูลของคุณ คุณจะอนุญาตให้มีพื้นที่ว่างนี้และไม่พยายามให้คืนและรักษาขนาดโดยรวมให้เหมาะสมกับขนาดที่คุณใช้ .. ทำไม? เพราะฐานข้อมูลของคุณจะเติบโตอีกครั้ง .. จากนั้นคุณจะหดอีกครั้ง .. และคุณจะติดอยู่ในรูปแบบที่น่ากลัวของการหดตัวที่ไร้ประโยชน์ตามด้วยการเติบโต - และตลอดเวลา เพิ่มการกระจายตัวของดัชนีของคุณ

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

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

ด้วย คุณบอกว่าคุณ "เคลียร์" บันทึกธุรกรรมของคุณ ฉันอยากรู้ว่าคุณทำสิ่งนี้อย่างไร แต่เมื่อคุณอ่านโพสต์ที่ฉันแชร์และคนอื่น ๆ ในซีรีส์คุณจะเห็นคำแนะนำเกี่ยวกับการจัดการบันทึกธุรกรรม แต่ในระยะสั้น - หากคุณอยู่ในโหมดการกู้คืนแบบเต็มคุณควรทำการสำรองข้อมูลบันทึกปกติเพื่อให้บันทึกนำมาใช้ซ้ำ มิฉะนั้น - โดยไม่มีการสำรองข้อมูลบันทึกขณะที่อยู่ในโหมดเต็ม - ไฟล์บันทึกช่วยให้การเติบโตและการเติบโตและการเติบโตและการบันทึกสิ่งที่คุณทำเพราะคุณบอก SQL คุณไม่เพียงแค่ต้องการรักษาบันทึกนั้นเพื่อการกู้คืนความผิดพลาด แต่ต้องการเก็บ การสำรองข้อมูลด้วยตนเองของมันเพื่อเล่นซ้ำธุรกรรม / เลิกทำธุรกรรมเพื่อกู้คืนไปยังจุดที่กำหนดในเวลาสำหรับการกู้คืน ... หากคุณอยู่ในที่เรียบง่ายและเห็นบันทึกการเติบโตมากเกินไปBEGIN TRAN ... do work.... COMMIT TRANหรือไม่ว่าคุณเพิ่งจะออกDELETEคำสั่งขนาดใหญ่หนึ่งคำสั่งและลบข้อมูลทั้งหมดในธุรกรรมโดยนัยเดียว)

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


9

การลบแถวในฐานข้อมูลจะไม่ลดขนาดไฟล์ฐานข้อมูลจริง

คุณต้องกระชับฐานข้อมูลหลังจากลบแถว

SQL Server 2005 DBCC SHRINKDATABASE (Transact-SQL)

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

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


4

อย่าหดฐานข้อมูลของคุณ!

"เหตุใดจึงเป็นเช่นนี้การดำเนินการย่อขนาดไฟล์ข้อมูลจะทำงานในไฟล์เดียวในแต่ละครั้งและใช้บิตแมปของ GAM (ดูในเครื่องมือจัดเก็บข้อมูล: GAM, SGAM, PFS และแผนที่การจัดสรรอื่น ๆ ) เพื่อค้นหาหน้าสูงสุด ไฟล์จากนั้นจะย้ายมันไปทางด้านหน้าของไฟล์เท่าที่จะทำได้และต่อ ๆ ไปในกรณีข้างต้นจะกลับคำสั่งของดัชนีคลัสเตอร์โดยสมบูรณ์ "

http://www.sqlskills.com/BLOGS/PAUL/post/Why-you-should-not-shrink-your-data-files.aspx

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

http://blog.sqlauthority.com/2011/01/19/sql-server-shrinking-database-is-bad-increases-fragmentation-reduces-performance/


1
คุณควรย้ายข้อมูลไปยังกลุ่มไฟล์ใหม่แล้วลบกลุ่มไฟล์เก่า วิธีนี้คุณจะไม่ได้รับการกระจายตัวและสามารถลดขนาดฐานข้อมูลของคุณ
Ali Razeghi

2

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


1

ฉันพบสิ่งนี้เพราะฉันเพิ่งลบตารางสำรองจำนวนมากเนื่องจากฐานข้อมูลของฉันมี "maxed out" ฉันเฝ้าดูคุณสมบัติ "ขนาด" คิดอยู่ว่าทำไมมันถึงเล็กกว่านี้ . หลังจากอ่านสิ่งนี้ไม่ฉันไม่ต้องการลดขนาดฐานข้อมูล สิ่งที่ฉันต้องการทำคือ "เรียกคืน" พื้นที่สำหรับขยะที่ฉันเพิ่งลบ สิ่งที่ฉันต้องการดูคือ "Space Available" ฉันคิดว่าบางทีนั่นอาจเป็นสิ่งที่คนอื่นต้องมองเช่นกัน?


0

น่าสังเกตว่าถ้าตารางมีดัชนีอยู่การแตกแฟรกเมนต์สามารถเกิดขึ้นได้หลังจากลบข้อมูลขนาดใหญ่ ฉันมีตารางวันนี้ที่มี ~ 70M บันทึกในนั้นใช้เวลาประมาณ 13GB ฉันทำความสะอาดมันลงไปที่ 1639 บันทึก (ส่วนที่เหลือถูกสร้างขึ้นโดยข้อผิดพลาดเดียว) แต่ตารางยังคงใช้ประมาณ 4.5GB หลังจากที่ฉันสร้างดัชนีทั้งหมดขึ้นใหม่บนโต๊ะมันก็แค่ 85 หน้า (680kb) หลังจากนั้นฉันใช้ shrinkfile แบบเพิ่มหน่วยเพื่อเรียกคืนพื้นที่ (และแก้ไขข้อผิดพลาดในระบบเพื่อป้องกันการเกิดซ้ำ)

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