झंडे की एक सरणी (एक बिटमैप / बिट सरणी) संग्रहीत करने के लिए डेटा प्रकार


15

मुझे निम्न कार्यों का समर्थन करते हुए, तालिका के प्रत्येक रिकॉर्ड के लिए एक सा सरणी स्टोर करने की आवश्यकता है:

  • यदि थोड़ा सेट किया गया है, तो परीक्षण करना और थोड़ा सेट करना (SQL का उपयोग करके)

  • ADO 2.8 (ADO.NET नहीं) का उपयोग करके मान को क्वेरी करना और सेट करना

  • अनुक्रमण ("कवरिंग इंडेक्स" सुविधा से लाभ के लिए)

इस सरणी में संग्रहीत की जाने वाली बिट्स की अधिकतम संख्या निर्धारित है, लेकिन 32 से अधिक हो सकती है । यही है, एक साधारण इंट कॉलम हमेशा काम नहीं करता है।

मैंने अब तक जो देखा है, उससे मेरे विकल्प हैं:

  1. कई इंट कॉलम का उपयोग करें
  2. बिगिन्ट का उपयोग करें (बिट्स की संख्या के रूप में लंबे समय तक काम करता है <= 64)
  3. बाइनरी का उपयोग करें
  4. ?

पहला विकल्प काम करेगा, लेकिन डेटा को एक्सेस करने वाले कोड में काफी रिफैक्टिंग की आवश्यकता होती है। दूसरा विकल्प केवल एक अस्थायी राहत है, और मेरी खोजों से अब तक मुझे यकीन नहीं है कि अगर ADO बिगिन्ट के साथ अच्छी तरह से काम करता है । मुझे बाइनरी के साथ कोई अनुभव नहीं है , और मुझे किसी अन्य विकल्प के बारे में पता नहीं है।

आवश्यकताओं को देखते हुए आप कौन सा डेटा प्रकार चुनेंगे?

जवाबों:


12

मैं इसके लिए एक भी क्षेत्र का उपयोग नहीं करने की दृढ़ता से वकालत कर सकता हूं

मैं वर्तमान में एक bigintबिटमास्क क्षेत्र के साथ एक बहुत बड़े डेटासेट को बनाए रखने के साथ काम कर रहा हूं और यह थोड़ा बुरा प्रदर्शन है।

यदि आप एक बिट की जाँच करें यह ठीक है। यदि आप एक से अधिक बिट प्रदर्शन की जांच बहुत जल्दी करते हैं।

बिटमास्क पूर्णांकों की प्रकृति के कारण, डेटा वितरण बहुत असंतुलित हो जाएगा और आपको उप-योजनाएं मिलेंगी।

प्रत्येक पंक्ति के विरुद्ध चल रहे फ़ंक्शन के साथ कई बिट चेक परिणाम रेंज या इंडेक्स स्कैन करते हैं। यह एक गड़बड़ है।

मेरा वर्कअराउंड सरल था - मैंने जाँच की जाने वाली प्रत्येक स्थितियों के लिए PK को संग्रहीत करने के लिए एक तालिका बनाई। यह शुरू में काउंटर-सहज है, लेकिन आवश्यक स्थान कम है (आप केवल पीके स्टोर करते हैं) और लुकअप तेजी से चमक रहे हैं, खासकर यदि आप एक का उपयोग करते हैं UNIQUE CLUSTERED INDEX

आप अपनी मुख्य तालिका को प्रभावित किए बिना जितनी चाहें उतनी शर्तें जोड़ सकते हैं, और अपडेट भी आपकी मुख्य तालिका को प्रभावित नहीं करते हैं।

अनुक्रमण सरल है क्योंकि आप केवल सभी लुकअप तालिकाओं को व्यक्तिगत रूप से अनुक्रमित करते हैं, और चूंकि आपकी संकुल कुंजी आपकी मुख्य तालिका पर समान है और आपके सभी मूल्यांकनों के लुकअप merge joinबहुत ही कुशल हैं।


1
क्या आप अपने वर्कअराउंड पर थोड़ा और विस्तार कर सकते हैं? मुझे यह मिला क्योंकि मैं उसी मूल मुद्दे को संबोधित करने की कोशिश कर रहा हूं, लेकिन यह सुनिश्चित नहीं है कि यह कैसे करना सबसे अच्छा है।
जोशुआ फ्रैंक

4

यदि आपको सभी स्टोर करने की आवश्यकता है, तो यह सही / गलत मूल्यों की एक मध्यम संख्या है, आप bitडेटा प्रकार का उपयोग कर सकते हैं ।

आंतरिक रूप से, एसक्यूएल सर्वर bitकॉलम को बाइट्स "चंक्स" में पैक करता है। तो bitआपकी तालिका में 8 स्तंभों के लिए, SQL स्टोर जो कि एक पैक 1 बाइट के रूप में है; bit2 बाइट्स में 9-16 कॉलम, और इसी तरह।

ऐसा लगता नहीं है कि आप कॉलम की सीमा के निकट जा रहे हैं, इसलिए यह बहुत सीधा-सा प्रतीत होता है। और निश्चित रूप से, उन्हें अच्छी तरह से अलग रखते हुए कि आप स्तंभों को पठनीयता के लिए नाम दे सकते हैं और उन सभी अनुक्रमण संभावनाओं को प्राप्त कर सकते हैं जो आप सामान्य रूप से करेंगे (यदि झंडे अत्यधिक चयनात्मक हैं, तो फ़िल्टर किए गए अनुक्रमित उपयोगी हो सकते हैं यदि आप 2008+ को लक्षित कर सकते हैं)।

अपने आप को बिट-पैकिंग करने से इसे अनुक्रमण करने के लिए बहुत अधिक जटिल बना दिया जाएगा (संभवतः bitमुखौटा की प्रत्येक स्थिति का प्रतिनिधित्व करने के लिए गणना और अनुक्रमित कॉलम ... लेकिन फिर आप bitसीधे बनाम उपयोग करने से बदतर हो जाते हैं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.