समानांतरवाद (प्रतिरूपण धारा) संचालक कम रो 1 का अनुमान क्यों लगाएगा?


12

मैं SQL Server 2012 एंटरप्राइज़ का उपयोग कर रहा हूं। मैं एक एसक्यूएल योजना भर में आया हूं जो कुछ ऐसे व्यवहार को प्रदर्शित कर रही है जो मुझे पूरी तरह से सहज नहीं लगते हैं। एक भारी समानांतर इंडेक्स स्कैन ऑपरेशन के बाद, एक पैरेललिज्म (पुनर्संरचना स्ट्रीम) ऑपरेशन होता है, लेकिन यह इंडेक्स स्कैन (Object10.Index2) द्वारा लौटाए जा रहे पंक्ति अनुमानों को मार रहा है, अनुमान को घटाकर 1. मैंने कुछ खोज की है, लेकिन ऐसा कुछ भी नहीं है जो इस व्यवहार की व्याख्या करता है। क्वेरी काफी सरल है, हालांकि प्रत्येक तालिका में कम लाखों में रिकॉर्ड हैं। यह एक DWH लोड प्रक्रिया का हिस्सा है और इस मध्यवर्ती डेटा सेट को कुछ समय भर में छुआ जाता है, लेकिन मेरे पास जो प्रश्न है वह विशेष रूप से पंक्ति अनुमानों से संबंधित है। क्या कोई समझा सकता है कि समानांतर पंक्ति (पुनर्संरचना स्ट्रेम्स) संचालक के भीतर सटीक पंक्ति अनुमान 1 क्यों जाता है? इसके अलावा,

मैंने पूरी योजना को पेस्ट करने की योजना पोस्ट की है ।

यहाँ प्रश्न में ऑपरेशन है:

यहाँ छवि विवरण दर्ज करें

मामले में प्लान ट्री शामिल है जो किसी भी अधिक संदर्भ को जोड़ता है:

यहाँ छवि विवरण दर्ज करें

क्या मैं पॉल व्हाइट द्वारा दायर इस कनेक्ट आइटम के कुछ बदलावों में भाग सकता हूं (आगे उनके ब्लॉग पर गहराई से खोज की गई है )? कम से कम यह केवल एक चीज है जो मैंने पाया है कि मैं जो खेल में कोई टॉप ऑपरेटर नहीं है, भले ही मैं जो भी चल रहा हूं उसके करीब से दूर तक लगता है।

जवाबों:


9

बिटमैप फ़िल्टर के साथ क्वेरी योजना कभी-कभी पढ़ने के लिए मुश्किल हो सकती है। प्रजनन धाराओं (जोर मेरा) के लिए BOL लेख से :

रेपिशन स्ट्रीम्स ऑपरेटर कई धाराओं का उपभोग करता है और रिकॉर्ड की कई धाराओं का उत्पादन करता है। रिकॉर्ड सामग्री और प्रारूप नहीं बदले गए हैं। यदि क्वेरी ऑप्टिमाइज़र एक बिटमैप फ़िल्टर का उपयोग करता है, तो आउटपुट स्ट्रीम में पंक्तियों की संख्या कम हो जाती है।

इसके अलावा, बिटमैप फ़िल्टर पर एक लेख भी उपयोगी है:

बिटमैप फ़िल्टरिंग वाले निष्पादन योजना का विश्लेषण करते समय, यह समझना महत्वपूर्ण है कि डेटा योजना के माध्यम से कैसे बहता है और फ़िल्टरिंग कहां लागू होता है। बिटमैप फ़िल्टर और अनुकूलित बिटमैप हैश ज्वाइंट के बिल्ड इनपुट (आयाम तालिका) पर बनाया गया है; हालाँकि, वास्तविक फ़िल्टरिंग आमतौर पर Parallelism ऑपरेटर के भीतर किया जाता है, जो हैश ज्वाइन के जांच इनपुट (तथ्य तालिका) पक्ष पर होता है। हालाँकि, जब बिटमैप फ़िल्टर पूर्णांक स्तंभ पर आधारित होता है, तो फ़िल्टर समानांतर तालिका ऑपरेटर के बजाय प्रारंभिक तालिका या अनुक्रमणिका स्कैन ऑपरेशन पर सीधे लागू किया जा सकता है। इस तकनीक को इन-पंक्ति अनुकूलन कहा जाता है।

