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


9

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

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

ความเป็นไปได้บางอย่างที่ฉันสามารถนึกได้:

  1. REBUILD / REORGANIZE ดัชนี DBCC SHRINKFILE (โอเคนี่ไม่ใช่ตัวเลือกที่สมเหตุสมผลเนื่องจาก DBCC SHRINKFILE จะแยกส่วนปัสสาวะออกจากสิ่งที่มันสัมผัส แต่ฉันรวมไว้เพื่อความสมบูรณ์)
  2. สร้างฐานข้อมูลใหม่โดยอัตโนมัติปิดสถานะ สคริปต์และสร้างตารางทั้งหมดจากฐานข้อมูลต้นฉบับอีกครั้ง ใช้ bcp เพื่อส่งออก / นำเข้าข้อมูลไปยังฐานข้อมูลใหม่ตามลำดับคีย์ - คลัสเตอร์ สคริปต์และสร้างดัชนีทั้งหมดใหม่ คำนวณสถิติทั้งหมดอีกครั้งด้วยการสแกนแบบเต็ม
  3. สร้างฐานข้อมูลใหม่โดยอัตโนมัติปิดสถานะ สคริปต์และสร้างตารางทั้งหมดจากฐานข้อมูลต้นฉบับอีกครั้ง ใช้ SSIS หรือ T-SQL เพื่อถ่ายโอนข้อมูลไปยังฐานข้อมูลใหม่ สคริปต์และสร้างดัชนีทั้งหมดใหม่ คำนวณสถิติทั้งหมดอีกครั้งด้วยการสแกนแบบเต็ม

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

มีตัวเลือกอะไรที่ดี / ดีกว่านี้ในการทำสิ่งนี้? ความกังวลของฉันคือการย้ายข้อมูลไปในทางที่จะรักษาปัจจัยเติมสูงและในแบบที่ต่อเนื่องทางตรรกะ

แก้ไข:

ฉันควรพูดถึงว่าประมาณ 75% ของข้อมูลดูเหมือนว่าจะถูกเก็บไว้ในคอลัมน์ภาพ (LOB)


3
คุณ (หรือแอพลิเคชัน) การดูแลถ้าตารางร่างกายสิ้นสุดใน filegroup อื่น ๆ กว่าPRIMARY?
Jon Seigel

@ JonSeigel ฉันไม่คิดว่าจริง ๆ แล้วมันเป็นความคิดที่ดีเพราะมันจะช่วยให้ฉันมีปัญหาในการสร้างฐานข้อมูลแม่แบบและย้ายข้อมูลทั้งหมด
db2

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

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

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

คำตอบ:


1

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

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

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

ในบันทึกด้านข้างเพียงตรวจสอบว่าคุณกำลังใช้ประเภทข้อมูลล่าสุดสำหรับ LOBS ของคุณ เช่น nvarchar (สูงสุด) หรือ varchar (สูงสุด) แทน ntext หรือข้อความ, varbinary (สูงสุด) แทนภาพ?


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

@ จะโปร่งใสต่อแอปพลิเคชันจริงๆโดยที่เซิร์ฟเวอร์ SQL จะเก็บข้อมูลไว้ในแถวถ้า <8k หากผู้ขายบอกว่ามันไม่ได้รับการสนับสนุนฉันจะถามพวกเขาว่าทำไมพวกเขายังคงใช้ประเภทข้อมูลที่เลิกใช้แล้วใน SQL Server 2005!
DamagedGoods

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

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

รับทราบว่าอาจเป็นวิธีที่มีประโยชน์ในการสร้างสคริปต์การสร้างใหม่ที่เหมาะสมอย่างน้อยที่สุด
db2

0

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


ฉันสงสัยว่า filestream จะไม่ขยายขนาดในกรณีนี้ เรามีแถวมากกว่า 14 ล้านแถวในฐานข้อมูล 17 แห่งและเราได้รับข้อความประมาณ 15,000 ต่อวัน ส่วนเนื้อหาที่สำคัญมีขนาดต่ำกว่า 4 KB ดังนั้นกลุ่มของเสีย NTFS อาจจะโหดร้าย (และนั่นคือแม้ว่าเราจะเพิ่มไดรฟ์ข้อมูลดิสก์ใหม่ด้วยขนาดบล็อกที่เล็กกว่า 64KB)
db2

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

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