निष्पादन योजना बनाम सांख्यिकी IO आदेश


20

SQL सर्वर चित्रमय निष्पादन योजनाएं बाएं से दाएं और नीचे से ऊपर पढ़ें। क्या इसके द्वारा उत्पन्न आउटपुट के लिए एक सार्थक आदेश है SET STATISTICS IO ON?

निम्नलिखित प्रश्न:

SET STATISTICS IO ON;

SELECT  *
FROM    Sales.SalesOrderHeader AS soh
        JOIN Sales.SalesOrderDetail AS sod ON soh.SalesOrderID = sod.SalesOrderID
        JOIN Production.Product AS p ON sod.ProductID = p.ProductID;

इस योजना को उत्पन्न करता है:

चित्रमय निष्पादन योजना

और यह STATISTICS IOआउटपुट:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderDetail'. Scan count 1, logical reads 1246, physical reads 3, read-ahead reads 1277, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'SalesOrderHeader'. Scan count 1, logical reads 689, physical reads 1, read-ahead reads 685, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Product'. Scan count 1, logical reads 15, physical reads 1, read-ahead reads 14, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

तो, मैं दोहराता हूं: क्या देता है? क्या STATISTICS IOआउटपुट के लिए एक सार्थक आदेश है या कुछ मनमाना ऑर्डर उपयोग किया जाता है?

जवाबों:


9

विभिन्न सवालों के साथ मेरे शुरुआती खेल ने बिल्कुल भी कोई पैटर्न नहीं सुझाया, लेकिन ध्यान देने पर यह धारावाहिक योजनाओं के लिए अनुमानित है। मैं KB314648 पर समाप्त हुआ, जिसमें @AustinZellner उल्लेख है:

प्रत्येक SQL सर्वर कनेक्शन में एक संबद्ध प्रक्रिया स्थिति संरचना (PSS) होती है जो कनेक्शन-विशिष्ट स्थिति की जानकारी बनाए रखती है। Sysprocesses सिस्टम तालिका में प्रत्येक अद्वितीय सर्वर प्रक्रिया ID (SPID) एक अलग PSS का प्रतिनिधित्व करता है, और sysprocesses वर्चुअल टेबल में जानकारी इस स्थिति की जानकारी में एक "दृश्य" है।

और आपके प्रश्न के लिए प्रासंगिक अनुभाग:

यदि किसी कनेक्शन के लिए सांख्यिकी IO सक्षम है, तो SQL सर्वर क्वेरी निष्पादन के दौरान एक सरणी को प्रति तालिका के आधार पर IO जानकारी ट्रैक करने के लिए आवंटित करता है। जैसे ही SQL सर्वर क्वेरी को संसाधित करता है, यह इस सारणी में उपयुक्त तालिका की प्रविष्टि में एक पृष्ठ के लिए प्रत्येक तार्किक अनुरोध को रिकॉर्ड करता है, साथ ही उस तार्किक IO अनुरोध के परिणामस्वरूप भौतिक IO। SQL सर्वर जानकारी, क्वेरी के अंत में, त्रुटि संदेश 3615 में देता है।

देखे गए व्यवहार से पता चलता है कि प्रविष्टियों को उस क्रम में सरणी के लिए बनाया गया है जो IO उत्पन्न करता है, अनिवार्य रूप से एक भौतिक ऑपरेटर पर GetNext () का परिणाम है। सांख्यिकी आउटपुट में अंतिम प्रविष्टि पहली तालिका है जिसके परिणामस्वरूप एक IO दर्ज किया गया है, पहली प्रविष्टि अंतिम तालिका है। मैं अनुमान लगाता हूं कि समानांतर योजनाओं के लिए आदेश अनुमानित नहीं है (या इससे कम) क्योंकि कोई गारंटी नहीं है कि किस समानांतर कार्य को पहले निर्धारित किया जाएगा।


5