मुझे विश्वास है कि आप अपनी क्वेरी का अवलोकन कर रहे हैं। बिटमैप के ऑपरेटर IN_ROWतथ्य तालिका के खिलाफ होते हुए भी, कार्डियॉलिटी अनुमान को कम करने वाले एक रिपर्टिशन स्ट्रीम ऑपरेटर को दिखाने के लिए अपेक्षाकृत सरल डेमो के साथ आना संभव है । डेटा प्रस्तुत करने का:

create table outer_tbl (ID BIGINT NOT NULL);

INSERT INTO outer_tbl WITH (TABLOCK)
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values;

create table inner_tbl_1 (ID BIGINT NULL);
create table inner_tbl_2 (ID BIGINT NULL);

INSERT INTO inner_tbl_1 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

INSERT INTO inner_tbl_2 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

यहाँ एक क्वेरी है जिसे आपको नहीं चलाना चाहिए:

SELECT *
FROM outer_tbl o
INNER JOIN inner_tbl_1 i ON o.ID = i.ID
INNER JOIN inner_tbl_2 i2 ON o.ID = i2.ID
OPTION (HASH JOIN, QUERYTRACEON 9481, QUERYTRACEON 8649);

मैंने योजना अपलोड की । पास के ऑपरेटर पर एक नज़र डालें inner_tbl_2:

पंक्तियों को खोने का प्रतिकार

आप पाॅल व्हाइट सहायक द्वारा हैश जॉन्स इन नुल्लेबल कॉलम पर दूसरा टेस्ट भी पा सकते हैं ।

पंक्ति में कमी कैसे लागू की जाती है, इसमें कुछ विसंगतियां हैं। मैं केवल कम से कम तीन तालिकाओं वाली योजना में इसे देख पा रहा था। हालाँकि, सही डेटा वितरण के साथ अपेक्षित पंक्तियों में कमी उचित लगती है। मान लीजिए कि तथ्य तालिका में शामिल स्तंभ में कई दोहराए गए मान हैं जो आयाम तालिका में मौजूद नहीं हैं। बिटमैप फ़िल्टर शामिल होने से पहले उन पंक्तियों को समाप्त कर सकता है। आपकी क्वेरी के लिए अनुमान सभी तरह से घटाया जाता है। 1. हैश फ़ंक्शन के बीच पंक्तियों को कैसे वितरित किया जाता है, एक अच्छा संकेत प्रदान करता है:

पंक्ति भेद

इसके आधार पर मुझे संदेह है कि आपके पास Object1.Column21कॉलम के लिए बहुत बार दोहराया गया मूल्य है । यदि दोहराए गए कॉलम आंकड़े हिस्टोग्राम में नहीं होते हैं, Object4.Column19तो SQL सर्वर कार्डिनैलिटी का अनुमान बहुत गलत हो सकता है।

मुझे लगता है कि आपको इस बात से चिंतित होना चाहिए कि क्वेरी के प्रदर्शन में सुधार करना संभव हो सकता है। बेशक, अगर क्वेरी प्रतिक्रिया समय या एसएलए आवश्यकताओं को पूरा करती है तो यह आगे की जांच के लायक नहीं हो सकती है। हालाँकि, यदि आप आगे की पड़ताल करना चाहते हैं, तो कुछ चीजें हैं जो आप कर सकते हैं (आँकड़े अद्यतन करने के अलावा) इस पर विचार प्राप्त करने के लिए कि क्या क्वेरी ऑप्टिमाइज़र एक बेहतर योजना चुन लेगा, अगर उसके पास बेहतर जानकारी हो। के बीच में शामिल होने आप परिणामों डाल सकता है Database1.Schema1.Object10और Database1.Schema1.Object11एक अस्थायी तालिका में है और यदि आप नेस्टेड लूप मिलती मिलना जारी रहता है देखते हैं। आप बदल सकते हैं LEFT OUTER JOINताकि क्वेरी ऑप्टिमाइज़र उस चरण में पंक्तियों की संख्या कम न कर सके। आप MAXDOP 1अपनी क्वेरी में यह देखने के लिए एक संकेत जोड़ सकते हैं कि क्या होता है। आप उपयोग कर सकते हैंTOPअंतिम में शामिल होने के लिए बाध्य करने के लिए एक व्युत्पन्न तालिका के साथ, या आप क्वेरी से जुड़ने की टिप्पणी भी कर सकते हैं। उम्मीद है कि ये सुझाव आपको आरंभ करने के लिए पर्याप्त हैं।

