การแบ่งพาร์ติชันตารางสำหรับเก็บข้อมูล


13

สถานการณ์:

  • สองฐานข้อมูล: DB_A และ DB_Archive กับหนึ่งตารางใหญ่มากที่เรียกว่า tableA
  • ทุกวันบันทึกที่เก่ากว่า 60 วันจะถูกลบออกจาก DB_A และย้ายไปที่ DB_Archive เป็นหลักเพื่อแยกสิ่ง "แยก" ออกเนื่องจาก tableA ถูกสอบถามอย่างหนักใน DB_A สำหรับบันทึกของ 2 เดือนที่ผ่านมา

ฉันต้องการกำจัดกระบวนการนี้เพราะมันช้าและสิ้นเปลืองทรัพยากรจำนวนมาก ฉันกำลังคิดที่จะนำตารางพาร์ติชั่นไปใช้บน DB_A ด้วยฟังก์ชั่นพาร์ติชั่นในคอลัมน์วันที่และเก็บบันทึกทั้งหมด <2 เดือนในหนึ่งพาร์ติชั่นและทุกเรคคอร์ด> 2 เดือนในอีกพาร์ติชันหนึ่ง คำถามของฉัน:

  • สถานการณ์นี้จะทำงานเป็นอย่างไรถ้าฉันมีฐานข้อมูล 2 แบบ ถ้าฉันค้นหา tableA สำหรับบันทึก> getdate () - 30 จะอ่านพาร์ติชันเก็บถาวรหรือไม่
  • ฉันคิดว่าฉันต้องแบ่งดัชนีด้วยใช่มั้ย
  • ฉันจะจัดการกับความจริงที่ว่าในวันพรุ่งนี้ฟังก์ชั่นพาร์ทิชันของฉันจะ "เปลี่ยน" ฉันหมายความว่าถ้าฉันสร้างฟังก์ชั่นวันนี้ (วันที่ 2 กรกฎาคมช่วงของมันจะเป็นวันที่ 2 พฤษภาคม แต่พรุ่งนี้จะเป็นวันที่ 3 พฤษภาคม) ฉันสามารถสร้างฟังก์ชั่นพาร์ทิชันแบบไดนามิกได้หรือไม่?

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

ฉันเขียนสคริปต์ตามตัวอย่างของสิ่งที่คุณต้องการทำเมื่อปีที่แล้ว มันเป็นกรณีพิเศษที่เราต้องการเก็บข้อมูล x วันในอาเรย์ (แพง) ที่รวดเร็วและย้ายข้อมูลที่เก็บถาวรไปยังที่เก็บข้อมูลที่ถูกกว่า ถ้าฉันสามารถฆ่าตัวอย่างสคริปต์ฉันจะโพสต์ไว้มิฉะนั้นจะเป็นบทสรุปของกระบวนการ
Mark Storey-Smith

สวัสดีทำเครื่องหมายใช่โปรดทำและถ้าคุณสามารถแบ่งปันประสบการณ์ของคุณเช่นกัน สำเร็จหรือไม่
Diego

มันใช้งานได้ แต่ในที่สุดก็ไม่จำเป็น (เราใช้เส้นทางที่เรียบง่ายกว่า) บางทีคุณอาจขยายขอบเขตว่าทำไมถึงมีขอบเขต 60 วันในกรณีของคุณ? จะช่วยให้ทุกคนนำคุณไปในทิศทางที่ถูกต้อง
Mark Storey-Smith

คำตอบ:


6

ด้วยการแบ่งพาร์ติชั่นคุณจะต้องทำพาร์ติชั่นต่อวันซึ่งกำหนดขีด จำกัด Pre-SQL 2012 ที่ 1,000 พาร์ติชั่นในมุมมองใหม่เนื่องจากจะอนุญาตให้เก็บถาวร 3 ปีเท่านั้น ด้วย SQL Server 2012 คุณจะได้รับ 15000 พาร์ติชั่นซึ่งมีมากมายสำหรับ 1 พาร์ติชั่นต่อวัน

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

