SQL Server 2008 - ดัชนีการแบ่งพาร์ติชันและคลัสเตอร์


16

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

ความคิดเห็นเกี่ยวกับวิธีที่เราคิดใหม่แง่มุมของการออกแบบน่าจะถูกต้อง แต่ไม่ช่วยเหลือ :)

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

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

ขณะนี้เราจัดกลุ่มในฟิลด์ที่เราจะเรียกIncidentKeyซึ่งเป็นvarchar(50)และไม่ซ้ำกัน - เราสามารถมีได้ระหว่าง 1-100 รายการด้วยเหมือนกันIK(ไม่มีความคิดเห็นโปรด) เรามักจะได้รับข้อมูลใหม่ในIncidentKeyบันทึกเก่า ๆดังนั้นจึงไม่ต่อเนื่องกัน

ฉันเข้าใจว่าฉันต้องรวมฟิลด์พาร์ติชันIncidentDateของฉันไว้ในคีย์ดัชนีคลัสเตอร์เพื่อให้พาร์ติชันทำงานได้อย่างถูกต้อง IncidentKey, IncidentDateฉันคิดว่ามันจะเป็น

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

ตัวอย่างเช่นฉันมี 5 บันทึก:

IncidentKey    Date

ABC123        1/1/2010
ABC123        7/1/2010
ABC123        1/1/2011
XYZ999        1/1/2010
XYZ999        7/1/2010

ถ้าฉันได้รับการบันทึกสถิติใหม่สำหรับABC123, 2/1/2011มันจะต้องอยู่ในดัชนีคลัสเตอร์ก่อน XYZ999, 1/1/2010มันทำงานอย่างไร

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


เหตุใดการตัดสินใจแบ่งพาร์ติชันของตารางจึงเกิดขึ้น ประโยชน์ที่คาดหวังจากการแบ่งพาร์ติชันคืออะไร
Remus Rusanu

@Remus - ฉันกำลังทำการทดสอบดังนั้นเราจะมีหนึ่งพาร์ติชันและหนึ่งเวอร์ชันที่ไม่ได้แบ่งพาร์ติชัน ประโยชน์ที่คาดหวังจะลดลงเวลาในการโหลดและเวลาในการสร้างดัชนี เราดำเนินการ ETL รายเดือนซึ่งใช้เวลาประมาณหนึ่งสัปดาห์และความหวังคือสิ่งนี้จะลดเวลาลงอย่างมาก เรายังมีการติดตั้งประมาณ 3 TB ที่เราหวังว่าจะลดลงด้วยสิ่งนี้
JNK

คำตอบ:


18

ตารางที่แบ่งพาร์ติชันนั้นจริงๆแล้วเหมือนกับชุดของแต่ละตารางที่เย็บเข้าด้วยกัน ดังนั้นในตัวอย่างของการทำคลัสเตอร์โดยIncidentKeyและแบ่งพาร์ติชันโดยIncidentDateบอกว่าฟังก์ชั่นการแบ่งพาร์ติชันแยกตารางออกเป็นสองพาร์ติชันเพื่อให้ 1/1/2010 อยู่ในพาร์ติชั่น 1 และ 7/1/2010 เป็นพาร์ติชันที่สอง ข้อมูลจะถูกจัดวางบนดิสก์ดังนี้:

Partition 1:
IncidentKey    Date
ABC123        1/1/2010
ABC123        1/1/2011
XYZ999        1/1/2010

Partition 2:
IncidentKey    Date
ABC123        7/1/2010
XYZ999        7/1/2010

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

