মাইক্রোসফ্ট এসকিউএল সার্ভারে আমি কীভাবে কোনও জিজ্ঞাসা / সঞ্চিত পদ্ধতির জন্য কোয়েরি এক্সিকিউশন প্ল্যান পেতে পারি?
মাইক্রোসফ্ট এসকিউএল সার্ভারে আমি কীভাবে কোনও জিজ্ঞাসা / সঞ্চিত পদ্ধতির জন্য কোয়েরি এক্সিকিউশন প্ল্যান পেতে পারি?
উত্তর:
একটি কার্যকরকরণ পরিকল্পনা গ্রহণের বিভিন্ন পদ্ধতি রয়েছে, যা আপনার ব্যবহারের উপর নির্ভর করে। সাধারণত আপনি একটি পরিকল্পনা পেতে এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করতে পারেন, তবে যদি কোনও কারণে আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে আপনার ক্যোয়ারি চালাতে না পারেন তবে এসকিউএল সার্ভার প্রোফাইলার এর মাধ্যমে বা পরিদর্শন করে আপনি কোনও পরিকল্পনা অর্জন করতে সক্ষম হতে পারেন পরিকল্পনা ক্যাশে।
এসকিউএল সার্ভারটি বেশ কয়েকটি ঝরঝরে বৈশিষ্ট্য নিয়ে আসে যা কার্যকরভাবে পরিকল্পনা ক্যাপচার করা খুব সহজ করে তোলে, কেবল "নিশ্চিত করুন" অন্তর্ভুক্ত প্রকৃত এক্সিকিউশন প্ল্যান "মেনু আইটেমটি (" কোয়েরি "মেনুতে পাওয়া যায়) টিক দেওয়া আছে এবং আপনার ক্যোয়ারিকে স্বাভাবিক হিসাবে চালাচ্ছে তা নিশ্চিত করুন ।
আপনি যদি কোনও সঞ্চিত পদ্ধতিতে বিবৃতি দেওয়ার জন্য এক্সিকিউশন প্ল্যানটি পেতে চাইছেন তবে আপনার সঞ্চিত প্রক্রিয়াটি কার্যকর করা উচিত:
exec p_Example 42
যখন আপনার ক্যোয়ারীটি সম্পূর্ণ হয় আপনি ফলাফলের ফলকে "এক্সিকিউশন প্ল্যান" শিরোনামযুক্ত একটি অতিরিক্ত ট্যাব দেখতে পাবেন। আপনি যদি অনেক বিবৃতি চালিয়ে যান তবে আপনি এই ট্যাবে প্রদর্শিত অনেকগুলি পরিকল্পনা দেখতে পাবেন।
এখান থেকে আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে এক্সিকিউশন প্ল্যানটি পরিদর্শন করতে পারেন, বা পরিকল্পনার ডান ক্লিক করুন এবং এক্সএমএল ফর্ম্যাটে কোনও ফাইলে প্ল্যানটি সংরক্ষণ করতে "এক্সিকিউশন প্লান হিসাবে সেভ করুন ..." নির্বাচন করুন।
এই পদ্ধতিটি পদ্ধতি 1 এর সাথে খুব মিল (আসলে এটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও অভ্যন্তরীণভাবে করে) তবে আমি এটিকে সম্পূর্ণতার জন্য অন্তর্ভুক্ত করেছি বা যদি আপনার এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও উপলব্ধ না থাকে।
আপনি আপনার ক্যোয়ারী চালানোর আগে, নিম্নলিখিত বিবৃতিগুলির মধ্যে একটি চালান । বিবৃতি অবশ্যই ব্যাচের একমাত্র বিবৃতি হতে হবে, আপনি একই সময়ে অন্য বিবৃতি কার্যকর করতে পারবেন না:
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
আপনার দৃ strong় পছন্দ না হলে আমার প্রস্তাবটি STATISTICS XML
বিকল্পটি ব্যবহার করা । এই বিকল্পটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে "প্রকৃত বাস্তবায়ন পরিকল্পনা অন্তর্ভুক্ত করুন" বিকল্পের সমতুল্য এবং সবচেয়ে সুবিধাজনক বিন্যাসে সর্বাধিক তথ্য সরবরাহ করে।
SHOWPLAN_TEXT
- কোয়েরি কার্যকর না করে একটি প্রাথমিক পাঠ্য ভিত্তিক আনুমানিক বাস্তবায়ন পরিকল্পনা প্রদর্শন করেSHOWPLAN_ALL
- কোয়েরি কার্যকর না করে ব্যয় নির্ধারণের সাথে পাঠ্য ভিত্তিক আনুমানিক বাস্তবায়ন পরিকল্পনা প্রদর্শন করেSHOWPLAN_XML
- কোয়েরি কার্যকর না করে ব্যয় অনুমানের সাথে একটি এক্সএমএল ভিত্তিক আনুমানিক বাস্তবায়ন পরিকল্পনা প্রদর্শন করে। এটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে "ডিসপ্লে আনুমানিক বাস্তবায়ন পরিকল্পনা ..." বিকল্পের সমান।STATISTICS PROFILE
- ক্যোয়ারি কার্যকর করে এবং একটি পাঠ্য ভিত্তিক প্রকৃত বাস্তবায়ন পরিকল্পনা প্রদর্শন করে।STATISTICS XML
- ক্যোয়ারি কার্যকর করে এবং একটি এক্সএমএল ভিত্তিক প্রকৃত বাস্তবায়ন পরিকল্পনা প্রদর্শন করে। এটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে "প্রকৃত বাস্তবায়ন পরিকল্পনা অন্তর্ভুক্ত করুন" বিকল্পের সমতুল্য।আপনি যদি নিজের কোয়েরিটি সরাসরি চালাতে না পারেন (বা আপনার ক্যোয়ারীটি আপনি সরাসরি সম্পাদন করার সময় ধীরে ধীরে চলবে না - মনে রাখবেন আমরা কোয়েরিটি খারাপভাবে সম্পাদন করার পরিকল্পনা চাই) তবে আপনি একটি এসকিউএল সার্ভার প্রোফাইলার ট্রেস ব্যবহার করে একটি পরিকল্পনা ক্যাপচার করতে পারেন। "শোপ্লান" ইভেন্টের একটি ক্যাপচার করছে এমন কোনও ট্রেস চলাকালীন আপনার কোয়েরিটি চালানোর ধারণা The
নোট করুন যে লোডের উপর নির্ভর করে আপনি উত্পাদন পদ্ধতিতে এই পদ্ধতিটি ব্যবহার করতে পারেন তবে অবশ্যই আপনার সাবধানতা অবলম্বন করা উচিত। এসকিউএল সার্ভার প্রোফাইলিং প্রক্রিয়াগুলি ডাটাবেসের উপর প্রভাব হ্রাস করার জন্য ডিজাইন করা হয়েছে তবে এর অর্থ এই নয় যে কোনও কার্যকারিতা প্রভাব থাকবে না । আপনার ডাটাবেস অতিরিক্ত ব্যবহারের মধ্যে থাকলে আপনার ট্রেসগুলিতে সঠিক পরিকল্পনাটি ফিল্টারিং এবং সনাক্ত করতেও সমস্যা হতে পারে। আপনার ডিবিএর সাথে অবশ্যই তাদের চেক করা উচিত যে তারা তাদের মূল্যবান ডাটাবেসে আপনার সাথে এটি করতে খুশি কিনা!
আপনি যে পরিকল্পনাটি পান সেটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে "প্রকৃত বাস্তবায়ন পরিকল্পনা অন্তর্ভুক্ত করুন" বিকল্পের সমতুল্য।
আপনি যদি নিজের অনুসন্ধানটি সরাসরি চালাতে না পারেন এবং আপনি কোনও প্রোফাইলার ট্রেসও ক্যাপচার করতে না পারেন তবে আপনি এসকিউএল ক্যোয়ারী প্ল্যান ক্যাশে পরিদর্শন করে একটি আনুমানিক পরিকল্পনা পেতে পারেন।
আমরা এসকিউএল সার্ভার ডিএমভিগুলি জিজ্ঞাসা করে পরিকল্পনা ক্যাশেটি পরিদর্শন করি । নিম্নলিখিতটি একটি বেসিক ক্যোয়ারী যা তাদের এসকিউএল পাঠ্য সহ সমস্ত ক্যাশেড ক্যোয়ারী প্ল্যানগুলি (এক্সএমএল হিসাবে) তালিকাভুক্ত করবে। বেশিরভাগ ডাটাবেসে আপনার আগ্রহী পরিকল্পনাগুলিতে ফলাফলগুলি ফিল্টার করার জন্য আপনাকে অতিরিক্ত ফিল্টারিং ক্লজগুলি যুক্ত করতে হবে।
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)
এই কোয়েরিটি সম্পাদন করুন এবং নতুন উইন্ডোতে প্ল্যানটি খোলার জন্য এক্সএমএল পরিকল্পনাটি ক্লিক করুন - ডান ক্লিক করুন এবং এক্সএমএল ফর্ম্যাটে প্ল্যানটি ফাইল করার জন্য সংরক্ষণ হিসাবে "এক্সিকিউশন প্ল্যানটি সেভ করুন ..." নির্বাচন করুন।
কারণ এতে অনেকগুলি উপাদান জড়িত রয়েছে (টেবিল এবং সূচি স্কিম থেকে শুরু করে সঞ্চিত ডেটা এবং টেবিলের পরিসংখ্যান পর্যন্ত) আপনার আগ্রহী ডাটাবেস থেকে সর্বদা কার্যকর করার পরিকল্পনা গ্রহণের চেষ্টা করা উচিত (সাধারণত যেটি কোনও কার্য সম্পাদন করছে তা হ'ল) সমস্যা)।
এনক্রিপ্ট হওয়া সঞ্চিত প্রক্রিয়াগুলির জন্য আপনি কার্যকর করার পরিকল্পনা ক্যাপচার করতে পারবেন না।
একটি আসল এক্সিকিউশন প্ল্যান হ'ল এসকিউএল সার্ভার আসলে ক্যোয়ারি চালায়, অন্যদিকে আনুমানিক এক্সিকিউশন প্ল্যান এসকিউএল সার্ভার কাজটি কার্য সম্পাদন না করে কী করবে তা কার্যকর করে। যৌক্তিকভাবে সমতুল্য হলেও, বাস্তবিক বাস্তবায়ন পরিকল্পনাটি অনেক বেশি কার্যকর কারণ এতে কোয়েরি কার্যকর করার সময় আসলে কী ঘটেছিল সে সম্পর্কে অতিরিক্ত বিশদ এবং পরিসংখ্যান রয়েছে। যেখানে এসকিউএল সার্ভারের অনুমানগুলি বন্ধ রয়েছে (যেমন পরিসংখ্যানের মেয়াদ শেষ হয়ে যায়) এমন সমস্যাগুলি সনাক্ত করার সময় এটি প্রয়োজনীয়।
এটি একটি নিজস্ব (মুক্ত) বইয়ের পক্ষে যথেষ্ট উপযুক্ত বিষয় ।
SET STATISTICS XML ON
ক্যোয়ারির শুরুতে পিঁপড়া এবং SET STATISTICS XML OFF|ON
আশেপাশের অঞ্চলগুলি আপনি পরিকল্পনার আউটপুটে প্রদর্শিত হতে চান না : ক্যোয়ারিতে একটি পুনরাবৃত্তি রয়েছে (যখন আপনি চাইবেন না) যখন আমি চাই না তখন আমি এই দরকারী হয়েছি এক্সিকিউশন প্ল্যানে দেখতে (অন্যথায় এটি এসকিউএল সার্ভার প্রদর্শন করার জন্য খুব ভারী এবং দীর্ঘ হবে)।
ইতিমধ্যে পোস্ট করা বিস্তৃত উত্তর ছাড়াও কখনও কখনও তথ্য আহরণের জন্য কার্যকরভাবে পরিকল্পনার মাধ্যমে অ্যাক্সেস করতে সক্ষম হওয়া কার্যকর। এর জন্য উদাহরণ কোডটি নীচে।
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
ধরে নিচ্ছি আপনি মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করছেন
পূর্ববর্তী উত্তরে বর্ণিত পদ্ধতিগুলির পাশাপাশি আপনি একটি নিখরচায় বাস্তবায়ন পরিকল্পনা দর্শক এবং ক্যোয়ারী অপ্টিমাইজেশন সরঞ্জাম অ্যাপেক্সএসকিউএল প্ল্যান (যা আমি সম্প্রতি ঝাঁপিয়ে পড়েছি ) ব্যবহার করতে পারি।
আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে অ্যাপেক্সএসকিউএল প্ল্যান ইনস্টল ও সংহত করতে পারেন, তাই এক্সিকিউশন পরিকল্পনাটি সরাসরি এসএসএমএস থেকে দেখা যায়।
অ্যাপেক্সএসকিউএল পরিকল্পনায় আনুমানিক বাস্তবায়ন পরিকল্পনাগুলি দেখা হচ্ছে
অ্যাপেক্সএসকিউএল পরিকল্পনায় প্রকৃত বাস্তবায়ন পরিকল্পনাগুলি দেখুন
একটি ক্যোয়ারির প্রকৃত বাস্তবায়ন পরিকল্পনাটি দেখতে, পূর্বে উল্লিখিত ২ য় পদক্ষেপ থেকে চালিয়ে যান, তবে এখন, একবার অনুমানিত পরিকল্পনাটি প্রদর্শিত হয়ে গেলে অ্যাপেক্সএসকিউএল পরিকল্পনার মূল ফিতা বার থেকে "প্রকৃত" বোতামটি ক্লিক করুন।
একবার "আসল" বোতামটি ক্লিক করা হলে, বাস্তব সম্পাদন পরিকল্পনাটি অন্যান্য সম্পাদন পরিকল্পনার ডেটা সহ ব্যয়ের পরামিতিগুলির বিশদ পূর্বরূপ সহ প্রদর্শিত হবে।
সম্পাদন পরিকল্পনা দেখার বিষয়ে আরও তথ্য এই লিঙ্কটি অনুসরণ করে পাওয়া যাবে ।
ক্যোয়ারি এক্সিকিউশন প্ল্যানগুলি অর্জন এবং গভীরভাবে বিশ্লেষণ করার জন্য আমার প্রিয় সরঞ্জামটি এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরার । এটি এসএসএমএসের চেয়ে কার্যকর বিশ্লেষণ এবং বাস্তবায়নের পরিকল্পনার দৃশ্যধারণের জন্য আরও বেশি ব্যবহারকারী-বান্ধব, সুবিধাজনক এবং ব্যাপক and
সরঞ্জামটির মাধ্যমে কী কার্যকারিতাটি দেওয়া হচ্ছে সে সম্পর্কে আপনার ধারণা পেতে এখানে একটি নমুনা স্ক্রিন শট দেওয়া হয়েছে:
এটি কেবলমাত্র সরঞ্জামটিতে উপলব্ধ ভিউগুলির মধ্যে একটি। অ্যাপ্লিকেশন উইন্ডোটির নীচে ট্যাবগুলির একটি সেট লক্ষ্য করুন, যা আপনাকে বিভিন্ন ধরণের আপনার সম্পাদন পরিকল্পনার উপস্থাপনা এবং দরকারী অতিরিক্ত তথ্যও পেতে দেয়।
তদতিরিক্ত, আমি এর নিখরচায় সংস্করণের কোনও সীমাবদ্ধতা লক্ষ্য করিনি যা এটি দৈনিক ভিত্তিতে এটি ব্যবহার করা বাধা দেয় বা আপনাকে শেষ পর্যন্ত প্রো সংস্করণ কিনতে বাধ্য করে। সুতরাং, আপনি যদি ফ্রি সংস্করণটি বজায় রাখতে পছন্দ করেন তবে কোনও কিছুই আপনাকে এটি করতে বাধা দেয় না।
আপডেট: ( মার্টিন স্মিথকে ধন্যবাদ ) প্ল্যান এক্সপ্লোরার এখন বিনামূল্যে! বিস্তারিত জানার জন্য http://www.sqlsentry.com/products/plan-explorer/sql-server-query-view দেখুন ।
Speaking of third-party tools
যখন কেউ তৃতীয় পক্ষের সরঞ্জামগুলির উল্লেখ না করল তখন আপনি কীভাবে আপনার উত্তরটির শুরুতে কথিত তা নিয়ে মজা করছিলেন।
query_post_execution_showplan
ইভেন্টের মাধ্যমে বর্ধিত ইভেন্টস সেশন থেকে ক্যোয়ারী প্ল্যানগুলি পাওয়া যাবে । এখানে একটি নমুনা এক্সএভেন্ট সেশন:
/*
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
আপনি সেশনটি তৈরি করার পরে (এসএসএমএসে) অবজেক্ট এক্সপ্লোরারে যান এবং ম্যানেজমেন্ট | বর্ধিত ইভেন্ট | দায়রা। "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
দু'এক মুহুর্তের পরে, আপনার "গেটএ্যাক্সেকিউশন প্ল্যান: লাইভ ডেটা" ট্যাবে কিছু ফলাফল দেখতে হবে। গ্রিডের ক্যোয়ারী_পোস্ট_এক্সেকিউশন_শোপ্লান ইভেন্টগুলির একটিতে ক্লিক করুন এবং তারপরে গ্রিডের নীচে "ক্যোয়ারী প্ল্যান" ট্যাবটি ক্লিক করুন। এটি দেখতে এটির মতো দেখতে পাওয়া উচিত:
সম্পাদনা : এক্সইভেন্ট কোড এবং স্ক্রিন শট এসকিউএল / এসএসএমএস 2012 ডাব্লু / এসপি 2 থেকে উত্পন্ন হয়েছিল। আপনি যদি এসকিউএল 2008 / আর 2 ব্যবহার করেন তবে স্ক্রিপ্টটি চালানোর জন্য আপনি এটি টুইট করতে সক্ষম হতে পারেন। তবে সেই সংস্করণটির একটি জিইউআই নেই, সুতরাং আপনাকে শোপ্ল্যান এক্সএমএলটি বের করতে হবে, এটি একটি * .এসকিপ্ল্যান ফাইল হিসাবে সংরক্ষণ করতে হবে এবং এটি এসএসএমএসে খুলতে হবে। এটাই বোঝা। এক্সএভেন্টস এসকিউএল 2005 বা তার আগেরটিতে উপস্থিত ছিল না। সুতরাং, আপনি যদি এসকিউএল 2012 বা তার পরে না থাকেন তবে আমি এখানে পোস্ট করা অন্য উত্তরগুলির মধ্যে একটির দৃ strongly়তার সাথে পরামর্শ দেব।
এসকিউএল সার্ভার 2016+ থেকে শুরু করে, ক্যোয়ারী স্টোর বৈশিষ্ট্যটি কার্যকারিতা নিরীক্ষণের জন্য চালু করা হয়েছিল। এটি ক্যোয়ারী পরিকল্পনার পছন্দ এবং কার্যকারিতা সম্পর্কে অন্তর্দৃষ্টি সরবরাহ করে। এটি ট্রেস বা বর্ধিত ইভেন্টগুলির সম্পূর্ণ প্রতিস্থাপন নয়, তবে এটি সংস্করণ থেকে সংস্করণে বিকশিত হওয়ায় আমরা এসকিউএল সার্ভার থেকে ভবিষ্যতে প্রকাশে একটি সম্পূর্ণ কার্যকরী ক্যোয়ারী স্টোর পেতে পারি। ক্যোয়ারী স্টোরের প্রাথমিক প্রবাহ
ক্যোয়ারী স্টোর সক্ষম করে : ক্যোয়ারী স্টোর সার্ভারে ডাটাবেস স্তরে কাজ করে।
tempdb
ডাটাবেসের জন্য ক্যোয়ারী স্টোর সক্ষম করতে পারবেন না ।
sys.database_query_store_options
(লেনদেন এসকিউএল)
ক্যোয়ারী স্টোরের তথ্য সংগ্রহ করুন : আমরা কোয়েরি স্টোর ডিএমভি (ডেটা ম্যানেজমেন্ট ভিউ) ব্যবহার করে তিনটি স্টোর থেকে সমস্ত উপলভ্য তথ্য সংগ্রহ করি।
ক্যোয়ারী প্ল্যান স্টোর: এক্সিকিউশন প্ল্যানের তথ্য রাখে এবং ক্যোয়ারী সংকলনের সাথে সম্পর্কিত সমস্ত তথ্য ক্যাপচারের জন্য এটি দায়বদ্ধ।
sys.query_store_query
(লেনদেন-এসকিউএল)sys.query_store_plan
(লেনদেন-এসকিউএল)sys.query_store_query_text
(লেনদেন-এসকিউএল)
রানটাইম পরিসংখ্যানের স্টোর: সম্পাদন সম্পর্কিত পরিসংখ্যান সম্পর্কিত তথ্য রয়েছে এবং এটি সম্ভবত সবচেয়ে ঘন ঘন আপডেট হওয়া স্টোর। এই পরিসংখ্যান ক্যোয়ারি এক্সিকিউশন ডেটা উপস্থাপন করে।
sys.query_store_runtime_stats
(লেনদেন এসকিউএল)
ক্যারিয়ার অপেক্ষার পরিসংখ্যান স্টোর: অপেক্ষার পরিসংখ্যান সম্পর্কিত তথ্য থাকা এবং ক্যাপচার করা।
sys.query_store_wait_stats
(লেনদেন এসকিউএল)
দ্রষ্টব্য: ক্যোয়ারি ওয়েট স্ট্যাটাস স্টোরটি কেবলমাত্র এসকিউএল সার্ভার 2017+ এ উপলব্ধ
এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওর মতো (ইতিমধ্যে ব্যাখ্যা করা হয়েছে), এখানে বর্ণিত হিসাবে ডেটাগ্রিপ দিয়ে এটিও সম্ভব ।
- একটি এসকিউএল বিবৃতিতে রাইট ক্লিক করুন এবং পরিকল্পনাটি ব্যাখ্যা করুন নির্বাচন করুন।
- আউটপুট ফলকে প্ল্যান ক্লিক করুন।
- ডিফল্টরূপে, আপনি ক্যোয়ারির গাছের উপস্থাপনা দেখতে পাচ্ছেন। ক্যোয়ারী প্ল্যানটি দেখতে, ভিজ্যুয়ালাইজেশন দেখান আইকনটি ক্লিক করুন বা Ctrl + Shift + Alt + U টিপুন
এখানে আগে বলা সমস্ত কিছু ছাড়াও একটি গুরুত্বপূর্ণ বিষয় এখানে জানানো উচিত।
ক্যোয়ারী প্ল্যানগুলি প্রায়শই অন্তর্নির্মিত এক্সএমএল কলাম প্রকারের দ্বারা প্রতিনিধিত্ব করতে জটিল হয় যার মধ্যে নেস্টেড উপাদানগুলির 127 স্তরের সীমাবদ্ধতা রয়েছে। Sys.dm_exec_query_planNULL
এর পূর্বের এমএস এসকিউএল সংস্করণগুলিতে ত্রুটি ফিরে আসতে বা এমনকি ফেলে দিতে পারে এমন একটি কারণ , তাই সাধারণত sys.dm_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
ফলস্বরূপ সারণীতে পাঠ্য কলামটি কোনও এক্সএমএল কলামের তুলনায় খুব সহজ নয়। কোনও ফাইলের বিষয়বস্তুগুলি কোনও সংরক্ষণ না করে ডায়াগ্রাম হিসাবে আলাদা ট্যাবে খোলার জন্য ফলাফলটি ক্লিক করতে সক্ষম হতে আপনি একটি সামান্য কৌশল ব্যবহার করতে পারেন (মনে রাখবেন আপনি কেবল ব্যবহার করতে পারবেন না 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
আমি যেমন এই নিবন্ধে ব্যাখ্যা করেছি , এসকিউএল সার্ভার ব্যবহার করার সময় আপনি দুটি কার্যনির্বাহী পরিকল্পনার পরিকল্পনা পেতে পারেন।
আনুমানিক বাস্তবায়ন পরিকল্পনাটি এসকিউএল কোয়েরি না চালিয়ে অপ্টিমাইজার দ্বারা উত্পাদিত হয়।
আনুমানিক বাস্তবায়ন পরিকল্পনাটি পেতে, ক্যোরি কার্যকর SHOWPLAN_ALL
করার আগে আপনাকে সেটিংস সক্ষম করতে হবে ।
SHPLPL_ALL সেট করুন
এখন, নিম্নলিখিত এসকিউএল কোয়েরি সম্পাদন করার সময়:
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
এসকিউএল সার্ভার নিম্নলিখিত আনুমানিক বাস্তবায়ন পরিকল্পনা উত্পন্ন করবে:
| 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
অন্যথায়, বর্তমান ডাটাবেস সেশন সরবরাহ করা এসকিউএল কোয়েরিগুলি সম্পাদন করার পরিবর্তে কেবলমাত্র আনুমানিক বাস্তবায়ন পরিকল্পনা উত্পন্ন করবে।
SET SHOWPLAN_ALL OFF
এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও অ্যাপ্লিকেশনটিতে, আপনি CTRL+L
কী শর্টকাটটি আঘাত করে সহজেই যে কোনও এসকিউএল কোয়েরির জন্য আনুমানিক বাস্তবায়ন পরিকল্পনাটি পেতে পারেন ।
এসকিউএল কোয়েরি চালানোর সময় অপ্টিমাইজারের মাধ্যমে আসল এসকিউএল বাস্তবায়ন পরিকল্পনা উত্পন্ন হয়। যদি ডাটাবেস টেবিলের পরিসংখ্যানগুলি সঠিক হয় তবে আসল পরিকল্পনাটি অনুমানের তুলনায় উল্লেখযোগ্যভাবে পৃথক হওয়া উচিত নয়।
এসকিউএল সার্ভারে প্রকৃত বাস্তবায়ন পরিকল্পনা পেতে, আপনাকে STATISTICS IO, TIME, PROFILE
নিম্নলিখিত এসকিউএল আদেশ দ্বারা চিত্রিত হিসাবে সেটিংস সক্ষম করতে হবে :
SET STATISTICS IO, TIME, PROFILE ON
এখন, পূর্ববর্তী ক্যোয়ারীটি চালনার সময়, এসকিউএল সার্ভারটি নিম্নলিখিত সম্পাদন পরিকল্পনা তৈরি করতে চলেছে:
| 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
এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও অ্যাপ্লিকেশনটিতে, আপনি CTRL+M
কী শর্টকাটটি আঘাত করে সহজেই যে কোনও এসকিউএল কোয়েরির জন্য আনুমানিক বাস্তবায়ন পরিকল্পনাটি পেতে পারেন ।
এসকিউএল সার্ভার ব্যবহার করার সময় একটি কার্যকরকরণ পরিকল্পনা পাওয়ার বিষয়ে আরও তথ্যের জন্য, এই নিবন্ধটি দেখুন ।
আপনি আসল পরিকল্পনা পেতে পাওয়ার স্টেটের মাধ্যমে সেট স্ট্যাটিক্স এক্সএমএল ব্যবহার করেও এটি করতে পারেন। আমি এটি লিখেছি যাতে এটি বহু পরিকল্পনার পরিকল্পনাগুলিকে এক পরিকল্পনায় একীভূত করে;
########## 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()
এক্সিকিউশন প্ল্যানের ব্যাখ্যাটি খুব বিশদ হতে পারে এবং পড়ার সময় অনেকটা সময় নিতে পারে, তবে সংক্ষেপে আপনি যদি কোয়েরির আগে 'ব্যাখ্যা' ব্যবহার করেন তবে এটি আপনাকে কোন অংশে প্রথমে কার্যকর করা হয়েছিল সেগুলি সহ আরও অনেক তথ্য দেবে। আপনি যদি এই সম্পর্কে আরও কিছু বিশদ পড়তে চান তবে আমি এই সম্পর্কে একটি ছোট্ট ব্লগ সংকলন করেছি যা আপনাকে পাশাপাশি ডান রেফিসেও নির্দেশ করে। https://medium.com/swlh/jetbrains-datagrip-explain-plan-ac406772c470