আমাদের এখানে সবচেয়ে বড় সমস্যাগুলি হ'ল:
- @ জেএনকে যেমন বলেছে, এসকিউএল সার্ভার একটি ইউডিএফ ব্যবহার বন্ধ করে দেয় এবং যে কোনওভাবে তাদের সাথে ভয়ঙ্কর কাজ করে (যেমন সর্বদা এক সারি অনুমান করে)। আপনি যখন এসএসএমএসে একটি আসল পরিকল্পনা তৈরি করেন, আপনি এর ব্যবহারটি একেবারেই দেখতে পাবেন না। প্ল্যান এক্সপ্লোরার একই সীমাবদ্ধতার সাপেক্ষে কারণ এটি কেবলমাত্র এসকিউএল সার্ভার সরবরাহ করে এমন একটি পরিকল্পনা সম্পর্কিত তথ্য সরবরাহ করতে পারে।
- কোডটি আসল পরিকল্পনা তৈরি করার সময় রানটাইম মেট্রিকগুলির জন্য বিভিন্ন উত্সের উপর নির্ভর করে। দুর্ভাগ্যক্রমে পরিকল্পনার এক্সএমএলটিতে ফাংশন কলগুলি অন্তর্ভুক্ত নয় এবং এসকিউএল সার্ভার দুটি ব্যবহার করার সময়
SET STATISTICS IO ON;
কোনও ফাংশন দ্বারা ব্যয় করা I / O প্রকাশ করে না (এইভাবে Table I/O
ট্যাবটি জনপ্রিয় হয়)।
অ্যাডভেঞ্চার ওয়ার্কস ২০১২ এর বিপরীতে নিম্নলিখিত মতামতটি বিবেচনা করুন এবং কার্য করুন। শিরোনামের টেবিল থেকে একটি এলোমেলো সারি দেওয়া বিশদ টেবিল থেকে একটি এলোমেলো সারি ফিরিয়ে আনার এটি একটি নিরীহ প্রয়াস - বেশিরভাগ সময় আমরা যতটা সম্ভব I / O জেনারেট করি তা নিশ্চিত করার জন্য every
CREATE VIEW dbo.myview
WITH SCHEMABINDING
AS
SELECT TOP (100000) rowguid, SalesOrderID, n = NEWID()
FROM Sales.SalesOrderDetail ORDER BY NEWID();
GO
CREATE FUNCTION dbo.whatever(@SalesOrderID INT)
RETURNS UNIQUEIDENTIFIER
WITH SCHEMABINDING
AS
BEGIN
RETURN
(
SELECT TOP (1) rowguid FROM dbo.myview
WHERE SalesOrderID = @SalesOrderID ORDER BY n
);
END
GO
ম্যানেজমেন্ট স্টুডিও আপনাকে কী বলে (এবং না)
এসএসএমএসে নিম্নলিখিত প্রশ্নটি নিন:
SET STATISTICS IO ON;
SELECT TOP (5) SalesOrderID, dbo.whatever(SalesOrderID)
FROM Sales.SalesOrderHeader ORDER BY NEWID();
SET STATISTICS IO OFF;
আপনি যখন কোনও পরিকল্পনা অনুমান করেন, আপনি ক্যোয়ারির জন্য একটি পরিকল্পনা এবং ফাংশনের জন্য একটি একক পরিকল্পনা পাবেন (5 নয়, যেমনটি আপনি আশা করতে পারেন):
আপনি কোথাও কোনও আই / ও ডেটা পাবেন না, স্পষ্টতই, যেহেতু কোয়েরিটি আসলে কার্যকর করা হয়নি। এখন, একটি বাস্তব পরিকল্পনা তৈরি করুন। আপনি ফলাফল গ্রিডে প্রত্যাশিত 5 টি সারি পাবেন, নিম্নলিখিত পরিকল্পনাটি (যা ইউডিএফ সম্পর্কে একেবারে দৃশ্যমান উল্লেখ করে না, এক্সএমএল ব্যতীত আপনি এটি কোয়েরি পাঠ্যের অংশ হিসাবে এবং স্কেলার অপারেটরের অংশ হিসাবে সন্ধান করতে পারেন):
এবং নিম্নলিখিত STATISTICS IO
আউটপুট (যার একেবারে কোনো উল্লেখ করে তোলে Sales.SalesOrderDetail
, যদিও আমরা এটা জানি ছিল যে টেবিল থেকে পড়তে):
সারণি 'বিক্রয়অর্ডারহাইডার'। স্ক্যান কাউন্ট 1, লজিকাল রিড 57, ফিজিকাল রিড 0, রিড-ফরোডড রিড 0, লব লজিকাল রিড 0, লব ফিজিকাল 0, লব রিড-ফরোয়ার্ড 0
প্ল্যান এক্সপ্লোরার আপনাকে কী বলে
পিই যখন একই ক্যোয়ারির জন্য একটি আনুমানিক পরিকল্পনা তৈরি করে, তখন এটি এসএসএমএস হিসাবে একই জিনিস সম্পর্কে জানে। তবে এটি জিনিসগুলিকে কিছুটা স্বজ্ঞাত উপায়ে দেখায়। উদাহরণস্বরূপ, বাহ্যিক ক্যোয়ারির জন্য আনুমানিক পরিকল্পনাটি দেখায় যে কীভাবে ফাংশনটির আউটপুট ক্যোয়ারীর আউটপুটের সাথে একত্রিত হয় এবং এটি তাত্ক্ষণিকভাবে স্পষ্ট হয় - একক পরিকল্পনার ডায়াগ্রামের মধ্যে - উভয় টেবিল থেকে আই / ও রয়েছে :
এটি নিজে থেকে ফাংশনটির পরিকল্পনাও দেখায় যা আমি কেবল সম্পূর্ণতার জন্যই অন্তর্ভুক্ত করছি:
এখন আসুন একটি আসল পরিকল্পনাটি দেখুন, যা কয়েক হাজার গুণ বেশি কার্যকর। এখানে নেতিবাচক দিকটি আবার, এটিতে কেবলমাত্র এসকিউএল সার্ভারটি প্রদর্শন করার সিদ্ধান্ত নেয় এমন তথ্য রয়েছে, সুতরাং এটি এসকিউএল সার্ভারের দেওয়া গ্রাফিকাল প্ল্যান ডায়াগ্রামটি কেবল প্রকাশ করতে পারে। এটি এমন পরিস্থিতি নয় যেখানে কেউ আপনাকে কোনও কার্যকর কিছু না দেখানোর সিদ্ধান্ত নিয়েছে; এটি সরবরাহ করা XML প্ল্যানের ভিত্তিতে এটি সম্পর্কে কিছুই জানে না। এক্ষেত্রে এটি এসএসএমএসের মতোই, আপনি কেবলমাত্র বাহ্যিক ক্যোয়ারির পরিকল্পনাটি দেখতে পাচ্ছেন এবং এটি ফাংশনটি একেবারেই বলা হচ্ছে না বলে মনে হচ্ছে :
সারণি I / O ট্যাবটি এখনও আউটপুট উপর নির্ভর করেSTATISTICS IO
, যা ফাংশন কলটিতে সঞ্চালিত কোনও কার্যকলাপকেও উপেক্ষা করে:
তবে, পিই আপনার জন্য পুরো কল স্ট্যাক পেয়েছে। আমি মাঝে মধ্যে লোকেরা জিজ্ঞাসা করতে শুনেছি, "পিএফফ্ট, কখন কখন আমার কল স্ট্যাকের প্রয়োজন হবে?" হ্যাঁ, আপনি আসলে করতে সময় অতিবাহিত, CPU- র ব্যবহার ভেঙ্গে, এবং সংখ্যা লেখা আছে (এবং, TVFs জন্য, উত্পাদিত সারির সংখ্যা) জন্য প্রতি একক ফাংশন কল :
দুর্ভাগ্যক্রমে, আপনি যে টেবিল (গুলি) থেকে আই / ওটি আসছেন সেটির সাথে আবার সম্পর্ক স্থাপন করার ক্ষমতা আপনার নেই (আবার, কারণ এসকিউএল সার্ভার সেই তথ্য সরবরাহ করে না), এবং এটি ইউডিএফ নামের সাথে লেবেলযুক্ত নয় (কারণ এটি অ্যাডহক স্টেটমেন্ট হিসাবে ধরা পড়েছে, ফাংশনটি কল হিসাবে নয়)। তবে এটি আপনাকে যা দেখতে দেয়, ম্যানেজমেন্ট স্টুডিওটি তা করে না, এটিই আপনার ইউডিএফ একটি কুকুর। আপনাকে এখনও কিছু বিন্দুতে যোগ দিতে হবে, তবে এখানে বিন্দু কম রয়েছে এবং সেগুলি আরও কাছাকাছি রয়েছে।
প্রোফাইলার সম্পর্কে
অবশেষে, আমি দৃr়ভাবে প্রোফাইলার থেকে দূরে থাকার পরামর্শ দেব, যদি না আপনি কোনও স্ক্রিপ্টে যাচ্ছেন এমন কোনও সার্ভার-সাইড ট্রেস সেটআপ না করা এবং তারপরে কোনও ইউআই সরঞ্জামের ক্ষেত্রের বাইরে চলে না যাওয়া। কোনও প্রোডাকশন সিস্টেমের বিরুদ্ধে প্রোফাইলার ব্যবহার করা প্রায়শই এর সমাধান হওয়ার চেয়ে আরও বেশি সমস্যা তৈরি করতে চলেছে । আপনি যদি এই তথ্য পেতে চান তবে দয়া করে একটি সার্ভার-সাইড ট্রেস বা বর্ধিত ইভেন্টগুলি ব্যবহার করুন এবং খুব বিজ্ঞতার সাথে ফিল্টার করতে ভুলবেন না। এমনকি প্রোফাইলার ছাড়াও কোনও ট্রেস আপনার সার্ভারকে প্রভাবিত করতে পারে এবং প্রসারিত ইভেন্টগুলির মাধ্যমে শোপ্ল্যানগুলি পুনরুদ্ধার করা পৃথিবীর সবচেয়ে কার্যকর জিনিসও নয় ।