SQL सर्वर में क्वेरी निष्पादन योजना कैसे प्राप्त करूं?


338

Microsoft SQL सर्वर में मैं क्वेरी / संग्रहीत कार्यविधि के लिए क्वेरी निष्पादन योजना कैसे प्राप्त कर सकता हूं?


2
मैं SQL सर्वर प्रबंधन स्टूडियो में निष्पादन योजना टैब को कैसे बंद करूं?
पॉल मैक्कार्थी

2
@Paul आप उसके लिए Ctrl + R मार सकते हैं। यह संदेश और निष्पादन योजना सहित पूरे परिणाम अनुभाग को बंद कर देता है।
निसर्ग

जवाबों:


501

निष्पादन योजना प्राप्त करने के कई तरीके हैं, जिनका उपयोग करना आपकी परिस्थितियों पर निर्भर करेगा। आमतौर पर आप किसी योजना को प्राप्त करने के लिए SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर सकते हैं, हालांकि यदि किसी कारण से आप SQL सर्वर प्रबंधन स्टूडियो में अपनी क्वेरी नहीं चला सकते हैं, तो आपको SQL सर्वर प्रोफाइलर के माध्यम से या निरीक्षण करके योजना प्राप्त करने में सक्षम होना उपयोगी हो सकता है। योजना कैश।

विधि 1 - SQL सर्वर प्रबंधन स्टूडियो का उपयोग करना

SQL सर्वर एक साफ सुथरी सुविधाओं के साथ आता है, जो एक निष्पादन योजना को पकड़ना बहुत आसान बनाते हैं, बस यह सुनिश्चित करें कि "वास्तविक निष्पादन योजना शामिल करें" मेनू आइटम ("क्वेरी" मेनू के तहत पाया गया) टिक किया गया है और अपनी क्वेरी सामान्य रूप से चलाएं ।

कार्य निष्पादन योजना मेनू आइटम शामिल करें

यदि आप किसी संग्रहीत प्रक्रिया में कथनों के लिए निष्पादन योजना प्राप्त करने की कोशिश कर रहे हैं, तो आपको संग्रहीत प्रक्रिया निष्पादित करनी चाहिए, जैसे:

exec p_Example 42

जब आपकी क्वेरी पूरी हो जाती है, तो आपको परिणाम फलक में "निष्पादन योजना" नामक एक अतिरिक्त टैब देखना चाहिए। यदि आप कई स्टेटमेंट चलाते हैं, तो आप इस टैब में प्रदर्शित कई योजनाओं को देख सकते हैं।

एक निष्पादन योजना का स्क्रीनशॉट

यहां से आप SQL सर्वर मैनेजमेंट स्टूडियो में निष्पादन योजना का निरीक्षण कर सकते हैं या योजना पर राइट क्लिक कर सकते हैं और XML फॉर्मेट में फाइल को सेव करने के लिए "सेव एक्ज़ीक्यूशन प्लान अस ..." सेलेक्ट कर सकते हैं।

विधि 2 - SHOWPLAN विकल्पों का उपयोग करना

यह विधि विधि 1 के समान है (वास्तव में यह SQL सर्वर प्रबंधन स्टूडियो आंतरिक रूप से करता है), हालांकि मैंने इसे पूर्णता के लिए शामिल किया है या यदि आपके पास SQL ​​सर्वर प्रबंधन स्टूडियो उपलब्ध नहीं है।

अपनी क्वेरी चलाने से पहले, निम्नलिखित कथनों में से एक को चलाएं । यह कथन बैच में एकमात्र कथन होना चाहिए, अर्थात आप एक ही समय में किसी अन्य कथन को निष्पादित नहीं कर सकते हैं:

SET SHOWPLAN_TEXT ON
SET SHOWPLAN_ALL ON
SET SHOWPLAN_XML ON
SET STATISTICS PROFILE ON
SET STATISTICS XML ON -- The is the recommended option to use

ये कनेक्शन विकल्प हैं और इसलिए आपको केवल कनेक्शन के अनुसार इसे चलाने की आवश्यकता है। सभी बिंदुओं पर इस बिंदु से वांछित प्रारूप में आपकी निष्पादन योजना वाले एक अतिरिक्त परिणाम के आधार पर चलाया जाएगा - बस अपनी क्वेरी को चलाएं जैसा कि आप सामान्य रूप से योजना को देखने के लिए करेंगे।

एक बार जब आप ऐसा कर लेते हैं तो आप इस विकल्प को निम्न कथन के साथ बंद कर सकते हैं:

SET <<option>> OFF

निष्पादन योजना प्रारूपों की तुलना