प्रश्न में कनेक्ट आइटम के बारे में , यह बहुत संभावना नहीं है कि यह आपके प्रश्न से संबंधित है। यह समस्या खराब रो अनुमान के साथ नहीं है। यह समानता में एक दौड़ की स्थिति के साथ करना है जो पर्दे के पीछे क्वेरी योजना में बहुत अधिक पंक्तियों को संसाधित करने का कारण बनता है। यहाँ ऐसा लगता है कि आपकी क्वेरी कोई अतिरिक्त काम नहीं कर रही है।


6

यहां मुख्य समस्या पहली जॉइन के परिणाम के लिए खराब कार्डिनैलिटी का अनुमान है। यह कई कारणों से उत्पन्न हो सकता है, लेकिन अक्सर यह या तो तारीख के आंकड़ों से बाहर होता है या कई सहसंबद्ध शामिल होते हैं, जो कि ऑप्टिमाइज़र के डिफ़ॉल्ट मॉडल मान लेते हैं कि वे स्वतंत्र हैं।

बाद के मामले में, FIX: खराब प्रदर्शन जब आप एक क्वेरी चलाते हैं जिसमें सहसंबंधित होता है और SQL Server 2008 में या SQL Server 2008 R2 में या SQL Server 2012 में समर्थित हो सकता है तो समर्थित ट्रेस ध्वज 4137 का उपयोग करके प्रासंगिक हो सकता है। आप क्वेरी को भी आज़मा सकते हैं आशावादी सुधारों और / या 2301 को मॉडलिंग एक्सटेंशन को सक्षम करने के लिए ध्वज 4199 का पता लगाएं। अनाम योजना के आधार पर यह जानना कठिन है।

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

यदि आप उत्सुक हैं, एक परीक्षण प्रणाली पर, आप ट्रेस फ्लैग 7498 के साथ क्वेरी के लिए बिटमैप्स को अक्षम कर सकते हैं। आप अनुकूलित बिटमैप्स को भी अक्षम कर सकते हैं (ऑप्टिमाइज़र द्वारा माना जाता है और कार्डिनैलिटी अनुमानों को प्रभावित करता है), उन्हें पोस्ट-ऑप्टिमाइज़ेशन बिटमैप्स के साथ प्रतिस्थापित किया जाता है (माना नहीं जाता है) ऑप्टिमाइज़र द्वारा, कार्डिनैलिटी पर कोई प्रभाव नहीं) ट्रेस झंडे 7497 और 7498 के संयोजन के साथ। न तो उत्पादन प्रणाली पर उपयोग के लिए दस्तावेज या समर्थन किया जाता है, लेकिन वे ऐसी योजनाएं बनाते हैं जो आशावादी सामान्य रूप से विचार कर सकते हैं, और इसलिए इसके साथ मजबूर किया जा सकता है योजना गाइड।

इसमें से कोई भी पहली बार में शामिल होने के लिए खराब अनुमान की मुख्य समस्या को हल नहीं करेगा, इसलिए मैं वास्तव में केवल हितों के लिए इसका उल्लेख कर रहा हूं।

बिटमैप और हैश ज्वाइन पर आगे पढ़ने:


0

ट्विटर पर आपको जवाब दिया। मैंने संलग्न XML को देखा और असंतुलित समानता देखी। 1 थ्रेड में लगभग सभी वास्तविक पंक्तियाँ हैं, जबकि अधिकांश अन्य नहीं हैं। यह असंतुलित समानता चिल्लाती है। इसलिए, मैं कुंजी / जॉइन वैल्यू और उसके संबंधित आँकड़ों और कार्डिनैलिटी पर गौर करूँगा।

आपके अन्य विचार के अनुसार, मैं इतना निश्चित नहीं हूं कि कनेक्ट आइटम लागू होता है, क्योंकि आपकी चिपकाई गई योजना में TOP शामिल नहीं है जो मैंने कहीं भी देखा है।

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