sql - আমি কিভাবে একটি প্রশ্ন এক্সিকিউশন পরিকল্পনা পেতে পারি?




sql-server performance (6)

আপনি মাইক্রোসফ্ট এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করছেন অনুমান

  • আনুমানিক ক্যুইরি প্ল্যানের জন্য আপনি Ctrl + L বা নিচের বোতাম টিপতে পারেন।

  • প্রকৃত ক্যোয়ারী প্ল্যানের জন্য , আপনি ক্যোয়ারী নির্বাহ করার আগে Ctrl + M বা নীচের বোতাম টিপতে পারেন।

  • লাইভ কুইয়ের প্ল্যানের জন্য , (শুধুমাত্র এসএসএমএস ২016 সালে) প্রশ্নটি কার্যকর করার আগে নিচের বোতামটি ব্যবহার করুন।

মাইক্রোসফ্ট এসকিউএল সার্ভারে আমি কিভাবে একটি প্রশ্ন / সংরক্ষিত পদ্ধতির জন্য একটি অনুসন্ধান নির্বাহ পরিকল্পনা পেতে পারি?


এখানে আগে বলা সব ছাড়াও একটি গুরুত্বপূর্ণ জিনিস জানতে।

ক্যোয়ারী প্ল্যানগুলি প্রায়শই জটিল হয় যা বিল্ট-ইন XML কলাম টাইপ দ্বারা উপস্থাপিত হয় যা নেস্টেড উপাদানের 127 স্তরের সীমাবদ্ধতা রয়েছে। sys.dm_exec_query_plan NULL ফেরত sys.dm_exec_query_plan পারে এমন একটি কারণ বা পূর্ববর্তী MS SQL সংস্করণগুলিতে এমনকি একটি ত্রুটি নিক্ষেপ করতে পারে, তাই সাধারণত এটির পরিবর্তে 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