जब तक आपके पास एक मजबूत प्राथमिकता नहीं है, तब तक मेरी सिफारिश STATISTICS XMLविकल्प का उपयोग करने की है। यह विकल्प SQL सर्वर प्रबंधन स्टूडियो में "वास्तविक निष्पादन योजना शामिल करें" विकल्प के बराबर है और सबसे सुविधाजनक प्रारूप में सबसे अधिक जानकारी की आपूर्ति करता है।

  • SHOWPLAN_TEXT - क्वेरी को निष्पादित किए बिना एक मूल पाठ आधारित अनुमानित निष्पादन योजना प्रदर्शित करता है
  • SHOWPLAN_ALL - क्वेरी निष्पादित किए बिना, लागत अनुमानों के साथ एक पाठ आधारित अनुमानित निष्पादन योजना प्रदर्शित करता है
  • SHOWPLAN_XML- क्वेरी निष्पादित किए बिना, लागत अनुमानों के साथ XML आधारित अनुमानित निष्पादन योजना प्रदर्शित करता है। यह SQL सर्वर प्रबंधन स्टूडियो में "प्रदर्शन अनुमानित निष्पादन योजना ..." विकल्प के बराबर है।
  • STATISTICS PROFILE - क्वेरी निष्पादित करता है और एक पाठ आधारित वास्तविक निष्पादन योजना प्रदर्शित करता है।
  • STATISTICS XML- क्वेरी निष्पादित करता है और XML आधारित वास्तविक निष्पादन योजना प्रदर्शित करता है। यह SQL सर्वर प्रबंधन स्टूडियो में "वास्तविक निष्पादन योजना शामिल करें" विकल्प के बराबर है।

विधि 3 - SQL सर्वर प्रोफाइलर का उपयोग करना

यदि आप अपनी क्वेरी को सीधे नहीं चला सकते हैं (या जब आप इसे सीधे निष्पादित करते हैं तो आपकी क्वेरी धीरे-धीरे नहीं चलती है - याद रखें कि हम क्वेरी के खराब प्रदर्शन की योजना चाहते हैं), तो आप SQL सर्वर प्रोफाइलर ट्रेस का उपयोग करके योजना पर कब्जा कर सकते हैं। यह विचार आपकी क्वेरी को चलाने के लिए है, जबकि एक ट्रेस जो "शोप्लान" घटनाओं में से एक पर कब्जा कर रहा है।

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

  1. SQL सर्वर प्रोफाइलर खोलें और वांछित डेटाबेस से जुड़ने वाला एक नया ट्रेस बनाएं जिसके खिलाफ आप ट्रेस रिकॉर्ड करना चाहते हैं।
  2. "ईवेंट्स सिलेक्शन" टैब चेक "सभी इवेंट दिखाएं" के तहत, "प्रदर्शन" -> "शोप्लेन एक्सएमएल" पंक्ति की जांच करें और ट्रेस चलाएं।
  3. जबकि ट्रेस चल रहा है, जो कुछ भी करने की ज़रूरत है उसे चलाने के लिए धीमी गति से चलने वाली क्वेरी प्राप्त करने के लिए करें।
  4. ट्रेस को पूरा करने और रोकने के लिए क्वेरी के लिए प्रतीक्षा करें।
  5. SQL सर्वर प्रोफाइलर में प्लान xml पर राइट क्लिक ट्रेस को बचाने के लिए और XML फॉर्मेट में फाइल को सेव करने के लिए "एक्सटर्नल इवेंट डेटा ..." चुनें।

आपको मिलने वाली योजना SQL सर्वर प्रबंधन स्टूडियो में "वास्तविक निष्पादन योजना शामिल करें" विकल्प के बराबर है।

विधि 4 - क्वेरी कैश का निरीक्षण

यदि आप अपनी क्वेरी सीधे नहीं चला सकते हैं और आप एक प्रोफाइलर ट्रेस पर भी कब्जा नहीं कर सकते हैं, तो आप अभी भी SQL क्वेरी कैश का निरीक्षण करके एक अनुमानित योजना प्राप्त कर सकते हैं।

हम SQL सर्वर DMV को क्वेरी करके प्लान कैश का निरीक्षण करते हैं । निम्नलिखित एक मूल क्वेरी है जो सभी SQL क्वेरी के साथ-साथ सभी कैश्ड क्वेरी योजनाओं (xml के रूप में) को सूचीबद्ध करेगी। अधिकांश डेटाबेस पर आपको परिणामों को फ़िल्टर करने के लिए अतिरिक्त फ़िल्टरिंग क्लॉज़ जोड़ने की आवश्यकता होगी, केवल उन योजनाओं के लिए जिन्हें आप रुचि रखते हैं।

SELECT UseCounts, Cacheobjtype, Objtype, TEXT, query_plan
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)

इस क्वेरी को निष्पादित करें और प्लान को एक नई विंडो में खोलने के लिए एक्सएमएल पर क्लिक करें - राइट क्लिक करें और एक्सएमएल फॉर्मेट में फाइल को सेव करने के लिए "एक्जीक्यूटिव प्लान इस रूप में सेव करें ..." चुनें।

टिप्पणियाँ:

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

आप एन्क्रिप्टेड संग्रहीत प्रक्रियाओं के लिए एक निष्पादन योजना पर कब्जा नहीं कर सकते।

"वास्तविक" बनाम "अनुमानित" निष्पादन योजनाएं

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

मैं क्वेरी निष्पादन योजना की व्याख्या कैसे करूं?

यह अपने आप में एक (मुक्त) पुस्तक के लिए पर्याप्त योग्य विषय है ।

यह सभी देखें:


