Score:0

SQL Server - วิธีแยกไฟล์ mdf เดียวออกเป็นหลาย ๆ ไฟล์และข้อมูลตารางพาร์ติชันระหว่างกัน

ธง pl

ด้วยความหวังที่จะปรับปรุงประสิทธิภาพของ SQL Server ฉันต้องการใช้ฐานข้อมูล 1 ไฟล์ (1 mdf & 1 ldf) อย่างง่ายของฉันและแยกไฟล์ mdf (และอาจเป็นไฟล์ ldf) ในดิสก์ไดรฟ์หลายตัว ฉันคิดว่าวิธีที่มีประสิทธิภาพมากที่สุดในการดำเนินการนี้คือการแบ่งตารางขนาดใหญ่ในไฟล์ mdf หลายไฟล์เหล่านั้น (ฉันวางแผนที่จะใช้ฟังก์ชันพาร์ติชันซึ่งเป็นโมดูลัสของคีย์หลัก (ซึ่งเป็น int หรือ bigint) เช่น (MyTable.Id % 8) โดยที่ 8 คือจำนวนดิสก์ที่ฉันมี)

วิธีที่เร็วที่สุด/ดีที่สุด/ถูกต้องในการทำเช่นนี้คืออะไร? เช่น คำสั่ง SQL หรือการดำเนินการ SSMS ใดที่ฉันต้องทำเพื่อให้ฉันจากที่ที่ฉันอยู่ไปยังที่ที่ฉันต้องการไป

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

Score:1
ธง cn

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

กระบวนการสร้างใหม่จะมีลักษณะดังนี้ สมมติว่าดัชนีปัจจุบันมีคำจำกัดความต่อไปนี้:

สร้างดัชนีคลัสเตอร์ [CIX_foo] บน dbo.foo (FooID) บน [หลัก];

คุณสามารถสร้างใหม่ได้ดังนี้:

สร้างดัชนีคลัสเตอร์ [CIX_foo] บน dbo.foo (FooID) ด้วย (drop_existing = on) บน [NewFileGroup];

ใช้ตัวเลือกอื่นๆ ที่คุณมักจะใช้ในการสร้างดัชนีนั้น (เช่น sort_in_tempdb, pad_index, online, resumable เป็นต้น)พิจารณาด้วยว่าการเปลี่ยนการตั้งค่าการบีบอัดของดัชนีที่มีอยู่เหมาะสมหรือไม่ - คุณกำลังเขียนดัชนีใหม่ทั้งหมด ดังนั้นถึงเวลาแล้ว!

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

N73k avatar
pl flag
ขอบคุณเบ็น คำถามที่ 1: SQL Server จะรู้ได้อย่างไรว่าไฟล์ใดที่บันทึกนั้นอยู่ในไฟล์ใด คำถามที่ 2: จะมีข้อได้เปรียบด้านความเร็วในการใช้ฟังก์ชันพาร์ติชันเหมือนที่ฉันพูดในคำถามเดิมหรือไม่ คำถามที่ 3: ฉันเดาว่าถ้าฉันต้องการย้ายดัชนี (ไม่ใช่แค่ตาราง) ไปยังกลุ่มไฟล์ใหม่นั้น (และกระจายข้อมูลทั่วทั้งไฟล์) ฉันจะต้องทำคำสั่งประเภทเดียวกันสำหรับแต่ละดัชนี
Ben Thul avatar
cn flag
1. ค่อนข้างเกินขอบเขตของคำถาม นั่นคือการมีความรู้นั้นช่วยคุณแก้ปัญหาอะไรได้บ้าง 2. การแบ่งพาร์ติชั่นใน mssql เป็นการจัดการข้อมูลมากกว่าประสิทธิภาพ ช่วยให้คุณสามารถสลับข้อมูลเข้า/ออกจากตารางเป็นการดำเนินการข้อมูลเมตา กรณีคลาสสิกคือการโหลด DW ที่คุณต้องการ ETL ข้อมูลมูลค่าหนึ่งวันลงในตารางแสดงสถานะ แล้วสลับข้อมูลนั้นเมื่อคุณทำเสร็จแล้ว 3. ใช่ - ทุกฮีปหรือ B-tree มีอยู่ในพื้นที่ข้อมูล กลุ่มไฟล์เป็นพื้นที่ข้อมูลประเภทหนึ่ง (อีกประเภทหนึ่งคือโครงร่างพาร์ติชัน) ดัชนีใด ๆ ที่คุณต้องการใน FG ใหม่จะต้องถูกย้ายอย่างชัดเจน
N73k avatar
pl flag
สำหรับ Q1: ฉันสนใจการแสดง ดังนั้น หาก SQL Server ต้องการเพิ่มระเบียนบางรายการ จะต้องตรวจสอบทุกไดรฟ์เพื่อดูว่าระเบียนเหล่านั้นอยู่ที่ไหนหรือควรอยู่หรือไม่ หรือมีวิธีทราบอย่างรวดเร็ว (แม้ว่าจะไม่มีฟังก์ชันพาร์ติชัน) ว่าข้อมูลนั้นอยู่ที่ไหน (หรือ ควรไป) เพื่อให้เข้าถึงเพียง 1 ดิสก์?
Ben Thul avatar
cn flag
ข้อมูลจะถูกกระจายอย่างเท่าเทียมกันในทุกไฟล์ใน FG เพื่อจัดการกับข้อกังวลของคุณ SQL จะไม่กระจาย/รวบรวมเพื่อค้นหาข้อมูล แต่นำทาง B-tree เพื่อค้นหาหน้าข้อมูลที่เหมาะสม (และตามนามสกุล ไฟล์ที่มีหน้าเหล่านั้น)
N73k avatar
pl flag
เบ็น ผ่านไปพักหนึ่งแล้ว และคุณยังไม่มีทองคำเลย แต่ไม่ใช่อีกต่อไป

โพสต์คำตอบ

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