पृष्ठभूमि
पारंपरिक पंक्ति-मोड . में निष्पादन योजना, SQL सर्वर जल्दी सेमी जॉइन रिडक्शन performing के प्रदर्शन के हिस्से के रूप में एक बिटमैप ऑपरेटर पेश कर सकता है समानांतर हैश या मर्ज में शामिल होने से पहले। बिटमैप को बिल्ड इनपुट से बनाया गया है, और शामिल होने से पहले जांच इनपुट पर पंक्तियों को फ़िल्टर करने के लिए उपयोग किया जाता है। मैंने पंक्ति-मोड . के बारे में लिखा है बिटमैप्स पहले और वे दस्तावेज़ीकरण में भी शामिल हैं।
यह लेख बैच मोड . के बारे में है बिटमैप्स, जिनका कार्यान्वयन बहुत अलग है। SQL सर्वर 2012 में बैच मोड निष्पादन इंजन की पहली उपस्थिति के बाद से बड़े सुधार हुए हैं। यहां दिए गए विवरण SQL सर्वर 2017 पर लागू होते हैं - लेखन के समय सबसे हाल ही में जारी किया गया संस्करण। जैसे-जैसे हम आगे बढ़ेंगे पुराने संस्करणों के लिए विशिष्ट सुविधाओं का इनलाइन उल्लेख किया जाएगा।
क्वेरी ऑप्टिमाइज़र
बैच मोड में चलने वाला एकमात्र जॉइन ऑपरेटर हैश जॉइन है। क्वेरी ऑप्टिमाइज़र यह तय करता है कि बैच मोड हैश जॉइन (धारावाहिक या समानांतर) में बिटमैप होना चाहिए या नहीं। अनुकूलक एक काल्पनिक अर्ध जुड़ाव की चयनात्मकता की गणना करके बिटमैप की संभावित उपयोगिता का आकलन करता है जॉइन की(ओं) पर हैश जॉइन इनपुट्स।
एक सेमी जॉइन समझ में आता है, क्योंकि बिटमैप फ़िल्टरिंग का कार्य उन पंक्तियों को जांच पक्ष से हटाना है जो बिल्ड साइड पर मौजूद नहीं हैं। यदि सेमी जॉइन की अनुमानित चयनात्मकता 0.75 . है या कम, ऑप्टिमाइज़र बैच मोड बिटमैप फ़िल्टर का उपयोग करके इसे सार्थक मानता है। दूसरे शब्दों में, एक बिटमैप निर्दिष्ट किया जाता है यदि सेमी जॉइन कैलकुलेशन इंगित करता है कि 25% या अधिक प्रोब-साइड पंक्तियों को बिटमैप द्वारा समाप्त कर दिया जाएगा।
सटीक सेमी जॉइन चयनात्मकता का उपयोग केवल यह निर्धारित करने के लिए किया जाता है कि हैश जॉइन में बिटमैप होना चाहिए या नहीं। जांच पक्ष चयनात्मकता अनुमान (कार्डिनैलिटी अनुमानों पर प्रभाव के रूप में दृश्यमान) को इस तथ्य को प्रतिबिंबित करने के लिए संशोधित किया गया है कि बिटमैप गैर-योग्य पंक्तियों को हटाने में आम तौर पर सही नहीं होते हैं। यह विशेष रूप से मामला है जब बिटमैप को ब्लूम फ़िल्टर का उपयोग करके कार्यान्वित किया जाता है, जो झूठी सकारात्मक उत्पन्न कर सकता है (जांच-साइड पंक्तियां जो फ़िल्टर को पास करती हैं, लेकिन फिर भी बिल्ड साइड से जुड़ती नहीं हैं)।
चयनात्मकता राउंडिंग
ऑप्टिमाइज़र इस अनिश्चितता को ध्यान में रखते हुए सेमी जॉइन सेलेक्टिविटी को दस की शक्ति तक गोल कर देता है। यह गोल करने से पहले आधार-10 लघुगणक लेकर ऐसा करता है। उदाहरण के लिए, 0.316 की सेमी जॉइन चयनात्मकता एक लॉग देती है10 मान आंशिक रूप से -0.5 से नीचे है, जिसे -1 तक पूर्णांकित किया गया है। परिणामी जांच-पक्ष चयनात्मकता 10 =0.1 है। इसके विपरीत, 0.317 की सेमी जॉइन चयनात्मकता एक लॉग देती है10 -0.5 के ठीक ऊपर का मान, जो शून्य पर गोल है। इसलिए जांच-पक्ष चयनात्मकता 10 =1 है (सभी पंक्तियाँ गुजरती हैं)। संगणना की इस श्रृंखला के परिणामस्वरूप संभावित जांच-पक्ष बिटमैप चयनात्मकता 1, 0.1, 0.01, 0.001 और इसी तरह हैं। ध्यान दें कि एक बिटमैप का उपयोग तब भी किया जा सकता है जब अनुमानित चयनात्मकता को 1 तक पूर्णांकित किया जाता है (सभी पंक्तियाँ विधेय को पार करती हैं)।
ऑपरेटर और कार्डिनैलिटी अनुमान
कोई अलग बिटमैप नहीं है बैच मोड हैश जॉइन के लिए ऑपरेटर। इसके बजाय, हैश जॉइन ऑपरेटर के पास बिटमैप क्रिएटर . है संपत्ति (सत्य पर सेट), या संपत्ति गुम है (झूठी पर सेट नहीं)। पंक्ति मोड और बैच मोड निष्पादन के बीच यह अंतर यह देखना कम आसान बनाता है कि क्या बिटमैप बनाया जा रहा है, लेकिन यह अंतर्निहित प्रक्रिया को अधिक सटीक रूप से प्रतिबिंबित करता है:पंक्ति-मोड निष्पादन में, बिटमैप हैश जॉइन बिल्ड इनपुट तक पहुंचने से पहले, ऑपरेटर बिटमैप को पॉप्युलेट करता है क्योंकि पंक्तियाँ इसके माध्यम से प्रवाहित होती हैं। दूसरे शब्दों में, बिटमैप और हैश तालिका को पंक्ति मोड निष्पादन के तहत समवर्ती रूप से बनाया गया है। बैच मोड में, बिटमैप बनने से पहले हैश तालिका पूरी तरह से तैयार हो जाती है (इस पर जल्द ही और अधिक)।
क्वेरी ऑप्टिमाइज़र हैश जॉइन के जांच पक्ष पर बैच मोड बिटमैप फ़िल्टर की स्थिति के बारे में लागत-आधारित विकल्प नहीं बनाता है। यह केवल यह मानता है कि बिटमैप की चयनात्मकता जांच पक्ष के सभी चाइल्ड ऑपरेटरों पर लागू होगी। वास्तव में, बिटमैप केवल एक बार ऑप्टिमाइज़र द्वारा एक अंतिम निष्पादन योजना का चयन किए जाने के बाद जांच की ओर नीचे धकेल दिया जाता है। यदि बिटमैप को पूरी तरह से एक लीफ ऑपरेटर तक नहीं धकेला जा सकता है, तो कार्डिनैलिटी का अनुमान थोड़ा अजीब लगेगा। यह एक समझौता है जिसे भविष्य में सुधारा जा सकता है।
निष्पादन इंजन
जबकि अनुकूलक यह तय करता है कि क्या हैश जॉइन बैच मोड बिटमैप का उपयोग किया जाना चाहिए या नहीं, बैच मोड निष्पादन इंजन प्रकार तय करता है बिटमैप रनटाइम पर उपयोग करने के लिए। यह निर्णय हैश तालिका निर्माण के दौरान बिल्ड-साइड जॉइन कुंजियों के बारे में एकत्रित सांख्यिकीय जानकारी द्वारा सूचित किया जाता है। जैसा कि पहले उल्लेख किया गया है, पंक्ति-मोड निष्पादन के विपरीत, बैच-मोड हैश बिटमैप बनाने के लिए हैश तालिका पर एक अलग पास करने से पहले पूरी तरह से हैश तालिका का निर्माण करता है।
साधारण बिटमैप्स
दो मुख्य प्रकार के बैच मोड हैश बिटमैप में शामिल होते हैं। एक सरल बिटमैप में बिल्ड-साइड मानों की सन्निहित श्रेणी में से प्रत्येक के लिए एक बिट होता है। उदाहरण के लिए, एक-बाइट सरल बिटमैप यह इंगित करने में सक्षम है कि आठ सन्निहित बिल्ड-साइड मान मौजूद हैं या नहीं। 0 से 7 समावेशी मानों को संबंधित बिट सेट करके बिटमैप में एन्कोड किया जा सकता है। 5 का मान बिट 5 सेट करेगा, जिसका स्थितिगत मान 2 है। हम सेट {1, 5, 7} को 2 + 2 + 2 =2 + 32 + 128 =162 =10100010<उप>2<के रूप में एन्कोड कर सकते हैं। /उप> . मानों की एक श्रृंखला जो शून्य से शुरू नहीं होती है, उसी तरह सेट में मौजूद न्यूनतम मान (जिसे हम हैश तालिका के आंकड़ों से जानते हैं) द्वारा सभी मानों को ऑफसेट करके एन्कोड किया जा सकता है।
एक साधारण बिटमैप में सटीक को संग्रहीत करने का लाभ है श्रेणी . के समानुपाती मेमोरी की आवश्यकता की कीमत पर वास्तव में मौजूद बिल्ड-साइड मानों के बारे में जानकारी मौजूद मूल्यों की।
जटिल बिटमैप्स
दूसरे प्रकार का बिटमैप ब्लूम फ़िल्टर है। यह प्रत्येक बिल्ड-साइड मान पर एक या अधिक हैश फ़ंक्शन लागू करने के परिणाम के अनुसार बिटमैप संरचना में एक या अधिक बिट्स सेट करता है। हम प्रत्येक जांच-पक्ष मान पर समान हैश फ़ंक्शन लागू करके मैचों के लिए परीक्षण करते हैं। यदि कोई हैश फ़ंक्शन एक बिट की पहचान करता है जो सेट नहीं है, तो हम सुनिश्चित कर सकते हैं कि वर्तमान जांच मान बिल्ड साइड पर प्रकट नहीं होता है।
चूंकि ब्लूम फ़िल्टर एक संभाव्य संरचना है, हम कुछ जांच मानों को फ़िल्टर नहीं कर सकते हैं जिनमें बिल्ड-साइड मैच नहीं है (गलत सकारात्मक), लेकिन हम कभी भी मौजूद मान को फ़िल्टर नहीं करेंगे (गलत नकारात्मक)। दूसरे शब्दों में, ब्लूम फ़िल्टर हमें "शायद एक मैच" या "निश्चित रूप से एक मैच नहीं" बताता है। प्रति कुंजी अधिक बिट्स (एक बड़ा बिटमैप) या अधिक हैश फ़ंक्शन का उपयोग करके झूठी सकारात्मकता की दर को कम किया जा सकता है। स्पष्ट होने के लिए, एक ब्लूम फ़िल्टर हो सकता है सटीक फ़िल्टरिंग उत्पन्न करें, लेकिन यह भी नहीं हो सकता है।
साधारण बिटमैप . होने पर ब्लूम फ़िल्टर एक स्थान- और समय-कुशल विकल्प प्रस्तुत करते हैं अंतरिक्ष आवश्यकताओं के कारण संभव नहीं है। ब्लूम फ़िल्टर का SQL सर्वर बैच मोड कार्यान्वयन आधुनिक CPU कैश आर्किटेक्चर के लिए अनुकूलित है और आंतरिक रूप से जटिल बिटमैप के रूप में जाना जाता है . SQL सर्वर 2014 के बाद से जटिल बिटमैप्स ने एकाधिक जॉइन कॉलम और सभी बैच मोड डेटा प्रकारों का समर्थन किया है।
बिटमैप पसंद
क्या SQL सर्वर सरल . चुनता है या जटिल (ब्लूम फ़िल्टर) बिटमैप श्रेणी . पर निर्भर करता है बिल्ड-साइड वैल्यूज़ (हैश टेबल आँकड़ों से)। वहां "रेंज" शब्द के लिए एक महत्वपूर्ण चेतावनी है, जिसे अगले भाग में समझाया जाएगा। इस बीच, निष्पादन इंजन बिटमैप के प्रकार को इस प्रकार चुनता है:
- एक छोटा सरल बिटमैप का उपयोग तब किया जाता है जब मानों की श्रेणी 2 (8,388,608) या उससे कम हो। यह 1MB में बिट्स की संख्या है।
- जब मानों की श्रेणी 2 से अधिक लेकिन 2 (8MB) से कम या उसके बराबर हो, तो निष्पादन इंजन बड़े सरल बिटमैप के बीच चयन करता है और एक जटिल बिटमैप प्रत्येक विकल्प के लिए आवश्यक मेमोरी की गणना करके और छोटे को चुनकर। एक बड़े साधारण बिटमैप का आकार 8MB तक हो सकता है। एक जटिल बिटमैप का आकार डेटा का पर्याप्त रूप से प्रतिनिधित्व करने के लिए आवश्यक प्रति कुंजी बिट्स की संख्या पर निर्भर करता है। अधिक विशिष्ट मानों का अर्थ सामान्य रूप से एक बड़ा जटिल बिटमैप होता है।
- यदि मानों की श्रेणी 2 बिट से अधिक है, तो एक जटिल बिटमैप प्रयोग किया जाता है।
मानों की श्रेणी के बारे में
श्रेणी ऊपर बताए गए मानों की संख्या आंतरिक बाइनरी . पर आधारित है डेटा का प्रतिनिधित्व। उदाहरण के लिए, smallint
128 और 255 के मानों को 0x0080
. के रूप में दर्शाया जा सकता है और 0x00FF
, 0x7F
. की एक श्रृंखला दे रहा है (127) बाइनरी मान। यह श्रेणी एक छोटे से साधारण बिटमैप के साथ अच्छी तरह काम करेगी।
दूसरी ओर, datetime
मान "1900-01-01" और "1900-01-02" को 8 बाइट्स में 0x0000000100000000
के रूप में दर्शाया जा सकता है और 0x0000000200000000
(दिनों के लिए चार बाइट्स और आधी रात के बाद टिक के लिए चार बाइट्स)। यह खंडित प्रतिनिधित्व 0x0100000000
. की बाइनरी रेंज देता है (4,294,967,296) उन दो उदाहरण मूल्यों के लिए, जो एक साधारण बिटमैप (यहां तक कि एक बड़े वाले) में फिट होने के लिए बहुत बड़ा है। जटिल बाइनरी अभ्यावेदन (जैसे बाइट-स्वैपिंग) वाले डेटा प्रकार आमतौर पर साधारण बिटमैप्स के साथ अच्छी तरह से काम नहीं करेंगे।
एक और जटिलता यह है कि बैच मोड डेटा सामान्यीकृत है — एक बाइनरी लेआउट में परिवर्तित किया गया जो वेक्टरयुक्त निर्देशों के साथ अच्छी तरह से काम करता है — और हमेशा 64 बिट आकार का होता है। वे मान जो 64 बिट्स में फ़िट नहीं हो सकते हैं, उन्हें "ऑफ़ रो" में संग्रहीत किया जाता है, एक इन-रो 64-बिट पॉइंटर के साथ। यह बाइनरी लेआउट वैसा नहीं है जैसा कि टी-एसक्यूएल रूपांतरण द्वारा बाइनरी प्रकार में रिपोर्ट किया गया है।
फिर भी, सामान्यीकृत लेआउट पूर्णांक प्रकारों के लिए पर्याप्त समान है (उदा. integer
और bigint
) कि सरल बिटमैप अभी भी इन डेटा प्रकारों की श्रेणियों के लिए उपयोगी हैं। पूर्णांक जैसे बाइनरी प्रतिनिधित्व वाले अन्य प्रकार (उदा. money
और date
) भी उपयुक्त हैं।
एक और उदाहरण:integer
. का एक सेट 1 से 8,388,608 की सीमा में मान बस होंगे श्रेणी में एक बिट प्रति संभावित पूर्णांक मान का उपयोग करते हुए, 1MB छोटे सरल बिटमैप में फ़िट करें। सीमा में एक निश्चित ऑफसेट हो सकता है, इसलिए 10,000,000 से 18,388,607 की एक पूर्णांक सीमा भी फिट होगी (दस मिलियन की ऑफसेट के साथ)। ध्यान दें कि संख्या मौजूद मूल्यों का कोई फर्क नहीं पड़ता, केवल सीमा। 0 और 8,388,607 के दो मान छोटी साधारण बिटमैप श्रेणी के साथ-साथ उन दो चरम सीमाओं के बीच सभी संभावित मानों का एक सेट भर देंगे।
रेंज टेबल
जब बैच मोड निष्पादन इंजन एक बड़ा सरल . बनाने का निर्णय लेता है बिटमैप या जटिल हैश जॉइन के लिए बिटमैप, यह एक रेंज टेबल भी बनाता है। यह नहीं . करता है छोटे . के लिए श्रेणी तालिका बनाएं सरल बिटमैप।
श्रेणी तालिका एक निश्चित आकार की 128KB संरचना है जो हैश तालिका में मौजूद मानों की एक (निम्न, उच्च) श्रेणी निर्दिष्ट करने वाले 8-बाइट मानों के 8,192 जोड़े से बनी है। बैच मोड निष्पादन के साथ संगत किसी भी डेटा प्रकार पर एक श्रेणी तालिका बनाई जा सकती है। तैयार हैश तालिका के स्कैन के दौरान, डेटा के प्रत्येक बैच का उपयोग बिटमैप और को पॉप्युलेट करने के लिए किया जाता है श्रेणी तालिका।
बैच में प्रत्येक मान के लिए, श्रेणी तालिका में एक बाल्टी (श्रेणी मानों की जोड़ी) का पता लगाने के लिए हैश फ़ंक्शन का उपयोग किया जाता है। यदि बाल्टी वर्तमान में अप्रयुक्त है, तो मान निम्न और उच्च 8-बाइट दोनों मानों में संग्रहीत किया जाता है। यदि बाल्टी पहले से उपयोग में है, तो इसके बजाय अगली बाल्टी भर दी जाती है (और इसी तरह, जब तक कि एक खाली बाल्टी न हो)।
यदि श्रेणी तालिका एक तिहाई पूर्ण (उपयोग की गई 8,192 बाल्टी में से 2,730) हो जाती है, तो उपयोग की गई प्रविष्टियों की प्रतिलिपि बनाई जाती है, बाल्टी श्रेणी दोगुनी हो जाती है, फिर सहेजे गए मानों को पहले की तरह ही पुन:सम्मिलित किया जाता है (हालांकि हैश फ़ंक्शन का हिसाब लेता है नई बाल्टी आकार)। किसी भी अतिव्यापी बाल्टी को मिला दिया जाता है, और दोहरीकरण की प्रक्रिया तब तक जारी रहती है जब तक कि उपयोग की गई बाल्टी की संख्या 2,730 से कम न हो जाए। उदाहरण के लिए, दो बकेट जिनमें शुरू में 'रेंज' (1-1) और (2-2) होते हैं, पहली रेंज के दोगुने होने के बाद सिंगल रेंज बकेट (1-2) में मर्ज हो सकते हैं।
एक बार हैश टेबल डेटा के सभी बैचों को रेंज टेबल में संसाधित कर दिया गया है, एक अंतिम बकेट मर्ज किया जाता है, फिर एक इन-प्लेस क्विकॉर्ट बकेट को वैल्यू ऑर्डर में रखता है। यह एक द्विआधारी खोज के लिए एक विशेष रुचि के मूल्य को देखते हुए एक श्रेणी बकेट का पता लगाने की अनुमति देता है।
इस सभी गतिविधि का शुद्ध परिणाम हैश तालिका में डेटा का वर्णन करने वाले 2,730 अलग-अलग श्रेणियों का एक सेट तैयार करना है (बड़े सरल या जटिल बिटमैप के अलावा)।
रेंज टेबल का उपयोग करना
श्रेणी तालिका का उपयोग तब किया जाता है जब हैश बिटमैप फ़िल्टर से जुड़ता है और जांच-साइड कॉलमस्टोर स्कैन ऑपरेटर में नीचे धकेल दिया जाता है। प्रत्येक कॉलमस्टोर सेगमेंट में सेगमेंट में मौजूद न्यूनतम और अधिकतम डेटा मानों के बारे में कैटलॉग मेटाडेटा होता है। निष्पादन इंजन इस जानकारी का उपयोग किसी मैच के लिए बिटमैप श्रेणी तालिका को बाइनरी-खोज करने के लिए कर सकता है। यदि कोई मिलान नहीं मिलता है, तो निष्पादन इंजन खंड को पूरी तरह से छोड़ सकता है।
यह रनटाइम ऑप्टिमाइज़ेशन रीड-फ़ॉरवर्ड के लिए भी होता है, इसलिए इंजन मेमोरी में सेगमेंट को पढ़ने से भी बच सकता है जिसे वह जानता है कि रेंज टेबल फ़िल्टर द्वारा समाप्त कर दिया जाएगा। श्रेणी तालिका द्वारा समाप्त नहीं किए गए किसी भी खंड को अभी भी बिटमैप का उपयोग करके फ़िल्टर किया जाता है। इस संयोजन के परिणामस्वरूप जितनी जल्दी हो सके पंक्तियों की अधिकतम संख्या को समाप्त किया जा सकता है।
हालांकि एक छोटे से सरल बिटमैप के लिए एक श्रेणी तालिका नहीं बनाई गई है, उस संरचना का उपयोग खंड उन्मूलन को प्राप्त करने के लिए भी किया जा सकता है क्योंकि मूल्यों की सीमा ज्ञात है (किसी भी ऑफसेट सहित)। यह एक श्रेणी तालिका का उपयोग करके इसे उप-श्रेणियों में विभाजित करने के लायक नहीं बनाने के लिए काफी छोटा है।
जब बिटमैप को कॉलमस्टोर स्कैन में नीचे नहीं धकेला जाता है, तब भी हैश जॉइन करने से पहले सेमी जॉइन रिडक्शन प्राप्त करने के लिए इसे नियमित बैच मोड फिल्टर के रूप में मूल्यांकन किया जा सकता है। यह कॉलमस्टोर स्कैन के दौरान सेगमेंट एलिमिनेशन या फ़िल्टरिंग की तुलना में बहुत कम कुशल है, लेकिन यह अभी भी हैश जॉइन पर फ़िल्टर करने से बेहतर है।
बिटमैप और संपीडित डेटा
स्कैन के हिस्से के रूप में हैश जॉइन बैच मोड बिटमैप को कॉलमस्टोर डेटा पर लागू करने से बहुत अच्छा प्रदर्शन हो सकता है, लेकिन बिटमैप को लागू करने से पहले अशुद्ध सेगमेंट डेटा को डिकम्प्रेस करने की आवश्यकता होती है। यह डीकंप्रेसन SIMD निर्देशों का उपयोग करके कुशलता से किया जा सकता है, लेकिन यह अभी भी अतिरिक्त काम है।
SQL सर्वर 2016 ने डिक्शनरी-एन्कोडेड सेगमेंट डेटा पर सामान्य विधेय के लिए बिटमैप बनाने की क्षमता पेश की। एक नया . बनाने के लिए विधेय का मूल्यांकन शब्दकोश प्रविष्टियों के विरुद्ध किया जाता है प्रत्येक सेट बिट के साथ छोटा बिटमैप एक शब्दकोश प्रविष्टि को दर्शाता है जो विधेय को संतुष्ट करता है। इस बिटमैप को लागू करना बेहद तेज़ हो सकता है, खासकर अगर बिटमैप एक सिमड रजिस्टर में फिट बैठता है। बिटमैप फिट नहीं होने पर SQL सर्वर अभी भी SIMD का उपयोग कर सकता है, लेकिन इन-मेमोरी बिटमैप से बिट्स एकत्र करना इन-रजिस्टर केस की तुलना में थोड़ा कम कुशल है।
यह 2016 अनुकूलन किसी भी . पर लागू किया जा सकता है एक अपस्ट्रीम हैश जॉइन द्वारा बनाए गए बिटमैप 'प्रेडिकेट' सहित एक कॉलमस्टोर स्कैन में धकेल दिया गया विधेय। स्पष्ट होने के लिए, SQL सर्वर हैश को बिटमैप में शामिल करता है और शब्दकोश प्रविष्टियों का उपयोग करके एक नया (बहुत छोटा) बिटमैप बनाता है। यह नया बिटमैप डीकंप्रेसन से पहले खंड डेटा पर लागू होता है। ऑप्टिमाइज़ेशन की निगरानी विस्तारित ईवेंट column_store_expression_filter_bitmap_set
से की जा सकती है . जब डिक्शनरी बिटमैप का उपयोग किया जाता है, तो ईवेंट सदस्य filter_on_compressed_data_type
सदस्य आबाद होगा। आमतौर पर इसमें RAWBITMAP
का मान होगा . कंप्रेस्ड डिक्शनरी बिटमैप को तुलना फिल्टर में बदलने के लिए एक और ऑप्टिमाइज़ेशन मौजूद है यदि डिक्शनरी बिटमैप मानों की एक सन्निहित श्रेणी का प्रतिनिधित्व करता है। उस स्थिति में आपको RAWBITMAP
. के अलावा कुछ और दिखाई देगा (जैसे LTGT
तुलना से कम/अधिक के लिए)।
विस्तारित इवेंट और ट्रेस फ़्लैग
एक बिटमैप में एक कॉलमस्टोर स्कैन पर पुश-डाउन फिल्टर (बैच मोड हैश जॉइन द्वारा उत्पन्न बिटमैप सहित) को संकलित करने की सामान्य क्षमता को सत्र-स्तरीय ट्रेस फ्लैग 9361 के साथ अक्षम किया जा सकता है। विशिष्ट संपीड़ित-डेटा बिटमैप अनुकूलन को सत्र के साथ अक्षम किया जा सकता है -लेवल ट्रेस फ्लैग 9362। एक सन्निहित श्रेणी के साथ एक डिक्शनरी बिटमैप का तुलना फ़िल्टर में रूपांतरण ट्रेस फ़्लैग 9363 के साथ अक्षम किया जा सकता है। दुख की बात है कि कोई रिटेल-बिल्ड ट्रेस फ़्लैग नहीं है जो बैच मोड बिटमैप्स या पुश-डाउन फ़िल्टर के बारे में सूचनात्मक संदेशों की रिपोर्ट करता है। संकलन।
कुछ विस्तारित घटनाएं हैं जो हैश जॉइन बैच मोड बिटमैप्स के बारे में जानकारी उत्पन्न करती हैं। सबसे उपयोगी हैं:
query_execution_column_store_segment_scan_started
query_execution_column_store_segment_scan_finished
column_store_expression_filter_bitmap_set
column_store_segment_eliminate
जब एक हैश ज्वाइन बैच मोड बिटमैप को एक कॉलमस्टोर स्कैन में नीचे धकेल दिया जाता है, तो "प्रारंभ" घटना रिपोर्ट BITMAP_SIMPLE
या BITMAP_COMPLEX
filter_type
. के रूप में . यह छोटे और बड़े सरल बिटमैप के बीच अंतर नहीं करता है, न ही यह श्रेणी तालिका के बारे में कुछ भी रिपोर्ट करता है। विस्तारित ईवेंट मेटाडेटा में column_store_filter_type
. के लिए अन्य मान शामिल हैं जिसमें BITMAP_SIMPLE_LARGE
. शामिल है अन्य बातों के अलावा, लेकिन विस्तारित घटना वर्तमान में इस आउटपुट का उत्पादन नहीं करती है जब एक बड़े साधारण बिटमैप का उपयोग किया जाता है। शायद इसे भविष्य के रिलीज़ में ठीक कर दिया जाएगा।
वैश्विक ट्रेस ध्वज 646 का उपयोग श्रेणी तालिका (या एक छोटा सा सरल बिटमैप) द्वारा सक्षम खंड उन्मूलन के बारे में जानकारी की रिपोर्ट करने के लिए किया जा सकता है। यह विस्तारित घटना को समाप्त करने वाले खंड को समान जानकारी की रिपोर्ट करता है। इस खंड में उल्लिखित सभी ट्रेस फ़्लैग अनिर्दिष्ट और असमर्थित हैं।
अंतिम विचार
सही डेटा प्रकार . होने पर बैच मोड बिटमैप अत्यंत प्रभावी हो सकते हैं (अधिकतम 64 बिट्स और पूर्णांक-जैसे) का उपयोग किया जाता है और बिटमैप को कॉलमस्टोर स्कैन में नीचे धकेला जा सकता है, खासकर यदि खंड डेटा आरएलई संपीड़न (शुद्ध भंडारण) का उपयोग करता है, या यदि बिटमैप को डिक्शनरी डेटा पर किसी अन्य बिटमैप में संकलित किया जा सकता है।
यह अच्छा हो सकता है यदि निष्पादन योजना हैश बिटमैप में शामिल होने के बारे में अधिक विस्तृत जानकारी की सूचना देती है - कम से कम यह कहने के लिए कि किस प्रकार का बिटमैप बनाया गया था। वैसे भी, हमारे पास केवल बिटमैप निर्माता है संपत्ति, और कुछ विस्तारित घटनाओं के साथ काम करने के लिए। कॉलमस्टोर डेटा और बैच मोड हैश जॉइन के लिए निष्पादन इंजन में निर्मित सभी चतुर अनुकूलन का लाभ उठाकर प्राप्त किए जा सकने वाले विशाल प्रदर्शन लाभ को देखते हुए, यह विस्तृत योजना विश्लेषण को जितना होना चाहिए था, उससे थोड़ा कठिन बना देता है।
इस आलेख में चर्चा की गई मुख्य बिंदुओं की डेमो, उदाहरण और आगे की चर्चा बैच मोड बिटमैप डेमो पर मेरी व्यक्तिगत साइट पर उपलब्ध है।