ชนิดข้อมูลสำหรับเก็บอาร์เรย์ของแฟล็ก (อาเรย์บิตแมป / บิต)


15

ฉันต้องการจัดเก็บบิตอาร์เรย์สำหรับแต่ละระเบียนของตารางสนับสนุนการดำเนินการต่อไปนี้:

  • ทดสอบว่าตั้งบิตไว้หรือไม่และตั้งค่าบิต (โดยใช้ SQL)

  • การสืบค้นและการตั้งค่าโดยใช้ ADO 2.8 (ไม่ใช่ ADO.NET)

  • การจัดทำดัชนี (เพื่อรับประโยชน์จากคุณสมบัติ "ครอบคลุมดัชนี")

จำนวนสูงสุดของบิตจะถูกเก็บไว้ในอาร์เรย์นี้ได้รับการแก้ไขแต่อาจเกิน 32 นั่นคือคอลัมน์intแบบง่าย ๆไม่ได้ผลเสมอไป

จากสิ่งที่ฉันเห็นมาจนถึงตอนนี้ตัวเลือกของฉันคือ:

  1. ใช้คอลัมน์intหลายรายการ
  2. ใช้bigint (ทำงานตราบเท่าที่จำนวนบิตคือ <= 64)
  3. ใช้เลขฐานสอง
  4. ?

ตัวเลือกแรกจะใช้งานได้ แต่ต้องการการรีแฟคเตอร์เล็กน้อยในรหัสที่เข้าถึงข้อมูล ตัวเลือกที่สองเป็นการผ่อนปรนชั่วคราวเท่านั้นและจากการค้นหาของฉันจนถึงตอนนี้ฉันไม่แน่ใจว่า ADO ทำงานได้ดีกับbigintหรือไม่ ฉันไม่มีประสบการณ์กับไบนารีและฉันไม่ได้ตระหนักถึงตัวเลือกอื่น ๆ

คุณต้องการเลือกชนิดข้อมูลแบบใดตามข้อกำหนด

คำตอบ:


12

ฉันไม่สามารถสนับสนุนอย่างมากพอที่จะไม่ใช้เขตข้อมูลเดียวสำหรับเรื่องนี้

ขณะนี้ฉันกำลังจัดการกับการบำรุงรักษาชุดข้อมูลที่มีขนาดใหญ่มากกับbigintเขต bitmask และเป็นฝันร้ายของการแสดง

หากคุณตรวจสอบบิตเดียวก็ไม่เป็นไร หากคุณตรวจสอบมากกว่าหนึ่งบิตประสิทธิภาพลดลงอย่างรวดเร็ว

เนื่องจากธรรมชาติของจำนวนเต็ม bitmask การกระจายข้อมูลจะไม่สมดุลมากและคุณจะได้รับแผนน้อยที่สุด

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

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

คุณสามารถเพิ่มเงื่อนไขได้มากเท่าที่คุณต้องการโดยไม่มีผลกับตารางหลักของคุณและการปรับปรุงจะไม่มีผลกับตารางหลักของคุณ

การจัดทำดัชนีนั้นง่ายเนื่องจากคุณเพียงจัดทำดัชนีตารางการค้นหาทั้งหมดแยกต่างหากและเนื่องจากคีย์คลัสเตอร์ของคุณเหมือนกันในตารางหลักของคุณและการค้นหาการประเมินทั้งหมดของคุณmerge joinนั้นมีประสิทธิภาพมาก


1
คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับวิธีการแก้ปัญหาของคุณอีกเล็กน้อยได้ไหม? ฉันพบสิ่งนี้เพราะฉันพยายามแก้ไขปัญหาพื้นฐานเดียวกัน แต่ไม่แน่ใจว่าจะทำอย่างไรดีที่สุด
Joshua Frank

4

หากสิ่งที่คุณต้องเก็บคือจำนวนจริงของค่าจริง / เท็จคุณสามารถใช้bitชนิดข้อมูล

ภายใน SQL Server จะจัดเก็บbitคอลัมน์ที่บรรจุในไบต์ "chunks" ดังนั้นสำหรับbitคอลัมน์สูงสุด 8 คอลัมน์ในตารางของคุณ SQL จึงจัดเก็บเป็นจำนวน 1 ไบต์ 9-16 bitคอลัมน์ใน 2 ไบต์และอื่น ๆ

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

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

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