อะไรคือกายวิภาคของดัชนีคอลัมน์


20

หนึ่งในคุณสมบัติใหม่ในชื่อรหัส SQL Server 2012 Denaliคือดัชนี Columnstore

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

ฉันมีปัญหาในการรับข้อมูลที่ดีเกี่ยวกับinternalsของดัชนี columnstore

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

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

ข้อมูลเชิงลึกใด ๆ ที่ชื่นชม


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

อันที่จริงมันมีหลายคอลัมน์ นอกจากนี้ฉันสมมติว่าการใช้งาน SS อื่น ๆ มันจะแตกต่างจากผลิตภัณฑ์อื่นเล็กน้อย
JNK

สำหรับ MySQL แต่ใช้เช่นเดียวกัน: developer.bazaarvoice.com/why-columns-are-coolนอกจากนี้ Sybase IQ ยังเป็นพ่อที่ยิ่งใหญ่
gbn

3
@ConcernedOfTunbridgeWells - ดัชนี columnstore ใช้ดัชนีบิตแมปหรือไม่ ไม่ดัชนี Columnstore ใช้การแทนข้อมูลที่เป็นกรรมสิทธิ์โดยยึดตาม Vertipaq มันไม่เหมือนกับดัชนีบิตแมปและไม่ได้ใช้ แต่มีประโยชน์คล้ายกันกับดัชนีบิตแมปเช่นการลดเวลาที่ใช้ในการกรองคอลัมน์ที่มีค่าแตกต่างกันเล็กน้อย
Martin Smith

1
Remus Rusanu สมาชิกของทีมที่ Microsoft ที่พัฒนาคุณลักษณะนี้เพิ่งโพสต์ข้อความนี้: ภายในดัชนี SQL Server 2012 COLUMNSTORE
Nick Chammas

คำตอบ:


22

โครงสร้างคอลัมน์

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

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

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

ผู้ประกอบการแผนเฉพาะ

SQL Server 2012 แนะนำโหมดการดำเนินการใหม่ที่เรียกว่าโหมดแบทช์ ในโหมดนี้แพ็คเก็ตประมาณ 1,000 แถวจะถูกส่งผ่านระหว่างตัวดำเนินการปรับปรุงประสิทธิภาพการใช้งานโปรเซสเซอร์อย่างมีนัยสำคัญ ภายในแต่ละแพ็กเก็ตข้อมูลเรียงเป็นแนวจะแสดงเป็นเวกเตอร์ ผู้ประกอบการแผนบางรายไม่สนับสนุนการดำเนินการโหมดแบตช์ แต่ตัวอย่างของสิ่งที่รวมถึงการสแกนดัชนีคอลัมน์สโตร์, เข้าร่วมแฮชภายใน, สร้างตารางแฮชตารางชุดตัวกรองบิตแมป, รวมแฮช (ไม่ใช่สเกลาร์รวม), กรองและ การประเมินผล) แผนการดำเนินการแบบสอบถามได้รับการปรับปรุงเพื่อแสดงโหมดการดำเนินการโดยประมาณและตามจริง

ต่อต้านรูปแบบ

มีจำนวนมากของข้อ จำกัด ในการเปิดตัวครั้งแรกรวมทั้งข้อ จำกัด ในการอนุญาตเป็นชนิดข้อมูล ประเภททั่วไปส่วนใหญ่ได้รับการสนับสนุน; ชนิดข้อมูลที่ได้รับการสนับสนุนรวมถึงDECIMALมีมากขึ้นมีความแม่นยำมากกว่า 18 หลัก(N)VARCHAR(MAX), UNIQUEIDENTIFIERประเภท CLR (VAR)BINARYและ

การใช้ประเภทสตริง , OUTER JOIN, IN,EXISTS , NOT IN, OR, UNION ALLอาจส่งผลให้ประสิทธิภาพการทำงานลดลงอย่างมาก (แถวดำเนินโหมด) เว้นแต่การแก้ไขปัญหาที่ถูกว่าจ้างที่มักจะเกี่ยวข้องกับการปรับเปลี่ยนไวยากรณ์ที่ผิดปกติตามที่ปรากฏในบทความการเชื่อมโยงในส่วนนี้

ข้อมูลมากกว่านี้

รีมัส Rusanu ได้ blogged ภาพรวมที่ดีที่นี่

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