8
भविष्य के पाठकों के लिए एक नोट: SET STATISTICS XML ONक्वेरी की शुरुआत में, और SET STATISTICS XML OFF|ONआसपास के क्षेत्रों को आप योजना आउटपुट में नहीं दिखाना चाहते हैं: मुझे यह उपयोगी तब लगा जब क्वेरी में एक पुनरावृत्ति (WHILE) शामिल है जिसे आप नहीं चाहते / आवश्यकता नहीं है निष्पादन योजना में देखने के लिए (अन्यथा यह प्रदर्शित करने के लिए SQL सर्वर के लिए बहुत भारी और लंबा होगा)।
रोइमर

2
@MonsterMMORPG आप विधि 4 का उपयोग कर सकते हैं और फिर उसका चयन कर सकते हैं। उदाहरण के लिए, <a href=" github.com/StackExchange/dapper-dot-net"> Dapper.net </… > कनेक्शन .Query <string> (sysinos_exec-cached_plans से CROSS APPLY sysinos_exec_sql_text (plan_handle) का चयन करें। ) CROSS APPLY sysinos_exec_query_plan (plan_handle) जहाँ आपके 'N'% मूल मूल प्रश्न यहाँ%% है ''); यदि आप केवल अपनी क्वेरी का सबसेट उपयोग करते हैं, तो% s हैं।
हस्ताक्षर

2
@ आप जिस पुस्तक से जुड़े हैं, उसके दूसरे संस्करण को क्वेरी निष्पादन योजना की व्याख्या करने के लिए, 2009 से दिनांकित किया गया है। क्या आप अब भी कहेंगे कि यह 2016 में उस उद्देश्य के लिए बहुत अच्छा संसाधन है?
अब्दुल

3
@ अब्दुल एक ही लेखक, ग्रांट फ्रिट्ची की एक नई पुस्तक है जिसका नाम SQL सर्वर क्वेरी प्रदर्शन ट्यूनिंग है जो SQL सर्वर के नए संस्करणों को कवर करता है।

42

पहले से ही पोस्ट किए गए व्यापक उत्तर के अलावा कभी-कभी सूचना निकालने के लिए निष्पादन योजना को प्रोग्राम में एक्सेस करने में सक्षम होना उपयोगी है। इसके लिए उदाहरण कोड नीचे है।

DECLARE @TraceID INT
EXEC StartCapture @@SPID, @TraceID OUTPUT
EXEC sp_help 'sys.objects' /*<-- Call your stored proc of interest here.*/
EXEC StopCapture @TraceID

उदाहरण StartCaptureपरिभाषा

CREATE PROCEDURE StartCapture
@Spid INT,
@TraceID INT OUTPUT
AS
DECLARE @maxfilesize BIGINT = 5
DECLARE @filepath NVARCHAR(200) = N'C:\trace_' + LEFT(NEWID(),36)

EXEC sp_trace_create @TraceID OUTPUT, 0, @filepath, @maxfilesize, NULL 

exec sp_trace_setevent @TraceID, 122, 1, 1
exec sp_trace_setevent @TraceID, 122, 22, 1
exec sp_trace_setevent @TraceID, 122, 34, 1
exec sp_trace_setevent @TraceID, 122, 51, 1
exec sp_trace_setevent @TraceID, 122, 12, 1
-- filter for spid
EXEC sp_trace_setfilter @TraceID, 12, 0, 0, @Spid
-- start the trace
EXEC sp_trace_setstatus @TraceID, 1

उदाहरण StopCaptureपरिभाषा

CREATE  PROCEDURE StopCapture
@TraceID INT
AS
WITH  XMLNAMESPACES ('http://schemas.microsoft.com/sqlserver/2004/07/showplan' as sql), 
      CTE
     as (SELECT CAST(TextData AS VARCHAR(MAX)) AS TextData,
                ObjectID,
                ObjectName,
                EventSequence,
                /*costs accumulate up the tree so the MAX should be the root*/
                MAX(EstimatedTotalSubtreeCost) AS EstimatedTotalSubtreeCost
         FROM   fn_trace_getinfo(@TraceID) fn
                CROSS APPLY fn_trace_gettable(CAST(value AS NVARCHAR(200)), 1)
                CROSS APPLY (SELECT CAST(TextData AS XML) AS xPlan) x
                CROSS APPLY (SELECT T.relop.value('@EstimatedTotalSubtreeCost',
                                            'float') AS EstimatedTotalSubtreeCost
                             FROM   xPlan.nodes('//sql:RelOp') T(relop)) ca
         WHERE  property = 2
                AND TextData IS NOT NULL
                AND ObjectName not in ( 'StopCapture', 'fn_trace_getinfo' )
         GROUP  BY CAST(TextData AS VARCHAR(MAX)),
                   ObjectID,
                   ObjectName,
                   EventSequence)
SELECT ObjectName,
       SUM(EstimatedTotalSubtreeCost) AS EstimatedTotalSubtreeCost
FROM   CTE
GROUP  BY ObjectID,
          ObjectName  

-- Stop the trace
EXEC sp_trace_setstatus @TraceID, 0
-- Close and delete the trace
EXEC sp_trace_setstatus @TraceID, 2
GO

18

