2009-04-30 6 views
10

प्रदर्शन या लचीलापन के मामले में बिट मास्क को स्टोर करने के लिए int बनाम varbinary का उपयोग करने का कोई फायदा है।एसक्यूएल सर्वर: थोड़ा मास्क स्टोर करने के लिए varbinary या int?

मेरे उद्देश्यों के लिए, मैं हमेशा इन बिट मास्क (कोई लिखना या अपडेट नहीं) पर पढ़ता रहता हूं।

उत्तर

15

आपको निश्चित रूप से INT (यदि आपको 32 झंडे की आवश्यकता है) या BIGINT (64 झंडे के लिए) का उपयोग करना चाहिए। यदि आपको अधिक झंडे की आवश्यकता है तो आप BINARY का उपयोग कर सकते हैं (लेकिन आपको शायद यह भी पूछना चाहिए कि आपको अपने आवेदन में इतने सारे झंडे क्यों चाहिए)।

इसके अलावा, यदि आप एक अभिन्न प्रकार का उपयोग करते हैं, तो आप मानक bitwise operators का उपयोग सीधे बाइट सरणी को अभिन्न प्रकार में परिवर्तित किए बिना कर सकते हैं।

यदि आपको अधिक झंडे की आवश्यकता है और BINARY का उपयोग करना है तो आप bitwise ऑपरेटरों के लिए मूल समर्थन खो देते हैं और इसलिए ध्वज मूल्यों की जांच के लिए आसान समर्थन। मैं शायद क्लाइंट एप्लिकेशन के लिए ध्वज मूल्यों की जांच करना चाहता हूं लेकिन यदि आप टी-एसक्यूएल में प्रोग्रामिंग आरामदायक हैं तो यह भी एक विकल्प है। यदि आप सी # का उपयोग कर रहे हैं तो आपके पास आवश्यक संचालन के साथ BitArray कक्षा है और जावा में आपके पास BitSet कक्षा है।

+1

हाँ, या छोटे छोटे मास्क के लिए छोटे int जैसे छोटे प्रकार की घटना? मैंने अभी तक थोड़ा सा मास्क के रूप में एक छोटा सा int उपयोग नहीं किया है, लेकिन कोई मुद्दा नहीं होना चाहिए। int काम महान है। –

+1

छोटे मास्क के लिए छोटे प्रकार भी एक अच्छा विचार है। –

+0

जब हम हैं, उदाहरण के लिए, 100 झंडे जब हम varbinary का उपयोग कैसे कर सकते हैं? क्या varbinary int या bigint के रूप में लचीला के रूप में इस्तेमाल किया जा सकता है? दो varbinary पर bitwise ऑपरेशन करना संभव नहीं है। हम अंतर-ध्वज व्यवहार की नकल कैसे कर सकते हैं? – aldebaran

2

ठीक है, एक इंट पर विचार करने से कम भंडारण स्थान होता है और आमतौर पर काम करने में थोड़ा आसान होता है, मुझे यकीन नहीं है कि आप एक varbinary का उपयोग क्यों करेंगे।

6

इसे आम तौर पर थोड़ा मुखौटा के बजाय बिट कॉलम का एक समूह उपयोग करने के लिए बेहतर माना जाता है। वे पृष्ठ में एक साथ पैक हो जाएंगे, इसलिए वे और अधिक जगह नहीं लेंगे। हालांकि मैं हमेशा कॉलम नाम टाइपिंग से बचने के लिए एक int या bigint कॉलम के साथ जाना प्रतीत होता हूं .. लेकिन इंटेलिजेंस के साथ मैं शायद थोड़ा कॉलम के साथ जाऊंगा।

+7

मैं असहमत हूं, बिटकमास्क में अभी भी उनकी जगह है और वे आपके डीबी और चयन/दृश्य/SPROCS को एक साधारण बूल जोड़ने के लिए बिना किसी विकल्प को खोलने के अपने विकल्पों को छोड़ने का एक शानदार तरीका हैं, वे बहुत लचीले हैं ... केवल अधिकांश प्रोग्रामर नहीं समझें कि वे इन दिनों क्या हैं –

+5

प्रोग्रामर अज्ञानता कभी-कभी दिखाती है कि हम इंजन और ढांचे के अंदर दूर निम्न स्तर के अनुकूलन को कम करने के लिए अच्छी प्रगति कर रहे हैं। व्यक्तिगत बिट फ़ील्ड: 1. इंजन द्वारा कुशलता से संभाला जाता है (एक साथ पैक किया जाता है, टीएसक्यूएल के बजाय मूल कोड द्वारा छेड़छाड़ की जाती है)। 2. अपने प्रश्नों को अधिक समझने योग्य बनाने के अर्थपूर्ण नाम हैं (मनमानी बिट इंडेक्स संख्याओं का उपयोग करने के बजाय)। 3. प्रश्नों को तेज करने, उन पर अनुक्रमित किया जा सकता है। 4. व्यक्तिगत रूप से विन्यास योग्य डिफ़ॉल्ट मान हो सकता है। 5. यदि आप तय करते हैं कि क्षेत्र को दो से अधिक राज्यों की आवश्यकता है तो बड़े पैमाने पर पुन: प्रतिक्रिया करना आसान है। आदि – Triynko

+0

बिल्कुल। एसक्यूएल में बिटमैस्क बस एसक्यूएल क्या कर सकता है मार डालो - आप कभी भी उन्हें कुशलता से पूछने में सक्षम नहीं होंगे। Ergo वे इस्तेमाल नहीं किया जाना चाहिए। – TomTom

1

मैं आम तौर पर बिट फ़ील्ड का उपयोग करने के @ हैनस्टेक के उत्तर से सहमत हूं, क्योंकि आप स्पष्ट रूप से प्रत्येक बिट फ़ील्ड को नामित कर सकते हैं ताकि यह इंगित किया जा सके कि उसे क्या स्टोर करना चाहिए। हालांकि मैंने बिट फ़ील्ड के साथ बिटमैस्क तुलना करने के लिए व्यावहारिक दृष्टिकोण नहीं देखा है। SQL सर्वर के bitwise ऑपरेटरों के साथ (&, |, आदि ...) यह पता लगाना आसान है कि झंडे की एक श्रृंखला सेट की गई है या नहीं। बड़ी संख्या में बिट फ़ील्ड के खिलाफ समानता ऑपरेटरों के साथ ऐसा करने के लिए बहुत अधिक काम।

+1

इसके अलावा ... टोपी बिटवाई ऑपरेटर फोर्स एक टेबल स्कैन जो प्रदर्शन को मारता है जबकि अविभाज्य बिट फ़ील्ड कुशलतापूर्वक पूछताछ की जा सकती है। – TomTom