ফাংশন কলগুলির সাথে আনুমানিক বনাম প্রকৃত ক্যোয়ারী পরিকল্পনা


11

এসকিউএল সার্ভারে আমার এই ক্যোয়ারী রয়েছে, একটি মার্জ প্রতিরূপ কোয়েরি:

SELECT DISTINCT
    b.tablenick,
    b.rowguid,
    c.generation,
    sys.fn_MSgeneration_downloadonly
    (
        c.generation,
        c.tablenick
    )
FROM #belong b
LEFT OUTER JOIN dbo.MSmerge_contents c ON 
    c.tablenick = b.tablenick
    AND c.rowguid = b.rowguid;

আনুমানিক ক্যোয়ারী পরিকল্পনায় 3 টি প্রশ্নের সম্পর্কে তথ্য অন্তর্ভুক্ত রয়েছে:

  1. উপরের ক্যোয়ারী
  2. Fn_MSgeneration_downloadonly এ ফাংশন কল
  3. Fn_MSAttric_as_downloadonly_property এ ফাংশন কল

প্রকৃত ক্যোয়ারী পরিকল্পনায় কেবল এই তথ্য রয়েছে:

  1. উপরের ক্যোয়ারী

ফাংশন সম্পর্কে কিছুই। আসল পরিকল্পনায় ফাংশন সম্পর্কিত তথ্য কেন অনুপস্থিত?

আমি এই বিকল্পগুলি চেষ্টা করেছিলাম:

SET STATISTICS PROFILE ON
SET STATISTICS XML ON

যা একটি আসল পরিকল্পনা তৈরি করেছে, তবে আমি ম্যানেজমেন্ট স্টুডিওতে প্রকৃত ক্যোয়ারী প্ল্যান বিকল্পটি ব্যবহার করার সময় এটি 2 এবং 3 এর মতো অনুপস্থিত ছিল।

উদাহরণস্বরূপ যদি আমি ফাংশনটি সম্পর্কে তথ্য ক্যাপচারের জন্য প্রোফাইলার ব্যবহার করি তবে আমি কোন ইভেন্টগুলি নির্বাচন করব?


বিশেষভাবে ক্যোয়ারী পরিকল্পনাগুলির সাথে সম্পর্কিত কোনও উত্তর খুঁজে পাওয়া যায় নি, তবে আমি এসপি: স্টেম্টস্টার্টিং এবং এসপি: স্টেমটকম্পটেডকে প্রোফাইল করেছি এবং এটি ফাংশন কলগুলি দেখিয়েছে।

উত্তর:


17

এবং ফাংশন সম্পর্কে কিছুই। আসল পরিকল্পনায় ফাংশন সম্পর্কিত তথ্য কেন অনুপস্থিত?

এটি কার্য সম্পাদনের কারণে ডিজাইনের মাধ্যমে।

কার্যাবলী যেগুলিতে BEGINএবং ENDসংজ্ঞা প্রতিটি ইনপুট সারি জন্য একটি নতুন টি-এসকিউএল স্ট্যাক ফ্রেম তৈরি করুন। অন্যভাবে রাখুন, প্রতিটি ইনপুট সারির জন্য ফাংশন বডিটি পৃথকভাবে কার্যকর করা হয় । এই একক সত্যটি টি-এসকিউএল স্কেলার এবং মাল্টি-স্টেটমেন্ট ফাংশনগুলির সাথে সম্পর্কিত বেশিরভাগ কার্যকারিতা সমস্যাগুলি ব্যাখ্যা করে (নোট করুন যে ইন-লাইন টেবিলের মূল্যবান ফাংশনগুলি BEGIN...ENDসিনট্যাক্স ব্যবহার করে না )।

আপনার প্রশ্নের প্রসঙ্গে, এর ফলে SHOWPLANপ্রতিটি সারির পূর্ণ ফলাফল হয়। এক্সএমএল পরিকল্পনার আউটপুট উত্পাদন করা বেশ ভার্জোজ এবং ব্যয়বহুল, সুতরাং প্রতিটি সারির জন্য সম্পূর্ণ আউটপুট উত্পাদন করা সাধারণ দিক থেকে একটি খারাপ ধারণা হবে।

উদাহরণ

অ্যাডভেঞ্চার ওয়ার্কস নমুনা ডাটাবেসে তৈরি নীচের টি-এসকিউএল স্কেলার ফাংশনটি বিবেচনা করুন , যা কোনও আইডি প্রদত্ত কোনও পণ্যের নাম ফিরিয়ে দেয়:

CREATE FUNCTION dbo.DumbNameLookup
(
    @ProductID integer
)
RETURNS dbo.Name
AS
BEGIN
    RETURN
    (
        SELECT
            p.Name
        FROM Production.Product AS p
        WHERE
            p.ProductID = @ProductID
    );
END;

প্রাক-বাস্তবায়ন পরিকল্পনা

একটি প্রাক-বাস্তবায়ন পরিকল্পনা (এসএসএমএসে আনুমানিক পরিকল্পনা) পিতামাতার বিবৃতি এবং নেস্টেড ফাংশন কলের জন্য পরিকল্পনার তথ্য দেখায়:

-- Pre-execution plan shows main query and nested function call
SET SHOWPLAN_XML ON;
GO
SELECT dbo.DumbNameLookup(1);
GO
SET SHOWPLAN_XML OFF;

এসএসএমএস আউটপুট:

এসএসএমএসের প্রাক-বাস্তবায়ন পরিকল্পনা

এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরারে দেখা একই এক্সএমএল কলগুলির নেস্টেড প্রকৃতিটি আরও স্পষ্টভাবে দেখায়:

পিই প্রাক বাস্তবায়ন পরিকল্পনা

মৃত্যুদন্ড কার্যকর করার পরে আউটপুট

এসএসএমএস কেবল কার্যকর জিজ্ঞাসার জন্য বিশদটি দেখায় যখন কার্যকর-পরবর্তী পরিকল্পনা পরিকল্পনার জন্য অনুরোধ করা হয়:

-- Post-execution plan shows main query only
SET STATISTICS XML ON;
SELECT dbo.DumbNameLookup(1);
SET STATISTICS XML OFF;

এসএসএমএস-কার্য-সম্পাদন

অন্যথায় করার পারফরম্যান্স প্রভাবটি এসকিউএল সার্ভার প্রোফাইলারে শোপ্লান এক্সএমএল পরিসংখ্যান প্রোফাইল ইভেন্ট ক্লাস ব্যবহার করে দেখানো যেতে পারে যা এমন একটি ক্যোয়ারী যা ফাংশনটিকে একাধিকবার কল করে (প্রতি ইনপুট সারিতে একবার):

SELECT TOP (5)
    p.ProductID,
    dbo.DumbNameLookup(p.ProductID)
FROM Production.Product AS p;

প্রোফাইলার আউটপুট:

আউটপুট ট্রেস করুন

ফাংশন মৃত্যুদন্ড কার্যকর করার জন্য পাঁচটি পৃথক-কার্যকর করার পরিকল্পনা রয়েছে এবং প্যারেন্ট ক্যোয়ারির জন্য একটি রয়েছে। পাঁচটি ফাংশন পরিকল্পনার প্রোফাইলার নীচে অংশে এটির মতো দেখাচ্ছে:

ফাংশন পরিকল্পনা

প্যারেন্ট ক্যোয়ারী পরিকল্পনাটি হ'ল:

মূল পরিকল্পনা

ক্লজটি ছাড়াই ক্যোয়ারি কার্যকর করা TOP (5)ফলাফল সারণীতে 504 টি সারিগুলির প্রত্যেকটির জন্য একটি সম্পূর্ণ সম্পাদন পরিকল্পনার ফলাফল দেয়। আপনি সম্ভবত দেখতে পাচ্ছেন যে এটি কীভাবে বড় টেবিলগুলির সাহায্যে হাতছাড়া হয়ে যায়।

ট্রিগারগুলির পরিস্থিতি বিপরীত। এগুলি প্রাক-সম্পাদন পরিকল্পনার কোনও তথ্য দেখায় না, তবে মৃত্যুদণ্ড কার্যকর করার পরে একটি পরিকল্পনা অন্তর্ভুক্ত করে। এটি ট্রিগারগুলির সেট-ভিত্তিক প্রকৃতি প্রতিফলিত করে; প্রত্যেকে একবারে প্রতি সারির পরিবর্তে ক্ষতিগ্রস্ত সমস্ত সারিগুলির জন্য একবার নিক্ষেপ করা হয়।


@ পালউইহাইটের এমন কোনও যুক্তিসঙ্গত কারণ রয়েছে যে আনুমানিক বাস্তবায়ন পরিকল্পনার জন্য অনুরোধ করার সময় ট্রিগার পরিকল্পনাগুলি প্রদর্শিত হয় না? এটি একটি দরকারী অনুপস্থিত বৈশিষ্ট্য মত মনে হচ্ছে। আমি এটির জন্য একটি সংযোগ আইটেম তৈরি করতে পারি।
usr

@ আরআর - সম্ভবত নির্বাচিত প্রকৃত ক্যাশেড পরিকল্পনাটি এখানে বর্ণিত সারিগুলির প্রকৃত সংখ্যার উপর নির্ভর করে পরিবর্তিত হতে পারে? টেকনেট.মাইক্রোসফট.ইন- ইউএস
মার্টিন স্মিথ

@ মার্টিনস্মিত এটি একটি কারণ হতে পারে। সম্প্রতি চেক এবং এফ কে সীমাবদ্ধতার বাস্তবায়নের পরিকল্পনার জন্য একটি সংযুক্ত আইটেমটি সম্পূর্ণ হিসাবে চিহ্নিত হয়েছে তাই আমি আশাবাদী যে তারা ট্রিগারগুলির সাথে একই কাজ করবে।
usr ডিরেক্টরির

@ আরআর - এই এখানে ? 3 মাস? নতুন বৈশিষ্ট্যের অনুরোধের জন্য অবশ্যই এটি রেকর্ড হতে হবে!
মার্টিন স্মিথ

@ মার্টিনস্মিথ হ্যাঁ, এটি। এটি 1-2 দিন আগে "স্থির" হয়েছিল। আমি সত্যিই আমার জিজ্ঞাসা স্টোর জিজ্ঞাসা করতে হবে না আশা করি। আমি এসএসএমএসের একটি বোতামে ক্লিক করার আশা করেছিলাম। প্রকৃতপক্ষে, আমি ইঞ্জিনের এমন কোনও অংশে কোনও পরিবর্তন দেখে অবাক হয়ে গিয়েছিলাম যা বছরের পর বছর স্পর্শ করা হয়নি। কিন্তু সম্ভবত সেখানে কিছুই ছিল না।
usr ডিরেক্টরির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.