Database
 sql >> डेटाबेस >  >> RDS >> Database

पंक्तियों की संख्या पढ़ें / वास्तविक पंक्तियाँ प्लान एक्सप्लोरर में चेतावनियाँ पढ़ें

निष्पादन योजनाओं में नई संपत्ति "वास्तविक पंक्तियाँ पढ़ें" (जिसे SQL सर्वर प्रबंधन स्टूडियो में "पंक्तियों की संख्या पढ़ें" के रूप में प्रदर्शित किया जाता है) प्रदर्शन ट्यूनर के लिए एक स्वागत योग्य अतिरिक्त था। यह एक नई महाशक्ति होने जैसा है, जो सीक ऑपरेटर के भीतर सीक प्रेडिकेट बनाम अवशिष्ट विधेय के महत्व को बताने में सक्षम है। मुझे यह पसंद है, क्योंकि यह पूछताछ के लिए वास्तव में महत्वपूर्ण हो सकता है।

आइए दो प्रश्नों को देखें, जिन्हें मैं AdventureWorks2012 के विरुद्ध चला रहा हूं। वे बहुत सरल हैं - एक जॉन एस नामक लोगों को सूचीबद्ध करता है, और दूसरी सूची में लोग जे स्मिथ कहलाते हैं। सभी अच्छी फोनबुक्स की तरह, हमारे पास LastName, FirstName पर एक इंडेक्स है।

select FirstName, LastName 
  from Person.Person
  where LastName like 'S%'
  and FirstName = 'John'; 
 
select FirstName, LastName 
  from Person.Person 
  where LastName = 'Smith' 
  and FirstName like 'J%';

यदि आप उत्सुक हैं, तो मुझे पहली पंक्ति से 2 पंक्तियाँ और दूसरी से 14 पंक्तियाँ वापस मिलती हैं। मुझे वास्तव में परिणामों में दिलचस्पी नहीं है, मुझे निष्पादन योजनाओं में दिलचस्पी है।

आइए देखें कि क्या हो रहा है। मैंने SQL संतरी योजना एक्सप्लोरर की एक पुरानी प्रति खोली, और अपनी योजनाओं को एक साथ खोल दिया। संयोग से - मैंने दोनों प्रश्नों को एक साथ चलाया था और इसलिए दोनों योजनाएं एक ही .sqlplan फ़ाइल में थीं। लेकिन मैं एक ही फाइल को दो बार पीई में खोल सकता था, और खुशी-खुशी उन्हें टैब समूहों में साथ-साथ बैठा सकता था।

महान। वह एक ही जैसे दिखते है! मैं देख सकता हूं कि बाईं ओर का सीक चौदह के बजाय दो पंक्तियों का निर्माण कर रहा है - जाहिर है यह बेहतर क्वेरी है।

लेकिन एक बड़ी विंडो के साथ, मुझे अधिक जानकारी दिखाई देगी, और यह भाग्यशाली है कि मैंने एक ही बैच में दो प्रश्नों को चलाया था।

आप देख सकते हैं कि दूसरी क्वेरी, जिसने 2 पंक्तियों के बजाय 14 पंक्तियों का उत्पादन किया, लागत का 80% से अधिक लेने का अनुमान लगाया गया था! अगर मैं अलग से क्वेरी चलाऊंगा, तो प्रत्येक मुझे 100% दिखाएगा।

आइए अब प्लान एक्सप्लोरर के नवीनतम रिलीज के साथ तुलना करें।

जो चीज तुरंत मेरे सामने आती है वह है चेतावनी। आइए थोड़ा करीब से देखें।

चेतावनी कहती है, "ऑपरेशन के कारण अवशिष्ट IO. पढ़ी गई पंक्तियों की वास्तविक संख्या 2,130 थी, लेकिन लौटी पंक्तियों की संख्या 2 थी।" निश्चित रूप से, आगे हम देखते हैं कि "वास्तविक पंक्तियाँ पढ़ें" 2,130 कह रही हैं, और वास्तविक पंक्तियाँ 2 पर हैं।

वाह! उन पंक्तियों को खोजने के लिए, हमें 2,130 देखना पड़ा?

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

लेकिन 'में दिलचस्पी' का मतलब 'लौटा' नहीं है, क्योंकि हमारे पास करने के लिए और काम हो सकता है। उस कार्य का वर्णन अन्य विधेय में किया गया है, जिसे अक्सर अवशिष्ट विधेय के रूप में जाना जाता है।

अब जबकि अवशिष्ट विधेय वास्तव में अधिकांश कार्य कर रहा होगा। यह निश्चित रूप से यहाँ है - यह चीजों को 2,130 पंक्तियों से घटाकर केवल 2 तक फ़िल्टर कर रहा है।

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

