Microsoft SQL सर्वर में मैं क्वेरी / संग्रहीत कार्यविधि के लिए क्वेरी निष्पादन योजना कैसे प्राप्त कर सकता हूं?
Microsoft SQL सर्वर में मैं क्वेरी / संग्रहीत कार्यविधि के लिए क्वेरी निष्पादन योजना कैसे प्राप्त कर सकता हूं?
जवाबों:
निष्पादन योजना प्राप्त करने के कई तरीके हैं, जिनका उपयोग करना आपकी परिस्थितियों पर निर्भर करेगा। आमतौर पर आप किसी योजना को प्राप्त करने के लिए SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर सकते हैं, हालांकि यदि किसी कारण से आप SQL सर्वर प्रबंधन स्टूडियो में अपनी क्वेरी नहीं चला सकते हैं, तो आपको SQL सर्वर प्रोफाइलर के माध्यम से या निरीक्षण करके योजना प्राप्त करने में सक्षम होना उपयोगी हो सकता है। योजना कैश।
SQL सर्वर एक साफ सुथरी सुविधाओं के साथ आता है, जो एक निष्पादन योजना को पकड़ना बहुत आसान बनाते हैं, बस यह सुनिश्चित करें कि "वास्तविक निष्पादन योजना शामिल करें" मेनू आइटम ("क्वेरी" मेनू के तहत पाया गया) टिक किया गया है और अपनी क्वेरी सामान्य रूप से चलाएं ।
यदि आप किसी संग्रहीत प्रक्रिया में कथनों के लिए निष्पादन योजना प्राप्त करने की कोशिश कर रहे हैं, तो आपको संग्रहीत प्रक्रिया निष्पादित करनी चाहिए, जैसे:
exec p_Example 42
जब आपकी क्वेरी पूरी हो जाती है, तो आपको परिणाम फलक में "निष्पादन योजना" नामक एक अतिरिक्त टैब देखना चाहिए। यदि आप कई स्टेटमेंट चलाते हैं, तो आप इस टैब में प्रदर्शित कई योजनाओं को देख सकते हैं।
यहां से आप SQL सर्वर मैनेजमेंट स्टूडियो में निष्पादन योजना का निरीक्षण कर सकते हैं या योजना पर राइट क्लिक कर सकते हैं और XML फॉर्मेट में फाइल को सेव करने के लिए "सेव एक्ज़ीक्यूशन प्लान अस ..." सेलेक्ट कर सकते हैं।
यह विधि विधि 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 सर्वर प्रबंधन स्टूडियो में "वास्तविक निष्पादन योजना शामिल करें" विकल्प के बराबर है।यदि आप अपनी क्वेरी को सीधे नहीं चला सकते हैं (या जब आप इसे सीधे निष्पादित करते हैं तो आपकी क्वेरी धीरे-धीरे नहीं चलती है - याद रखें कि हम क्वेरी के खराब प्रदर्शन की योजना चाहते हैं), तो आप SQL सर्वर प्रोफाइलर ट्रेस का उपयोग करके योजना पर कब्जा कर सकते हैं। यह विचार आपकी क्वेरी को चलाने के लिए है, जबकि एक ट्रेस जो "शोप्लान" घटनाओं में से एक पर कब्जा कर रहा है।
ध्यान दें कि लोड के आधार पर आप उत्पादन पर्यावरण पर इस पद्धति का उपयोग कर सकते हैं, हालांकि आपको स्पष्ट रूप से सावधानी बरतनी चाहिए। SQL सर्वर प्रोफाइलिंग तंत्र को डेटाबेस पर प्रभाव को कम करने के लिए डिज़ाइन किया गया है लेकिन इसका मतलब यह नहीं है कि कोई प्रदर्शन प्रभाव नहीं होगा । यदि आपके डेटाबेस का भारी उपयोग हो रहा है, तो आपको अपने ट्रेस में सही योजना को फ़िल्टर करने और पहचानने में भी समस्या हो सकती है। आपको अपने डीबीए के साथ स्पष्ट रूप से देखना चाहिए कि क्या वे आपके कीमती डेटाबेस पर ऐसा करने से खुश हैं!
आपको मिलने वाली योजना SQL सर्वर प्रबंधन स्टूडियो में "वास्तविक निष्पादन योजना शामिल करें" विकल्प के बराबर है।
यदि आप अपनी क्वेरी सीधे नहीं चला सकते हैं और आप एक प्रोफाइलर ट्रेस पर भी कब्जा नहीं कर सकते हैं, तो आप अभी भी 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 सर्वर अनुमान बंद हैं (जैसे कि जब आंकड़े आउट ऑफ डेट हों)।
यह अपने आप में एक (मुक्त) पुस्तक के लिए पर्याप्त योग्य विषय है ।
SET STATISTICS XML ON
क्वेरी की शुरुआत में, और SET STATISTICS XML OFF|ON
आसपास के क्षेत्रों को आप योजना आउटपुट में नहीं दिखाना चाहते हैं: मुझे यह उपयोगी तब लगा जब क्वेरी में एक पुनरावृत्ति (WHILE) शामिल है जिसे आप नहीं चाहते / आवश्यकता नहीं है निष्पादन योजना में देखने के लिए (अन्यथा यह प्रदर्शित करने के लिए SQL सर्वर के लिए बहुत भारी और लंबा होगा)।
पहले से ही पोस्ट किए गए व्यापक उत्तर के अलावा कभी-कभी सूचना निकालने के लिए निष्पादन योजना को प्रोग्राम में एक्सेस करने में सक्षम होना उपयोगी है। इसके लिए उदाहरण कोड नीचे है।
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
मान लें कि आप Microsoft SQL सर्वर प्रबंधन स्टूडियो का उपयोग कर रहे हैं
पिछले उत्तरों में वर्णित विधियों के अलावा, आप एक निशुल्क निष्पादन योजना दर्शक और क्वेरी ऑप्टिमाइज़ेशन टूल ApexSQL प्लान (जो मैंने हाल ही में टकराए हैं) का उपयोग कर सकते हैं।
आप ApexSQL योजना को SQL सर्वर प्रबंधन स्टूडियो में स्थापित और एकीकृत कर सकते हैं, इसलिए निष्पादन योजनाओं को सीधे SSMS से देखा जा सकता है।
ApexSQL योजना में अनुमानित निष्पादन योजनाएँ देखना
ApexSQL योजना में वास्तविक निष्पादन योजनाओं को देखना
किसी क्वेरी की वास्तविक निष्पादन योजना को देखने के लिए, पहले बताए गए 2 चरण से जारी रखें, लेकिन अब, अनुमानित योजना दिखाए जाने के बाद, एपेक्सक्यूएल प्लान में मुख्य रिबन बार से "वास्तविक" बटन पर क्लिक करें।
"वास्तविक" बटन पर क्लिक करने के बाद, वास्तविक निष्पादन योजना अन्य निष्पादन योजना डेटा के साथ लागत मापदंडों के विस्तृत पूर्वावलोकन के साथ दिखाई जाएगी।
निष्पादन योजनाओं को देखने के बारे में अधिक जानकारी इस लिंक पर जाकर प्राप्त की जा सकती है ।
क्वेरी निष्पादन योजनाओं को प्राप्त करने और गहराई से विश्लेषण करने के लिए मेरा पसंदीदा उपकरण एसक्यूएल संतरी प्लान एक्सप्लोरर है । यह SSMS की तुलना में विस्तार विश्लेषण और निष्पादन योजनाओं के दृश्य के लिए बहुत अधिक उपयोगकर्ता के अनुकूल, सुविधाजनक और व्यापक है।
यहां एक नमूना स्क्रीन शॉट दिया गया है जिससे आपको अंदाजा हो सकता है कि टूल द्वारा क्या कार्यक्षमता प्रदान की गई है:
यह उपकरण में उपलब्ध विचारों में से केवल एक है। ऐप विंडो के नीचे टैब का एक सेट देखें, जो आपको अपनी निष्पादन योजना के विभिन्न प्रकार और साथ ही उपयोगी अतिरिक्त जानकारी प्राप्त करने देता है।
इसके अलावा, मैंने इसके मुक्त संस्करण की कोई सीमा नहीं देखी है जो इसे दैनिक आधार पर उपयोग करने से रोकता है या आपको प्रो संस्करण को अंततः खरीदने के लिए मजबूर करता है। इसलिए, यदि आप मुफ्त संस्करण के साथ रहना पसंद करते हैं, तो ऐसा करने से आपको कुछ भी मना नहीं करता है।
अद्यतन: ( मार्टिन स्मिथ के लिए धन्यवाद ) योजना एक्सप्लोरर अब स्वतंत्र है! देखें http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view जानकारी के लिए।
Speaking of third-party tools
जब आप किसी तीसरे पक्ष के टूल का उल्लेख नहीं करते हैं, तो आप अपने उत्तर की शुरुआत को कैसे मजाक में लेते हैं, इसके साथ मजाक कर रहे थे ।
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 या उसके बाद के नहीं हैं, तो मैं दृढ़ता से यहाँ पोस्ट किए गए अन्य उत्तरों में से एक का सुझाव दूंगा।
प्रदर्शन की निगरानी के लिए SQL Server 2016+ से शुरू करते हुए, क्वेरी स्टोर सुविधा शुरू की गई थी। यह क्वेरी प्लान पसंद और प्रदर्शन में अंतर्दृष्टि प्रदान करता है। यह ट्रेस या विस्तारित घटनाओं का पूर्ण प्रतिस्थापन नहीं है, लेकिन जैसा कि संस्करण से संस्करण में विकसित हो रहा है, हमें SQL सर्वर से भविष्य के रिलीज में पूरी तरह कार्यात्मक क्वेरी स्टोर मिल सकता है। क्वेरी स्टोर का प्राथमिक प्रवाह
क्वेरी स्टोर को सक्षम करना : क्वेरी स्टोर सर्वर पर डेटाबेस स्तर पर काम करता है।
tempdb
डेटाबेस के लिए क्वेरी स्टोर को सक्षम नहीं कर सकते ।
sys.database_query_store_options
(Transact-SQL)
क्वेरी स्टोर में जानकारी एकत्र करें : हम क्वेरी स्टोर 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+ में उपलब्ध है
एसक्यूएल सर्वर मैनेजमेंट स्टूडियो (पहले से समझाया गया) के साथ की तरह, यहां बताए अनुसार डाटाग्रिप के साथ भी यह संभव है ।
- SQL कथन पर राइट-क्लिक करें, और व्याख्या योजना का चयन करें।
- आउटपुट फलक में, योजना पर क्लिक करें।
- डिफ़ॉल्ट रूप से, आप क्वेरी का ट्री प्रतिनिधित्व देखते हैं। क्वेरी योजना देखने के लिए, विज़ुअलाइज़ेशन आइकन पर क्लिक करें, या Ctrl + Shift + Alt + U दबाएं
यहां पहले से कही गई बातों के अलावा एक महत्वपूर्ण बात जानना जरूरी है।
क्वेरी योजनाएं अक्सर अंतर्निहित 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
वास्तविक योजना प्राप्त करने के लिए आप 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()
जैसा कि मैंने इस लेख में बताया है , 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 सर्वर प्रबंधन स्टूडियो अनुप्रयोग में, आप आसानी से 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 सर्वर प्रबंधन स्टूडियो अनुप्रयोग में, आप आसानी से CTRL+M
कुंजी शॉर्टकट मारकर किसी भी SQL क्वेरी के लिए अनुमानित निष्पादन योजना प्राप्त कर सकते हैं ।
SQL सर्वर का उपयोग करते समय एक निष्पादन योजना प्राप्त करने के बारे में अधिक जानकारी के लिए, इस लेख को देखें ।
समझाते हुए निष्पादन योजना बहुत विस्तृत हो सकती है और पढ़ने में काफी समय लग सकता है, लेकिन सारांश में यदि आप क्वेरी से पहले 'व्याख्या' का उपयोग करते हैं तो यह आपको बहुत सी जानकारी देनी चाहिए जिसमें पहले किन भागों को निष्पादित किया गया था। यदि आप इसके बारे में थोड़ा और विवरण पढ़ना चाहते हैं, तो मैंने इस बारे में एक छोटा सा ब्लॉग संकलित किया, जो आपको सही रिफ्यूज़ की ओर इशारा करता है। https://medium.com/swlh/jetbrains-datagrip-explain-plan-ac406772c470