แถวใด ๆ ในดัชนีที่ไม่ได้ทำคลัสเตอร์ใด ๆ จะมีคีย์ดัชนีคลัสเตอร์ซึ่งตรงกับแถวABC123,7/1/2010นั้น เนื่องจากคีย์ดัชนีคลัสเตอร์จะมีคอลัมน์คีย์การแบ่งพาร์ติชันเสมอเครื่องยนต์จะทราบเสมอว่าพาร์ติชัน (rowset) ของดัชนีคลัสเตอร์ใดเพื่อค้นหาค่านี้ (ในกรณีนี้ในพาร์ติชัน 2)

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

  • ดัชนีที่ไม่จัดแนวต้องการหน่วยความจำจำนวนมากสำหรับแผนการสืบค้นที่แน่นอน
  • ดัชนีที่ไม่จัดแนวป้องกันการดำเนินการสลับพาร์ติชันที่มีประสิทธิภาพ

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

  • ดัชนีที่จัดแนวหมายถึงไม่สามารถสร้าง / บังคับใช้ข้อ จำกัด เฉพาะได้อีกต่อไป (ยกเว้นคอลัมน์การแบ่งพาร์ติชัน)
  • คีย์ต่างประเทศทั้งหมดที่อ้างอิงถึงตารางที่แบ่งพาร์ติชันจะต้องมีคีย์การแบ่งพาร์ติชันในความสัมพันธ์ (เนื่องจากคีย์การแบ่งพาร์ติชันเกิดจากการจัดตำแหน่งในทุกดัชนี) และในทางกลับกันนั้นตารางทั้งหมดที่อ้างถึงตารางที่แบ่งพาร์ติชันนั้น คิดว่าคำสั่งซื้อ -> รายละเอียดการสั่งซื้อถ้าคำสั่งซื้อมี OrderID แต่ได้รับการแบ่งพาร์ติชันโดย OrderDate ดังนั้นคำสั่งซื้อรายละเอียดจะต้องประกอบด้วย OrderID ไม่เพียง แต่เท่านั้น แต่ยัง OrderDate เพื่อประกาศข้อ จำกัด รหัสต่างประเทศอย่างถูกต้อง

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

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

โอ้อีกหนึ่งสิ่งที่ทุกอาร์กิวเมนต์ของฉันเกี่ยวกับคีย์ต่างประเทศและผลกระทบระลอกของการเพิ่มมูลค่าคอลัมน์แบ่งพาร์ทิชันเพื่อตารางอื่น ๆ ใช้อย่างเท่าเทียมกันที่จะเข้าร่วม


สมบูรณ์แบบนี่คือสิ่งที่ฉันกำลังมองหา เราจะต้องใช้ดัชนีที่จัดเรียง b / c การสลับเป็นส่วนหนึ่งของการดึงสำหรับสิ่งที่เราต้องการจะทำกับสิ่งนี้ นอกจากนี้เรายังทำการจัดกลุ่มฟังก์ชันรวมตันในIncidentKeyฟิลด์นั้นซึ่งฉันคิดว่าสิ่งนี้จะขัดขวางอย่างจริงจัง ฉันขอขอบคุณทุกรายละเอียด!
JNK

โดยปกติประโยชน์ของการดำเนินการเปลี่ยนพาร์ติชันมีมากกว่าปัญหาทั้งหมด
Remus Rusanu

นั่นคือความหวังของเราเราจะเห็นในไม่ช้า!
JNK

9

เมื่อดัชนีคลัสเตอร์มีหลายพาร์ติชันแต่ละพาร์ติชันจะมีโครงสร้าง B-tree ที่มีข้อมูลสำหรับพาร์ติชันเฉพาะนั้น ตัวอย่างเช่นถ้าดัชนีคลัสเตอร์มีสี่พาร์ติชันมีโครงสร้าง B-tree สี่ตัว หนึ่งในแต่ละพาร์ติชัน อ้าง โครงสร้างดัชนีแบบคลัสเตอร์

แนวทางพิเศษสำหรับดัชนีที่แบ่งพาร์ติชัน

คุณสามารถสร้างพาร์ติชันเฉพาะของดัชนีพาร์ติชันใหม่ได้

เช่น

ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5;
GO

+1 สำหรับลิงค์ฉันได้อ่านคำแนะนำพิเศษ แต่พลาดย่อหน้านั้นไป คำถามติดตามผล - เราทำการรวมตัวกันเป็นจำนวนมากบนIncidentKeyสนามคุณคิดว่าสิ่งนี้จะส่งผลกระทบต่อประสิทธิภาพการทำงานหรือไม่ (ฉันรู้ว่าฉันยังต้องทำการทดสอบ)
JNK

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

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