ध्यान दें कि हमारे पास उपसर्ग नहीं है। यह तब लागू होता है जब आपके पास इंडेक्स के पहले कॉलम में समानता होती है। हमारे पास बस StartRange और EndRange है। श्रेणी की शुरुआत "से अधिक या समान" (जीई) स्कैनटाइप है, "एस, जॉन" मान पर (कॉलम संदर्भ ऑफ-स्क्रीन अंतिम नाम, प्रथम नाम हैं), और सीमा का अंत "इससे कम" है ( एलटी) मान टी। जब स्कैन टी हिट करता है, तो यह हो गया है। अधिक कुछ नहीं करना है। सीक ने अब अपना रेंज स्कैन पूरा कर लिया है। और इस मामले में, यह 2,130 पंक्तियाँ लौटाता है!

सिवाय इसके कि यह वास्तव में 2,130 पंक्तियों को वापस नहीं करता है, यह सिर्फ 2,130 पंक्तियों को पढ़ता है। बैरी साई और केन सांचेज़ जैसे नाम पढ़े जाते हैं, लेकिन केवल अगले चेक को संतुष्ट करने वाले नाम लौटाए जाते हैं - अवशिष्ट विधेय जो सुनिश्चित करता है कि फर्स्टनाम जॉन है।

इंडेक्स सीक ऑपरेटर की संपत्तियों में वास्तविक पंक्तियाँ पढ़ने की प्रविष्टि हमें 2,130 का यह मान दिखाती है। और जबकि यह प्लान एक्सप्लोरर के पिछले रिलीज में दिखाई दे रहा है, हमें इसके बारे में कोई चेतावनी नहीं मिलती है। यह अपेक्षाकृत नया है।

हमारी दूसरी क्वेरी (जे स्मिथ की तलाश में) बहुत अच्छी है, और एक कारण है कि यह 4 गुना से अधिक सस्ता होने का अनुमान लगाया गया था।

यहां हम लास्टनाम को बिल्कुल (स्मिथ) जानते हैं, और रेंज स्कैन फर्स्टनाम (जे%) पर है।

यहीं पर उपसर्ग आता है।

हम देखते हैं कि हमारा उपसर्ग एक समानता ऑपरेटर (=, स्कैनटाइप ="ईक्यू") है, और वह अंतिम नाम स्मिथ होना चाहिए। हमने अभी तक श्रेणी के प्रारंभ या समाप्ति पर विचार नहीं किया है, लेकिन उपसर्ग हमें बताता है कि श्रेणी अनुक्रमणिका के उस हिस्से में शामिल है जहां LastName स्मिथ है। अब हम पंक्तियाँ>=J और . पा सकते हैं

यहां अभी भी एक अवशिष्ट विधेय है, लेकिन यह केवल यह सुनिश्चित करता है कि "LIKE J%" वास्तव में परीक्षण किया गया है। हालांकि यह हमें सहज लगता है कि "LIKE J%" बिल्कुल ">=J और

SQL सर्वर 2012 के सर्विस पैक 3 से पहले, हमारे पास यह गुण नहीं था, और वास्तविक पंक्तियों को पढ़ने और वास्तविक पंक्तियों के बीच अंतर को महसूस करने के लिए, हमें ट्रेस फ़्लैग 9130 का उपयोग करने की आवश्यकता होगी। यहाँ वे दो योजनाएँ हैं TF चालू होने पर:

आप देख सकते हैं कि इस बार कोई चेतावनी नहीं है, क्योंकि सीक ऑपरेटर सभी 2130 पंक्तियों को वापस कर रहा है। मुझे लगता है कि यदि आप SQL सर्वर के एक संस्करण का उपयोग कर रहे हैं जो इस वास्तविक पंक्तियों को पढ़ने का समर्थन करता है, तो आपको अपनी जांच में ट्रेस फ्लैग 9130 का उपयोग करना बंद कर देना चाहिए, और इसके बजाय प्लान एक्सप्लोरर में चेतावनियों को देखना शुरू कर देना चाहिए। लेकिन सबसे बढ़कर, यह समझें कि आपके ऑपरेटर अपना सामान कैसे करते हैं, क्योंकि तब आप यह व्याख्या करने में सक्षम होंगे कि क्या आप योजना से खुश हैं, या आपको कार्रवाई करने की आवश्यकता है या नहीं।

एक अन्य पोस्ट में, मैं आपको एक स्थिति दिखाऊंगा जब आप वास्तविक पंक्तियों को वास्तविक पंक्तियों से अधिक पढ़ना पसंद कर सकते हैं।

@rob_farley


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सरल मानकीकरण और तुच्छ योजनाएँ — भाग 2

  2. SQL INSERT INTO Statement

  3. अधिक शोप्लान सुधार? जी बोलिये!

  4. Sp_prepare / sp_prepexec . के लिए उपयोग का मामला

  5. विवाह संगठन डेटा मॉडल