मुझे ऐसा लगता है कि यह योजना में डेटा रीड एक्सेस का विपरीत क्रम है। हैश टेबल (वर्कटेबल) बनाने के लिए आपकी योजना पहले उत्पाद तालिका से पढ़ेगी। इससे यह SalesOrderHeader से पढ़ता है और SalesOrderDetail को मर्ज जॉइन ऑपरेटर के साथ जोड़ देता है। उसके बाद मर्ज़ में शामिल होने वाले लोगों के साथ मूल उत्पाद पंक्तियों को अंतिम से हैश-मैच के दौरान वर्कटेबल पढ़ा जाता है। यह ठीक विपरीत क्रम है जिसमें वे आपके आँकड़े आउटपुट में सूचीबद्ध हैं।

हालांकि, मुझे ऐसे किसी भी दस्तावेज के बारे में जानकारी नहीं है जो इसे निर्दिष्ट करेगा। यदि आप सुनिश्चित करना चाहते हैं कि किस क्रम में तालिका पहुंच हुई है, तो निष्पादन योजना पढ़ें।


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

क्या आपके पास इसका उदाहरण है कि यह अलग क्रम में कहां है?
सेबस्टियन मेन

का चयन करें। .BusinessEntityID JOIN Production। उत्पाद के रूप में p पर s.P.ProductID = p.ProductID;
यिर्मयाह पेशाका

जब तक कोई समानता शामिल नहीं है मेरा अवलोकन सही है। सीरियल प्लान देखने के लिए आप अपनी क्वेरी को टॉप (100), टॉप (1000) और टॉप (10000) के साथ चला सकते हैं। हालाँकि, TOP (100000) या बिना TOP के आपको दो अलग-अलग समानांतर योजनाएँ मिलती हैं और वहाँ सभी दांव बंद होने लगते हैं।
सेबेस्टियन मीन

3

मैंने हमेशा सोचा कि यह एक आदेश था, पीछे से जब मैंने प्रशासन से अधिक प्रोग्रामिंग की। मैं कुछ निष्पादन योजनाओं के माध्यम से भागा और अपनी मान्यताओं को दोगुना किया।

यहाँ मैं देख रहा हूँ:

बहु-चरण क्वेरी में (जैसे कि हमारी कई संग्रहीत कार्यविधियाँ) आदेश भौतिक क्रम को दर्शाता है जिसमें क्वेरीज़ चलती हैं।

किसी विशेष प्रश्न के लिए, यह आंकड़ों की तरह दिखता है IO निष्पादन योजनाओं को दाईं ओर से शुरू करके और बाईं ओर काम करके रिपोर्टिंग योजना को दर्शाता है

शायद यह किसी भी चीज़ की तुलना में अधिक अवलोकन है।


2
इसमें कुछ हो सकता है। तालिकाओं के क्रम को SELECT COUNT(*) FROM HumanResources.EmployeeDepartmentHistory UNION ALL SELECT COUNT(*) FROM HumanResources.Employee UNION ALL SELECT COUNT(*) FROM HumanResources.Departmentउलट देने से भी IOआउटपुट उलट जाता है लेकिन यह स्पष्ट नहीं करता है कि प्रश्न में कार्य तालिका को पहले उदाहरण में क्यों बताया गया है।
मार्टिन स्मिथ

@MartinSmith हाँ, वर्कटेबल मेरे सीमित दृष्टिकोण से एक वाइल्ड कार्ड है।
आरएलएफ

0

इसलिए मुझे लगता है कि आँकड़ों के परिणाम io में बहुत अधिक अंतर्दृष्टि देते हैं जो वास्तव में रनटाइम पर हो रहा है, क्योंकि यह ध्यान में रखेगा और कैश के बजाय डिस्क से पढ़ने की आवश्यकता से प्रभावित होगा, और खाते की अनुमतियों से भी प्रभावित होगा। कि क्वेरी के तहत चलाया जा रहा है। फिर आँकड़ों में तालिका की स्थिति अन्य कारकों से प्रभावित होती है जो कि प्रोफाइलर द्वारा समझे गए थे।

यहाँ एक kb लेख है जो अंतर्दृष्टि और कुछ उदाहरण देता है: http://support.microsoft.com/kb/314648


1
सवाल STATISTICS IOसामान्य रूप से आउटपुट के बारे में नहीं है । यह शुद्ध रूप से उस आदेश के बारे में है जो विभिन्न तालिकाओं के रीड्स को सूचित करता है। मुझे आपके लिंक में इसके बारे में कुछ भी नहीं दिख रहा है।
मार्टिन स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.