ทั้งหมดดัชนีของคุณจะต้องสอดคล้องดูแนวทางพิเศษสำหรับดัชนีพาร์ติชัน

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


ขีด จำกัด ใหม่พร้อมใช้งานใน 2008 SP2 และ 2008 R2 SP1 blogs.msdn.com/b/hanspo/archive/2010/11/29/…
Jon Seigel

@ จอน: ในปี 2008 SP2 ดำเนิน 2008R2 SP1 มาพร้อมกับคำเตือนขนาดใหญ่ . As explained in this white paper, there are implications on certain features, including performance.การสนับสนุน SQL 2012 มาพร้อมกับไม่มีคำเตือน
Remus Rusanu

ขอบคุณสำหรับการชี้ให้เห็น; มันเป็นความจริงมีข้อแม้บางประการที่จะใช้ใน 2008/2008 R2 แต่เป็นตัวเลือกที่ใช้ได้ถ้าจำเป็น
Jon Seigel

ขอบคุณสำหรับความคิดเห็นของคุณ ฉันจะอ่านความคิดเห็นเนื้อหาในภายหลัง
Diego

2

ฉันไม่ทราบว่าฟังก์ชั่นพาร์ทิชันสามารถเป็นแบบไดนามิก แต่ฉันสงสัย ตัวเลือกบางอย่างสำหรับคุณโดยไม่ต้องไปเส้นทางนั้น:

1 - แบ่งพาร์ติชันในปฏิทิน DATE และย้ายพาร์ติชันที่เก่าแก่ที่สุดในแต่ละวัน

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

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


ฉันต้องการหลีกเลี่ยงการใช้งานแบบ "ทุกวัน" ด้วยตนเอง
Diego

2

นี่คือสิ่งที่ควรใช้กับคุณ: DB_A - tableA ที่มีพาร์ติชันที่แตกต่างกันสำหรับแต่ละ 60 วันล่าสุด - stagingTable เพื่อย้ายข้อมูลจากพาร์ติชันที่เก่าที่สุด

DB_Archive tableA - เก็บข้อมูลทั้งหมดที่เก่ากว่า 60 วัน (ไม่แบ่งพาร์ติชัน)

กระบวนการ: 1. ก่อนสิ้นวัน: เปลี่ยนฟังก์ชั่นพาร์ติชั่น - แบ่งช่วงเพื่อเพิ่มพาร์ติชั่นใหม่สำหรับวันใหม่ (หมายเหตุ: แทนที่จะสร้างพาร์ติชันสำหรับ "วันที่วันนี้ + 1 วัน" คุณอาจต้องการทำขั้นตอนต่อไปเช่น: "วันนี้วันที่ + 5 วัน"

  1. หลังจากสิ้นสุดแต่ละวันคุณจะสลับพาร์ติชันที่เก่าที่สุดใน DB_A.tableA เป็น DB_A.stagingTable ผสานพาร์ติชั่นที่เก่าแก่ที่สุด

  2. นำเข้าข้อมูลจาก DB_A.stagingTable ไปยัง DB_Archive.tableA ในที่สุด trunacte DB_A.stagingTable

ข้างต้นเรียกว่า Rolling Window และเป็นสถานการณ์ที่พบได้ทั่วไปสำหรับ VLDB เห็นนี้กระดาษสีขาวโดยไมโครซอฟท์ในการแบ่งพาร์ทิชัน: ตารางพาร์ทิชันและดัชนีกลยุทธ์หรือลองนี้เฉพาะในบานเลื่อนหน้าต่างสถานการณ์


0

คุณสามารถใช้วิธีการแบบไดนามิกของการเก็บถาวรและการล้างข้อมูลใน SQL Server กรุณาทำตามลิงค์ด้านล่างสำหรับสิ่งนั้น

http://www.sqlscientist.com/2012/09/auto-maintain-archival-process.html


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