मान लें कि आप Microsoft SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर रहे हैं

  • के लिए अनुमानित क्वेरी योजना आप भी दबा सकते हैं Ctrl + L या निम्न बटन।

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

  • के लिए वास्तविक क्वेरी योजना है, तो आप भी दबा सकते हैं Ctrl + M या क्वेरी निष्पादित करने से पहले निम्न बटन।

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

  • के लिए लाइव क्वेरी योजना , (केवल SSMS 2016 में) क्वेरी निष्पादित करने से पहले निम्न बटन का उपयोग करें।

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


15

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

आप ApexSQL योजना को SQL सर्वर प्रबंधन स्टूडियो में स्थापित और एकीकृत कर सकते हैं, इसलिए निष्पादन योजनाओं को सीधे SSMS से देखा जा सकता है।

ApexSQL योजना में अनुमानित निष्पादन योजनाएँ देखना

  1. SSMS में न्यू क्वेरी बटन पर क्लिक करें और क्वेरी टेक्स्ट को क्वेरी टेक्स्ट विंडो में पेस्ट करें। राइट क्लिक करें और संदर्भ मेनू से "अनुमानित निष्पादन योजना" विकल्प चुनें।

SSMS में नया क्वेरी बटन

  1. निष्पादन योजना आरेखों को परिणाम अनुभाग में निष्पादन योजना टैब दिखाया जाएगा। निष्पादन योजना पर अगला राइट-क्लिक करें और संदर्भ मेनू में "एपेक्सक्यूएल योजना में खोलें" विकल्प चुनें।

निष्पादन योजना

  1. अनुमानित निष्पादन योजना ApexSQL योजना में खोली जाएगी और क्वेरी अनुकूलन के लिए इसका विश्लेषण किया जा सकता है।

अनुमानित निष्पादन योजना

ApexSQL योजना में वास्तविक निष्पादन योजनाओं को देखना

किसी क्वेरी की वास्तविक निष्पादन योजना को देखने के लिए, पहले बताए गए 2 चरण से जारी रखें, लेकिन अब, अनुमानित योजना दिखाए जाने के बाद, एपेक्सक्यूएल प्लान में मुख्य रिबन बार से "वास्तविक" बटन पर क्लिक करें।

मुख्य रिबन बार से "वास्तविक" बटन पर क्लिक करें

"वास्तविक" बटन पर क्लिक करने के बाद, वास्तविक निष्पादन योजना अन्य निष्पादन योजना डेटा के साथ लागत मापदंडों के विस्तृत पूर्वावलोकन के साथ दिखाई जाएगी।

वास्तविक निष्पादन योजना

निष्पादन योजनाओं को देखने के बारे में अधिक जानकारी इस लिंक पर जाकर प्राप्त की जा सकती है ।


14

क्वेरी निष्पादन योजनाओं को प्राप्त करने और गहराई से विश्लेषण करने के लिए मेरा पसंदीदा उपकरण एसक्यूएल संतरी प्लान एक्सप्लोरर है । यह SSMS की तुलना में विस्तार विश्लेषण और निष्पादन योजनाओं के दृश्य के लिए बहुत अधिक उपयोगकर्ता के अनुकूल, सुविधाजनक और व्यापक है।

यहां एक नमूना स्क्रीन शॉट दिया गया है जिससे आपको अंदाजा हो सकता है कि टूल द्वारा क्या कार्यक्षमता प्रदान की गई है:

SQL संतरी प्लान एक्सप्लोरर विंडो स्क्रीन शॉट

यह उपकरण में उपलब्ध विचारों में से केवल एक है। ऐप विंडो के नीचे टैब का एक सेट देखें, जो आपको अपनी निष्पादन योजना के विभिन्न प्रकार और साथ ही उपयोगी अतिरिक्त जानकारी प्राप्त करने देता है।

इसके अलावा, मैंने इसके मुक्त संस्करण की कोई सीमा नहीं देखी है जो इसे दैनिक आधार पर उपयोग करने से रोकता है या आपको प्रो संस्करण को अंततः खरीदने के लिए मजबूर करता है। इसलिए, यदि आप मुफ्त संस्करण के साथ रहना पसंद करते हैं, तो ऐसा करने से आपको कुछ भी मना नहीं करता है।

अद्यतन: ( मार्टिन स्मिथ के लिए धन्यवाद ) योजना एक्सप्लोरर अब स्वतंत्र है! देखें http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view जानकारी के लिए।


1
थर्ड-पार्टी टूल्स की बात कौन कर रहा था?
बशर

12
@ बैशेर: ओपी ने साधनों को एमएस टूल या किसी और तरह से सीमित नहीं किया। तो आपको क्या लगता है कि तीसरे पक्ष के उपकरण से जुड़े उत्तर अनुचित है?
अलेक्जेंडर अबाकुमोव

3
Speaking of third-party toolsजब आप किसी तीसरे पक्ष के टूल का उल्लेख नहीं करते हैं, तो आप अपने उत्तर की शुरुआत को कैसे मजाक में लेते हैं, इसके साथ मजाक कर रहे थे ।
बशर