ফলস্বরূপ টেবিলে পাঠ্য কলামটি একটি XML কলামের তুলনায় খুব সহজ নয়। একটি ফাইলের মধ্যে তার বিষয়বস্তু সংরক্ষণ না করেই, একটি চিত্র হিসাবে পৃথক ট্যাবে খোলা ফলাফলটি ক্লিক করতে সক্ষম হবার জন্য, আপনি একটু কৌশল ব্যবহার করতে পারেন (মনে রাখবেন আপনি কেবল CAST(... AS 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

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও (ইতোমধ্যে ব্যাখ্যা করা হয়েছে) এর সাথে লেগেছে, here ব্যাখ্যা হিসাবে এটি Datagrip এর সাথেও সম্ভব।

  1. একটি SQL বিবৃতি রাইট ক্লিক করুন, এবং পরিকল্পনা ব্যাখ্যা করুন নির্বাচন করুন।
  2. আউটপুট ফলক, পরিকল্পনা ক্লিক করুন।
  3. ডিফল্টরূপে, আপনি প্রশ্নটির গাছ উপস্থাপনা দেখতে পান। প্রশ্নের পরিকল্পনাটি দেখতে, ভিজ্যুয়ালাইজেশন আইকনটি দেখান বা Ctrl + Shift + Alt + U টিপুন

কার্যকরকরণ পরিকল্পনা পাওয়ার কয়েকটি পদ্ধতি রয়েছে, যা ব্যবহার করার জন্য আপনার পরিস্থিতিগুলি নির্ভর করবে। সাধারণত আপনি একটি প্ল্যান পেতে এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করতে পারেন, তবে কিছু কারণে আপনি যদি SQL সার্ভার ম্যানেজমেন্ট স্টুডিওতে আপনার প্রশ্নটি চালাতে না পারেন তবে আপনি SQL সার্ভার প্রোফাইলারের মাধ্যমে কোনও পরিকল্পনা পেতে সক্ষম হবেন বা এটি পরিদর্শনের মাধ্যমে পরিকল্পনা ক্যাশে।

পদ্ধতি 1 - SQL সার্ভার ম্যানেজমেন্ট স্টুডিও ব্যবহার করে

এসকিউএল সার্ভারটি কয়েকটি সুবিধাযুক্ত বৈশিষ্ট্য নিয়ে আসে যা একটি কার্যকরকরণ পরিকল্পনাটি ক্যাপচার করা সহজ করে তোলে, কেবলমাত্র নিশ্চিত করুন যে "আসল এক্সিকিউশন প্ল্যান" মেনু আইটেমটি ("কোয়েরি" মেনু অনুসারে পাওয়া যায়) টি টিপ করা হয় এবং আপনার ক্যোয়ারিকে স্বাভাবিক হিসাবে চালানো হয় ।

যদি আপনি একটি সংরক্ষিত পদ্ধতিতে বিবৃতিগুলির জন্য নির্বাহ পরিকল্পনাটি পেতে চেষ্টা করেন তবে আপনাকে সেভাবে সংরক্ষণ হওয়া পদ্ধতিটি চালানো উচিত:

exec p_Example 42

আপনার ক্যোয়ারীটি সম্পন্ন হলে ফলাফল ফলকটিতে "এক্সিকিউশন প্ল্যান" শিরোনামযুক্ত একটি অতিরিক্ত ট্যাব দেখতে হবে। আপনি অনেক বিবৃতি দৌড়ে যদি আপনি এই ট্যাবে প্রদর্শিত অনেক পরিকল্পনা দেখতে পারেন।

এখান থেকে আপনি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে নির্বাহ পরিকল্পনাটি পরিদর্শন করতে পারেন, অথবা পরিকল্পনাটির উপর ডান ক্লিক করুন এবং XML ফরম্যাটে একটি ফাইলে প্ল্যানটি সংরক্ষণ করার জন্য "অ্যাকজেকশন প্ল্যান ... এভাবে সংরক্ষণ করুন" নির্বাচন করুন।

পদ্ধতি 2 - SHOWPLAN বিকল্প ব্যবহার করে

এই পদ্ধতিটি পদ্ধতি 1 এর অনুরূপ (আসলে এইটি এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওটি অভ্যন্তরীণভাবে করে) তবে আমি এটি সম্পূর্ণরূপে অন্তর্ভুক্ত করেছি অথবা যদি আপনার কাছে 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 - একটি এক্সএমএল ভিত্তিক আনুমানিক নির্বাহ পরিকল্পনা পরিকল্পনা মূল্য নির্বাহ ছাড়াই, মূল্য অনুমান সহ প্রদর্শন করে। এটি SQL সার্ভার ম্যানেজমেন্ট স্টুডিওতে "প্রদর্শন আনুমানিক এক্সিকিউশন প্ল্যান ..." বিকল্পের সমতুল্য।
  • STATISTICS PROFILE - ক্যোয়ারীটি চালায় এবং একটি পাঠ্য ভিত্তিক প্রকৃত এক্সিকিউশন প্ল্যান প্রদর্শন করে।
  • STATISTICS XML - প্রশ্নটি এক্সিকিউট করে এবং এক্সএমএল ভিত্তিক প্রকৃত এক্সিকিউশন প্ল্যান প্রদর্শন করে। এটি SQL সার্ভার ম্যানেজমেন্ট স্টুডিওতে "আসল এক্সিকিউশন প্ল্যান অন্তর্ভুক্ত করুন" বিকল্পের সমতুল্য।

পদ্ধতি 3 - এসকিউএল সার্ভার প্রোফাইলার ব্যবহার করে

যদি আপনি সরাসরি আপনার ক্যোয়ারী চালাতে না পারেন (অথবা আপনার ক্যোয়ারীটি সরাসরি চালানোর সময় ধীরে ধীরে চলবে না - মনে রাখবেন আমরা খারাপভাবে সঞ্চালনকারী একটি পরিকল্পনা চাই), তাহলে আপনি একটি SQL সার্ভার প্রোফাইলার ট্রেস ব্যবহার করে একটি পরিকল্পনা ক্যাপচার করতে পারেন। "শপলান" ইভেন্টগুলির মধ্যে যে কোন একটি ট্র্যাপ ধরে রাখা হচ্ছে তা চলাকালীন আপনার ক্যোয়ারী চালানোর ধারণাটি চলছে।

উল্লেখ্য যে লোডের উপর নির্ভর করে আপনি এই পদ্ধতিটি উত্পাদন পরিবেশে ব্যবহার করতে পারেন, তবে আপনি অবশ্যই সতর্কতা অবলম্বন করতে হবে। SQL সার্ভার প্রোফাইলিং প্রক্রিয়াগুলি ডেটাবেসে প্রভাবকে কমিয়ে আনার জন্য ডিজাইন করা হয়েছে কিন্তু এর অর্থ এই নয় যে কোনো কার্যকারিতা প্রভাব থাকবে না। আপনার ডেটাবেস ভারী ব্যবহারে থাকলে আপনার ট্রেসটিতে সঠিক প্ল্যানটি ফিল্টারিং এবং শনাক্ত করতে সমস্যা হতে পারে। আপনার অবশ্যই তাদের মূল্যবান ডাটাবেসের উপর এটি করার মাধ্যমে তারা খুশি কিনা তা দেখতে আপনার ডিবিএর সাথে অবশ্যই পরীক্ষা করা উচিত!

  1. এসকিউএল সার্ভার প্রোফাইলহোল্ডার খুলুন এবং আপনি এমন ট্রেস রেকর্ড করতে চান যার জন্য পছন্দসই ডাটাবেস সংযুক্ত একটি নতুন ট্রেস তৈরি করুন।
  2. "ইভেন্টস নির্বাচন" ট্যাবের অধীনে "সমস্ত ইভেন্ট দেখান" চেক করুন, "পারফরম্যান্স" -> "শোপ্লান এক্সএমএল" সারিটি চেক করুন এবং ট্রেসটি চালান।
  3. ট্রেস চলমান থাকলে, চালানোর জন্য ধীর চলমান ক্যোয়ারীটি পেতে আপনাকে যা করতে হবে তা করুন।
  4. ট্রেস সম্পূর্ণ এবং ট্রেস বন্ধ করার জন্য অপেক্ষা করুন।
  5. ট্রেস সংরক্ষণ করতে ডানদিকে XML সার্ভার প্রোফাইলের প্ল্যান XML এ ক্লিক করুন এবং XML ফর্ম্যাটে ফাইলটি সংরক্ষণ করার জন্য "ইভেন্ট ডেটা এক্সট্রাক্ট করুন ..." নির্বাচন করুন।

আপনি পেতে পরিকল্পনা SQL সার্ভার ম্যানেজমেন্ট স্টুডিওতে "আসল এক্সিকিউশন প্ল্যান অন্তর্ভুক্ত করুন" বিকল্পের সমতুল্য।

পদ্ধতি 4 - প্রশ্ন ক্যাশে পরিদর্শন

আপনি যদি সরাসরি আপনার ক্যোয়ারী চালাতে না পারেন এবং আপনি কোনও প্রোফাইলার ট্রেস ধরতে না পারেন তবে আপনি এখনও SQL ক্যোয়ারী পরিকল্পনা ক্যাশে পরিদর্শন করে আনুমানিক পরিকল্পনাটি পেতে পারেন।

আমরা এসকিউএল সার্ভার DMVs ক্যোয়ারী দ্বারা পরিকল্পনা ক্যাশ পরিদর্শন। নিম্নলিখিত একটি মৌলিক প্রশ্ন যা তাদের এসকিউএল পাঠ্য সহ সমস্ত ক্যাশেড ক্যোয়ারী পরিকল্পনা (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)

এই প্রশ্নটি চালান এবং নতুন উইন্ডোতে প্ল্যানটি খুলতে প্ল্যান XML এ ক্লিক করুন - XML ​​ফর্ম্যাটে ফাইলটি সংরক্ষণ করার জন্য ডান ক্লিক করুন এবং "সংরক্ষণের পরিকল্পনাটি সংরক্ষণ করুন ..." নির্বাচন করুন।

নোট:

যেহেতু জড়িত অনেকগুলি কারণ রয়েছে (টেবিল এবং সূচী স্কিমা থেকে ডেটা সঞ্চিত এবং টেবিল পরিসংখ্যান পর্যন্ত নিচে) আপনার সর্বদা আপনার আগ্রহের ডেটাবেস থেকে একটি নির্বাহ পরিকল্পনা পেতে চেষ্টা করা উচিত (সাধারণত এমন একটি যা পারফরমেন্স সম্মুখীন হচ্ছে সমস্যা)।

আপনি এনক্রিপ্ট করা সঞ্চিত পদ্ধতির জন্য একটি নির্বাহকরণ পরিকল্পনা ক্যাপচার করতে পারবেন না।

"প্রকৃত" বনাম "আনুমানিক" মৃত্যুদন্ড পরিকল্পনা

প্রকৃত এক্সিকিউশন প্ল্যান এমন একটি যেখানে SQL সার্ভারটি প্রকৃতপক্ষে প্রশ্নটি চালায়, যেখানে একটি আনুমানিক নির্বাহ পরিকল্পনা প্লাগ এক্সিকিউটিভ ছাড়াই কী করবে তা SQL সার্ভারটি কাজ করে। যৌক্তিকভাবে সমতুল্য হলেও, প্রকৃত বাস্তবায়ন পরিকল্পনাটি আরও বেশি কার্যকর কারণ এটি অতিরিক্ত বিশদ এবং পরিসংখ্যান কার্যকর করার সময় কী ঘটেছে তার পরিসংখ্যান রয়েছে। এসকিউএল সার্ভারের আনুমানিকতাগুলি বন্ধ করার ক্ষেত্রে সমস্যাগুলির নির্ণয় করার সময় এটি অপরিহার্য (যেমন যখন পরিসংখ্যান শেষ হয়ে গেছে)।

আমি কিভাবে একটি প্রশ্নের এক্সিকিউশন পরিকল্পনা ব্যাখ্যা করবেন?

এটি একটি বিষয় (বিনামূল্যে) book নিজস্ব অধিকারে যথেষ্ট যোগ্য।

আরো দেখুন:


পূর্ববর্তী উত্তরগুলিতে বর্ণিত পদ্ধতিগুলির পাশাপাশি, আপনি একটি বিনামূল্যে এক্সিকিউশন প্ল্যান ভিউয়ার এবং ক্যোয়ারী অপ্টিমাইজেশান টুল ApexSQL প্ল্যান (যা আমি সম্প্রতি ঢুকেছি ) ব্যবহার করতে পারি।

আপনি এসপিএক্সএসকিউএল প্ল্যানটি SQL সার্ভার ম্যানেজমেন্ট স্টুডিওতে ইনস্টল এবং সংহত করতে পারেন, তাই নির্বাহ পরিকল্পনাগুলি সরাসরি এসএসএমএস থেকে দেখা যেতে পারে।

ApexSQL পরিকল্পনা মধ্যে আনুমানিক মৃত্যুদন্ড পরিকল্পনা দেখতে

  1. এসএসএমএসের নতুন ক্যোয়ারী বাটনে ক্লিক করুন এবং কোয়েরি টেক্সট উইন্ডোতে ক্যোয়ারী টেক্সট পেস্ট করুন। রাইট ক্লিক করুন এবং প্রসঙ্গ মেনু থেকে "প্রদর্শন আনুমানিক এক্সিকিউশন প্ল্যান" বিকল্পটি নির্বাচন করুন।

  1. এক্সিকিউশন প্ল্যান চিত্রগুলি ফলাফল বিভাগে এক্সিকিউশন প্ল্যান ট্যাব দেখানো হবে। পরবর্তীতে কার্যকরকরণ পরিকল্পনাটি ডান-ক্লিক করুন এবং প্রসঙ্গ মেনুতে "ApexSQL প্ল্যান খুলুন" বিকল্পটি নির্বাচন করুন।

  1. অ্যাপেক্সএসকিউএল প্ল্যানে আনুমানিক নির্বাহ পরিকল্পনাটি খোলা হবে এবং এটি অনুসন্ধানের অপটিমাইজেশনের জন্য বিশ্লেষণ করা যেতে পারে।

ApexSQL পরিকল্পনা বাস্তব বাস্তবায়ন পরিকল্পনা দেখতে

একটি প্রশ্নের প্রকৃত বাস্তবায়ন পরিকল্পনা দেখতে, আগে উল্লেখ করা দ্বিতীয় পদক্ষেপ থেকে অবিরত, কিন্তু এখন, একবার অনুমান করা পরিকল্পনা একবার দেখানো হলে, ApexSQL প্ল্যানে প্রধান রিবন বার থেকে "প্রকৃত" বোতামটি ক্লিক করুন।

একবার "প্রকৃত" বোতামটি ক্লিক করার পরে, বাস্তব মৃত্যুদন্ড পরিকল্পনা অন্যান্য কার্যকর পরিকল্পনা ডেটা সহ খরচ পরামিতিগুলির বিস্তারিত পূর্বরূপ সহ দেখানো হবে।

মৃত্যুদণ্ড পরিকল্পনা দেখার বিষয়ে আরও তথ্য এই লিঙ্কটি অনুসরণ করে পাওয়া যেতে পারে।


ব্যাপক উত্তর ছাড়াও ইতিমধ্যেই পোস্ট করা হয়েছে কখনও কখনও এটি কার্যকর করার জন্য প্রোগ্রামটি কার্যকরভাবে কার্যকরকরণ অ্যাক্সেস অ্যাক্সেস করতে সক্ষম। এই জন্য উদাহরণ কোড নিচে।

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




sql-execution-plan