4
@ बशेर: ओह, अच्छा कैच! धन्यवाद! मैंने अपना उत्तर पुनः लिख दिया है। यदि आप चाहें तो कृपया एक प्रतिक्रिया दें और / या अपवोट करें।
अलेक्जेंडर अबाकुमोव

3
BTW अब केवल एक संस्करण है sqlsentry.com/products/plan-explorer/sql-server-query-view
मार्टिन स्मिथ

7

query_post_execution_showplanईवेंट के माध्यम से विस्तृत ईवेंट सत्र से क्वेरी योजना प्राप्त की जा सकती है । यहाँ एक नमूना XEvent सत्र है:

/*
    Generated via "Query Detail Tracking" template.
*/
CREATE EVENT SESSION [GetExecutionPlan] ON SERVER 
ADD EVENT sqlserver.query_post_execution_showplan(
    ACTION(package0.event_sequence,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)),

/* Remove any of the following events (or include additional events) as desired. */
ADD EVENT sqlserver.error_reported(
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.module_end(SET collect_statement=(1)
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.rpc_completed(
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sp_statement_completed(SET collect_object_name=(1)
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_batch_completed(
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))),
ADD EVENT sqlserver.sql_statement_completed(
    ACTION(package0.event_sequence,sqlserver.client_app_name,sqlserver.database_id,sqlserver.plan_handle,sqlserver.query_hash,sqlserver.query_plan_hash,sqlserver.session_id,sqlserver.sql_text,sqlserver.tsql_frame,sqlserver.tsql_stack)
    WHERE ([package0].[greater_than_uint64]([sqlserver].[database_id],(4)) AND [package0].[equal_boolean]([sqlserver].[is_system],(0)))) 
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO

सत्र बनाने के बाद, (SSMS में) ऑब्जेक्ट एक्सप्लोरर पर जाएं और प्रबंधन में नीचे जाएं विस्तारित घटनाक्रम | सत्र। "GetExecutionPlan" सत्र को राइट-क्लिक करें और इसे प्रारंभ करें। इसे फिर से राइट-क्लिक करें और "लाइव डेटा देखें" चुनें।

इसके बाद, एक नई क्वेरी विंडो खोलें और एक या अधिक क्वेरीज़ चलाएँ। यहां एडवेंचरवर्क्स के लिए एक है:

USE AdventureWorks;
GO

SELECT p.Name AS ProductName, 
    NonDiscountSales = (OrderQty * UnitPrice),
    Discounts = ((OrderQty * UnitPrice) * UnitPriceDiscount)
FROM Production.Product AS p 
INNER JOIN Sales.SalesOrderDetail AS sod
    ON p.ProductID = sod.ProductID 
ORDER BY ProductName DESC;
GO

एक या दो पल के बाद, आपको "GetExecutionPlan: Live Data" टैब में कुछ परिणाम देखने चाहिए। ग्रिड में query_post_execution_showplan घटनाओं में से एक पर क्लिक करें और फिर ग्रिड के नीचे "क्वेरी प्लान" टैब पर क्लिक करें। यह इस तरह दिखना चाहिए:

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

संपादित करें : XEvent कोड और स्क्रीन शॉट SQL / SSMS 2012 w / SP2 से उत्पन्न हुए थे। आप एसक्यूएल 2008 / R2 का उपयोग कर रहे हैं, तो आप कर सकते हैं इसे चलाने बनाने के लिए स्क्रिप्ट tweak करने में सक्षम हो। लेकिन उस संस्करण में GUI नहीं है, इसलिए आपको showplan XML को निकालना होगा, इसे * .sqlplan फ़ाइल के रूप में सहेजें और SSMS में खोलें। वह बोझिल है। XEvents SQL 2005 या उससे पहले में मौजूद नहीं था। इसलिए, यदि आप SQL 2012 या उसके बाद के नहीं हैं, तो मैं दृढ़ता से यहाँ पोस्ट किए गए अन्य उत्तरों में से एक का सुझाव दूंगा।


5

प्रदर्शन की निगरानी के लिए SQL Server 2016+ से शुरू करते हुए, क्वेरी स्टोर सुविधा शुरू की गई थी। यह क्वेरी प्लान पसंद और प्रदर्शन में अंतर्दृष्टि प्रदान करता है। यह ट्रेस या विस्तारित घटनाओं का पूर्ण प्रतिस्थापन नहीं है, लेकिन जैसा कि संस्करण से संस्करण में विकसित हो रहा है, हमें SQL सर्वर से भविष्य के रिलीज में पूरी तरह कार्यात्मक क्वेरी स्टोर मिल सकता है। क्वेरी स्टोर का प्राथमिक प्रवाह

  1. SQL सर्वर मौजूदा घटक क्वेरी स्टोर प्रबंधक के उपयोग द्वारा क्वेरी स्टोर के साथ इंटरैक्ट करता है।
  2. क्वेरी स्टोर मैनेजर यह निर्धारित करता है कि किस स्टोर का उपयोग किया जाना चाहिए और फिर उस स्टोर (प्लान या रनटाइम स्टैट्स या क्वेरी स्ट्रीट्स) के निष्पादन को पारित करता है।
    • प्लान स्टोर - निष्पादन योजना की जानकारी को बनाए रखना
    • रनटाइम स्टैट्स स्टोर - निष्पादन आंकड़ों की जानकारी को जारी रखना
    • क्वेरी वेट स्टैट्स स्टोर - प्रतीक्षा आंकड़ों की जानकारी को जारी रखना।
  3. SQL सर्वर के विस्तार के रूप में योजना, रनटाइम आँकड़े और प्रतीक्षा स्टोर क्वेरी स्टोर का उपयोग करता है।

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

  1. क्वेरी स्टोर को सक्षम करना : क्वेरी स्टोर सर्वर पर डेटाबेस स्तर पर काम करता है।

    • डिफ़ॉल्ट रूप से क्वेरी डेटाबेस नए डेटाबेस के लिए सक्रिय नहीं है।
    • आप मास्टर या tempdbडेटाबेस के लिए क्वेरी स्टोर को सक्षम नहीं कर सकते ।
    • उपलब्ध DMV

      sys.database_query_store_options (Transact-SQL)

  2. क्वेरी स्टोर में जानकारी एकत्र करें : हम क्वेरी स्टोर DMV (डेटा प्रबंधन दृश्य) का उपयोग करके तीन दुकानों से सभी उपलब्ध जानकारी एकत्र करते हैं।

    • क्वेरी प्लान स्टोर: निष्पादन योजना की जानकारी को बनाए रखना और क्वेरी संकलन से संबंधित सभी सूचनाओं को कैप्चर करना जवाबदेह है।

      sys.query_store_query(Transact-SQL) sys.query_store_plan(Transact-SQL) sys.query_store_query_text(Transact-SQL)

    • रनटाइम स्टैट्स स्टोर: निष्पादन आंकड़ों की जानकारी को बनाए रखना और यह संभवतः सबसे अधिक बार अपडेट किया जाने वाला स्टोर है। ये आँकड़े क्वेरी निष्पादन डेटा का प्रतिनिधित्व करते हैं।

      sys.query_store_runtime_stats (Transact-SQL)

    • क्वेरी प्रतीक्षा आँकड़े स्टोर: प्रतीक्षा आंकड़ों की जानकारी को बनाए रखना और कैप्चर करना।

      sys.query_store_wait_stats (Transact-SQL)

नोट: क्वेरी प्रतीक्षा आँकड़े स्टोर केवल SQL सर्वर 2017+ में उपलब्ध है


4

एसक्यूएल सर्वर मैनेजमेंट स्टूडियो (पहले से समझाया गया) के साथ की तरह, यहां बताए अनुसार डाटाग्रिप के साथ भी यह संभव है

  1. SQL कथन पर राइट-क्लिक करें, और व्याख्या योजना का चयन करें।
  2. आउटपुट फलक में, योजना पर क्लिक करें।
  3. डिफ़ॉल्ट रूप से, आप क्वेरी का ट्री प्रतिनिधित्व देखते हैं। क्वेरी योजना देखने के लिए, विज़ुअलाइज़ेशन आइकन पर क्लिक करें, या Ctrl + Shift + Alt + U दबाएं

3

यहां पहले से कही गई बातों के अलावा एक महत्वपूर्ण बात जानना जरूरी है।

क्वेरी योजनाएं अक्सर अंतर्निहित XML स्तंभ प्रकार द्वारा प्रतिनिधित्व करने के लिए बहुत जटिल होती हैं जिसमें 127 स्तर के नेस्टेड तत्वों की सीमा होती है । यही कारण है कि sysinos_exec_query_plan वापस आने NULLया यहां तक ​​कि एमएस SQL ​​संस्करणों में एक त्रुटि फेंक सकते हैं , इसलिए आमतौर पर इसके बजाय sysinos_exec_text_query_plan का उपयोग करना सुरक्षित है । उत्तरार्द्ध में पूरे बैच के बजाय किसी विशेष विवरण के लिए एक योजना का चयन करने की एक उपयोगी बोनस सुविधा है । वर्तमान में चल रहे कथनों की योजनाओं को देखने के लिए आप इसका उपयोग कैसे करते हैं:

SELECT p.query_plan
FROM sys.dm_exec_requests AS r
OUTER APPLY sys.dm_exec_text_query_plan(
                r.plan_handle,
                r.statement_start_offset,
                r.statement_end_offset) AS p

परिणामी तालिका में टेक्स्ट कॉलम हालांकि XML कॉलम की तुलना में बहुत उपयोगी नहीं है। आरेख के रूप में एक अलग टैब में खोले जाने वाले परिणाम पर क्लिक करने में सक्षम होने के लिए, इसकी सामग्री को किसी फ़ाइल में सहेजने के बिना, आप थोड़ी सी चाल का उपयोग कर सकते हैं (याद रखें कि आप सिर्फ उपयोग नहीं कर सकते हैं CAST(... AS XML)), हालांकि यह केवल एक के लिए काम करेगा एक पंक्ति:

SELECT Tag = 1, Parent = NULL, [ShowPlanXML!1!!XMLTEXT] = query_plan
FROM sys.dm_exec_text_query_plan(
                -- set these variables or copy values
                -- from the results of the above query
                @plan_handle,
                @statement_start_offset,
                @statement_end_offset)
FOR XML EXPLICIT

3

वास्तविक योजना प्राप्त करने के लिए आप SET STATISTICS XML ON का उपयोग कर इसे पावरशेल के माध्यम से भी कर सकते हैं। मैंने इसे लिखा है ताकि यह बहु-योजना योजनाओं को एक योजना में मिला दे;

    ########## BEGIN : SCRIPT VARIABLES #####################
    [string]$server = '.\MySQLServer'
    [string]$database = 'MyDatabase'
    [string]$sqlCommand = 'EXEC sp_ExampleSproc'
    [string]$XMLOutputFileName = 'sp_ExampleSproc'
    [string]$XMLOutputPath = 'C:\SQLDumps\ActualPlans\'
    ########## END   : SCRIPT VARIABLES #####################

    #Set up connection
    $connectionString = "Persist Security Info=False;Integrated Security=true;Connection Timeout=0;Initial Catalog=$database;Server=$server"
    $connection = new-object system.data.SqlClient.SQLConnection($connectionString)

    #Set up commands
    $command = new-object system.data.sqlclient.sqlcommand($sqlCommand,$connection)
    $command.CommandTimeout = 0
    $commandXMLActPlanOn = new-object system.data.sqlclient.sqlcommand("SET STATISTICS XML ON",$connection)
    $commandXMLActPlanOff = new-object system.data.sqlclient.sqlcommand("SET STATISTICS XML OFF",$connection)

    $connection.Open()

    #Enable session XML plan
    $result = $commandXMLActPlanOn.ExecuteNonQuery()

    #Execute SP and return resultsets into a dataset
    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
    $dataset = New-Object System.Data.DataSet
    $adapter.Fill($dataSet) | Out-Null

    #Set up output file name and path
    [string]$fileNameDateStamp = get-date -f yyyyMMdd_HHmmss
    [string]$XMLOutputFilePath = "$XMLOutputPath$XMLOutputFileName`_$fileNameDateStamp.sqlplan"

    #Pull XML plans out of dataset and merge into one multi-statement plan
    [int]$cntr = 1
    ForEach($table in $dataset.Tables)
    {
            if($table.Columns[0].ColumnName -eq "Microsoft SQL Server 2005 XML Showplan")
            {

                [string]$fullXMLPlan = $Table.rows[0]."Microsoft SQL Server 2005 XML Showplan"

                if($cntr -eq 1)
                    {

                    [regex]$rx = "\<ShowPlanXML xmlns\=.{1,}\<Statements\>"
                    [string]$startXMLPlan = $rx.Match($fullXMLPlan).Value
                    [regex]$rx = "\<\/Statements\>.{1,}\<\/ShowPlanXML\>"
                    [string]$endXMLPlan = $rx.Match($fullXMLPlan).Value

                    $startXMLPlan | out-file -Append -FilePath $XMLOutputFilePath

                    }

                [regex]$rx = "\<StmtSimple.{1,}\<\/StmtSimple\>"
                [string]$bodyXMLPlan = $rx.Match($fullXMLPlan).Value

                $bodyXMLPlan | out-file -Append -FilePath $XMLOutputFilePath

                $cntr += 1
            } 
    }

    $endXMLPlan | out-file -Append -FilePath $XMLOutputFilePath

    #Disable session XML plan
    $result = $commandXMLActPlanOff.ExecuteNonQuery()

    $connection.Close()

2

जैसा कि मैंने इस लेख में बताया है , SQL सर्वर का उपयोग करते समय दो निष्पादन योजना प्रकार आप प्राप्त कर सकते हैं।

अनुमानित निष्पादन योजना

अनुमानित निष्पादन योजना SQL क्वेरी को चलाए बिना ऑप्टिमाइज़र द्वारा बनाई गई है।

अनुमानित निष्पादन योजना प्राप्त करने के लिए, आपको SHOWPLAN_ALLक्वेरी निष्पादित करने से पहले सेटिंग को सक्षम करने की आवश्यकता है ।

SHOWPLAN_ALL को सेट करें

अब, निम्नलिखित SQL क्वेरी निष्पादित करते समय:

SELECT p.id
FROM post p
WHERE EXISTS (
  SELECT 1
  FROM post_comment pc
  WHERE
    pc.post_id = p.id AND
    pc.review = 'Bingo'
)
ORDER BY p.title
OFFSET 20 ROWS
FETCH NEXT 10 ROWS ONLY

SQL सर्वर निम्नलिखित अनुमानित निष्पादन योजना उत्पन्न करेगा:

| NodeId | Parent | LogicalOp            | EstimateRows | EstimateIO  | EstimateCPU | AvgRowSize | TotalSubtreeCost | EstimateExecutions |
|--------|--------|----------------------|--------------|-------------|-------------|------------|------------------|--------------------|
| 1      | 0      | NULL                 | 10           | NULL        | NULL        | NULL       | 0.03374284       | NULL               |
| 2      | 1      | Top                  | 10           | 0           | 3.00E-06    | 15         | 0.03374284       | 1                  |
| 4      | 2      | Distinct Sort        | 30           | 0.01126126  | 0.000504114 | 146        | 0.03373984       | 1                  |
| 5      | 4      | Inner Join           | 46.698       | 0           | 0.00017974  | 146        | 0.02197446       | 1                  |
| 6      | 5      | Clustered Index Scan | 43           | 0.004606482 | 0.0007543   | 31         | 0.005360782      | 1                  |
| 7      | 5      | Clustered Index Seek | 1            | 0.003125    | 0.0001581   | 146        | 0.0161733        | 43                 |

अनुमानित निष्पादन योजना प्राप्त करने में हमारी रुचि के अनुसार चलने के बाद, आपको इसे अक्षम करना होगा SHOWPLAN_ALL, अन्यथा, वर्तमान डेटाबेस सत्र केवल प्रदान किए गए SQL प्रश्नों को निष्पादित करने के बजाय अनुमानित निष्पादन योजना उत्पन्न करेगा।

SET SHOWPLAN_ALL OFF

SQL सर्वर प्रबंधन स्टूडियो अनुमानित योजना

SQL सर्वर प्रबंधन स्टूडियो अनुप्रयोग में, आप आसानी से CTRL+Lकुंजी शॉर्टकट मारकर किसी भी SQL क्वेरी के लिए अनुमानित निष्पादन योजना प्राप्त कर सकते हैं ।

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

वास्तविक निष्पादन योजना

SQL क्वेरी चलाते समय ऑप्टिमाइज़र द्वारा वास्तविक SQL निष्पादन योजना तैयार की जाती है। यदि डेटाबेस टेबल के आंकड़े सही हैं, तो वास्तविक योजना अनुमानित एक से काफी भिन्न नहीं होनी चाहिए।

SQL सर्वर पर वास्तविक निष्पादन योजना प्राप्त करने के लिए, आपको STATISTICS IO, TIME, PROFILEसेटिंग्स को सक्षम करने की आवश्यकता है , जैसा कि निम्नलिखित SQL कमांड द्वारा सचित्र है:

SET STATISTICS IO, TIME, PROFILE ON

अब, पिछली क्वेरी चलाते समय, SQL सर्वर निम्नलिखित निष्पादन योजना बनाने जा रहा है:

| Rows | Executes | NodeId | Parent | LogicalOp            | EstimateRows | EstimateIO  | EstimateCPU | AvgRowSize | TotalSubtreeCost |
|------|----------|--------|--------|----------------------|--------------|-------------|-------------|------------|------------------|
| 10   | 1        | 1      | 0      | NULL                 | 10           | NULL        | NULL        | NULL       | 0.03338978       |
| 10   | 1        | 2      | 1      | Top                  | 1.00E+01     | 0           | 3.00E-06    | 15         | 0.03338978       |
| 30   | 1        | 4      | 2      | Distinct Sort        | 30           | 0.01126126  | 0.000478783 | 146        | 0.03338679       |
| 41   | 1        | 5      | 4      | Inner Join           | 44.362       | 0           | 0.00017138  | 146        | 0.02164674       |
| 41   | 1        | 6      | 5      | Clustered Index Scan | 41           | 0.004606482 | 0.0007521   | 31         | 0.005358581      |
| 41   | 41       | 7      | 5      | Clustered Index Seek | 1            | 0.003125    | 0.0001581   | 146        | 0.0158571        |

SQL Server parse and compile time:
   CPU time = 8 ms, elapsed time = 8 ms.

(10 row(s) affected)
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 'post'. Scan count 0, logical reads 116, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'post_comment'. Scan count 1, logical reads 5, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

(6 row(s) affected)

SQL Server Execution Times:
   CPU time = 0 ms,  elapsed time = 1 ms.

वास्तविक निष्पादन योजना प्राप्त करने में रुचि रखने वाले क्वेरी को चलाने के बाद, आपको STATISTICS IO, TIME, PROFILE ONइस तरह से सेटिंग्स को अक्षम करना होगा:

SET STATISTICS IO, TIME, PROFILE OFF

SQL सर्वर प्रबंधन स्टूडियो वास्तविक योजना

SQL सर्वर प्रबंधन स्टूडियो अनुप्रयोग में, आप आसानी से CTRL+Mकुंजी शॉर्टकट मारकर किसी भी SQL क्वेरी के लिए अनुमानित निष्पादन योजना प्राप्त कर सकते हैं ।

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

SQL सर्वर का उपयोग करते समय एक निष्पादन योजना प्राप्त करने के बारे में अधिक जानकारी के लिए, इस लेख को देखें


0

समझाते हुए निष्पादन योजना बहुत विस्तृत हो सकती है और पढ़ने में काफी समय लग सकता है, लेकिन सारांश में यदि आप क्वेरी से पहले 'व्याख्या' का उपयोग करते हैं तो यह आपको बहुत सी जानकारी देनी चाहिए जिसमें पहले किन भागों को निष्पादित किया गया था। यदि आप इसके बारे में थोड़ा और विवरण पढ़ना चाहते हैं, तो मैंने इस बारे में एक छोटा सा ब्लॉग संकलित किया, जो आपको सही रिफ्यूज़ की ओर इशारा करता है। https://medium.com/swlh/jetbrains-datagrip-explain-plan-ac406772c470

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