এসকিউএল সার্ভারটি একটি বহু-বিবৃতি টেবিল-মূল্যবান ফাংশনটির ফলাফলকে ক্যাশে করে?


22

একটি বহু-বিবৃতি টেবিল-মূল্যবান ফাংশন সারণীর ভেরিয়েবলের ফলাফল দেয়।

এই ফলাফলগুলি কি কখনও পুনরায় ব্যবহার করা হয়েছে, বা প্রতিবার যখন বলা হয় তখন ফাংশনটি কি সর্বদা সম্পূর্ণরূপে মূল্যায়ন করা হয়?

উত্তর:


23

মাল্টি-স্টেটমেন্ট টেবিল-মূল্যযুক্ত ফাংশনের (এমএসটিভিএফ) ফলাফলগুলি কখনই স্টেটমেন্ট (বা সংযোগ) জুড়ে ক্যাশে বা পুনরায় ব্যবহার করা হয় না , তবে এমএসটিভিএফ ফলাফল একই বিবৃতিতে পুনরায় ব্যবহার করা যেতে পারে এমন কয়েকটি উপায় রয়েছে । যে পরিমাণে, একটি এমএসটিভিএফ প্রত্যেকবার বলা হওয়ার সাথে সাথে পুনরায় পুনরায় সঞ্চিত করা হয় না।

উদাহরণ এমএসটিভিএফ

এটি (ইচ্ছাকৃতভাবে অদক্ষ) এমএসটিভিএফ প্রতিটি সারিটিতে টাইমস্ট্যাম্প সহ একটি নির্দিষ্ট পরিসংখ্যার পূর্ণসংখ্যা দেয়:

IF OBJECT_ID(N'dbo.IntegerRange', 'TF') IS NOT NULL
    DROP FUNCTION dbo.IntegerRange;
GO
CREATE FUNCTION dbo.IntegerRange (@From integer, @To integer)
RETURNS @T table 
(
    n integer PRIMARY KEY, 
    ts datetime DEFAULT CURRENT_TIMESTAMP
)
WITH SCHEMABINDING
AS
BEGIN
    WHILE @From <= @To
    BEGIN
        INSERT @T (n)
        VALUES (@From);

        SET @From = @From + 1;
    END;
    RETURN;
END;

স্ট্যাটিক টেবিল পরিবর্তনশীল

ফাংশন কলের সমস্ত পরামিতি যদি ধ্রুবক (বা রানটাইম ধ্রুবক) হয় তবে এক্সিকিউশন প্ল্যানটি একবার টেবিলের পরিবর্তনশীল ফলাফলকে জনপ্রিয় করবে। পরিকল্পনার অবশিষ্টাংশগুলি টেবিলের পরিবর্তনশীলটি বহুবার অ্যাক্সেস করতে পারে। টেবিল ভেরিয়েবলের স্থির প্রকৃতিটি কার্যকরকরণ পরিকল্পনা থেকে স্বীকৃত হতে পারে। উদাহরণ স্বরূপ:

SELECT
    IR.n,
    IR.ts 
FROM dbo.IntegerRange(1, 5) AS IR
ORDER BY
    IR.n;

এর মতো একটি ফলাফল প্রদান করে:

সহজ ফলাফল

কার্যকর করার পরিকল্পনাটি হ'ল:

সাধারণ সম্পাদনের পরিকল্পনা

সিকোয়েন্স অপারেটর প্রথমে টেবিলের মূল্যবান ফাংশন অপারেটরকে কল করে, যা টেবিলের পরিবর্তনশীলকে জনপ্রিয় করে তোলে (নোট করুন এই অপারেটরটি কোনও সারি দেয় না)। এরপরে, সিকোয়েন্সটি তার দ্বিতীয় ইনপুটটি কল করে, যা সারণী ভেরিয়েবলের বিষয়বস্তু ফেরত দেয় (এক্ষেত্রে ক্লাস্টারড ইনডেক্স স্ক্যান ব্যবহার করে)।

পরিকল্পনাটি 'স্ট্যাটিক' টেবিলের পরিবর্তনশীল ফলাফলটি ব্যবহার করছে তা হ'ল একটি সিকোয়েন্সের নীচে সারণি মূল্যবান ফাংশন অপারেটর - পরিকল্পনার অবশিষ্টাংশটি এগিয়ে যাওয়ার আগে টেবিলের পরিবর্তনশীলটি পুরোপুরি পপুলেটেড হওয়া দরকার।

একাধিক প্রবেশাধিকার

টেবিলের পরিবর্তনশীল ফলাফলটি একাধিকবার অ্যাক্সেস করা হয়েছে তা দেখাতে, আমরা 1 থেকে 5 পর্যন্ত সারি সারি সহ একটি দ্বিতীয় টেবিল ব্যবহার করব:

IF OBJECT_ID(N'dbo.T', 'U') IS NOT NULL
    DROP TABLE dbo.T;

CREATE TABLE dbo.T (i integer NOT NULL);

INSERT dbo.T (i) 
VALUES (1), (2), (3), (4), (5);

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

SELECT T.i,
       IR.n,
       IR.ts
FROM dbo.T AS T
JOIN dbo.IntegerRange(1, 5) AS IR
    ON IR.n = T.i;

ফলাফল হলো:

ফলাফল যোগদান

কার্যকর করার পরিকল্পনা:

পরিকল্পনা যোগ দিন

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

মূল কথাটি হ'ল যখন এমএসটিভিএফ-এর পরামিতিগুলি স্থির (যখন ভেরিয়েবল এবং পরামিতি সহ) হয় বা এক্সিকিউশন ইঞ্জিন দ্বারা স্টেটমেন্টের জন্য রানটাইম কনস্ট্যান্ট হিসাবে বিবেচিত হয়, তখন পরিকল্পনায় এমএসটিভিএফ টেবিলের পরিবর্তনশীল ফলাফলের জন্য দুটি পৃথক অপারেটর উপস্থিত করা হবে: একজনকে পপুলেট করার জন্য টেবিল; ফলগুলি অ্যাক্সেস করার জন্য আরেকটি, সম্ভবত একাধিকবার টেবিলটি অ্যাক্সেস করা এবং সম্ভবত ফাংশন সংজ্ঞাতে ঘোষিত সূচকের ব্যবহার করা।

সম্পর্কযুক্ত পরামিতি এবং অ-ধ্রুবক পরামিতি

পারস্পরিক সম্পর্কযুক্ত প্যারামিটারগুলি (বাহ্যিক রেফারেন্স) বা অ-ধ্রুবক ফাংশন প্যারামিটারগুলি ব্যবহার করার সময় পার্থক্যগুলি হাইলাইট করার জন্য, আমরা টেবিলের বিষয়বস্তুগুলি পরিবর্তন করব Tযাতে ফাংশনে আরও অনেক বেশি কাজ করতে হয়:

TRUNCATE TABLE dbo.T;

INSERT dbo.T (i) 
VALUES (50001), (50002), (50003), (50004), (50005);

নিম্নলিখিত পরিবর্তিত ক্যোয়ারী এখন Tফাংশন প্যারামিটারগুলির মধ্যে একটিতে টেবিলের জন্য বাহ্যিক রেফারেন্স ব্যবহার করে :

SELECT T.i,
       IR.n,
       IR.ts
FROM dbo.T AS T
CROSS APPLY dbo.IntegerRange(1, T.i) AS IR
WHERE IR.n = T.i;

এই কোয়েরিতে ফলাফলগুলি ফিরে আসতে প্রায় 8 সেকেন্ড সময় লাগে :

সম্পর্কযুক্ত ফলাফল

কলামে সারিগুলির মধ্যে সময়ের পার্থক্য লক্ষ্য করুন tsWHEREদফা একটি বুদ্ধিমানের আকারের আউটপুট চূড়ান্ত ফলাফল সীমিত করে কিন্তু অদক্ষ ফাংশন এখনও 50,000-বিজোড় সারি (এর সম্পর্কিত মান উপর নির্ভর করে টেবিল পরিবর্তনশীল পূরণ করতে একটি সময় লাগে iটেবিল থেকে T)।

কার্যকর করার পরিকল্পনাটি হ'ল:

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

সিকোয়েন্স অপারেটরের অভাব লক্ষ্য করুন। এখন, একটি একক টেবিলের মূল্যবান ফাংশন অপারেটর রয়েছে যা টেবিলের ভেরিয়েবলকে জনপ্রিয় করে তোলে এবং নীড়যুক্ত লুপগুলিতে যোগদানের প্রতিটি পুনরাবৃত্তিতে এর সারিগুলি প্রদান করে।

পরিষ্কার হতে: টেবিল টিতে মাত্র 5 টি সারি দিয়ে সারণী মূল্যবান ফাংশন অপারেটরটি 5 বার চালায়। এটি প্রথম পুনরাবৃত্তিতে 50,001 সারি তৈরি করে, দ্বিতীয়টিতে 50,002 ... এবং আরও কিছু করে। সারণী ভেরিয়েবলটি পুনরাবৃত্তির মধ্যে 'ফেলে দেওয়া' (ছিন্ন) করা হয়, সুতরাং পাঁচটি কলের প্রতিটি একটি সম্পূর্ণ জনসংখ্যা। এ কারণেই এটি এত ধীরে ধীরে এবং প্রতিটি সারিতে ফলাফলটিতে প্রদর্শিত হতে প্রায় একই সময় নেয়।

পার্শ্ব নোট:

স্বাভাবিকভাবেই, এমএসটিভিএফ যখন প্রতিটি পুনরাবৃত্তির উপর অনেকগুলি সারি পপুলেট করে তখন উপরের পরিস্থিতিটি ইচ্ছাকৃতভাবে বোঝানো যায় যে কতটা দুর্বল পারফরম্যান্স হতে পারে।

একটি যুক্তিসম্মত উপরের কোড বাস্তবায়নের সেট হবে উভয় থেকে msTVF পরামিতি i, এবং অপ্রয়োজনীয় অপসারণ WHEREদফা। সারণী ভেরিয়েবলটি প্রতিটি পুনরাবৃত্তিতে এখনও ছাঁটা এবং পুনরায় উত্পাদিত হবে তবে প্রতিবার কেবল একটি সারি দিয়ে।

আমরা পূর্বের পদক্ষেপে ন্যূনতম এবং সর্বাধিক iমানগুলি Tএগুলি ভেরিয়েবল থেকে সংগ্রহ করতে এবং সংরক্ষণ করতে পারি। পারস্পরিক সম্পর্কযুক্ত প্যারামিটারগুলির পরিবর্তে ভেরিয়েবলের সাথে ফাংশনটি কল করার ফলে 'স্থিতিশীল' টেবিলের পরিবর্তনশীল প্যাটার্নটি আগে উল্লিখিত হিসাবে ব্যবহার করা যাবে।

অপরিবর্তিত সম্পর্কযুক্ত পরামিতিগুলির জন্য ক্যাচিং

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

এটি প্রদর্শনের জন্য, আমরা Tপাঁচটি অভিন্ন i মানের সাথে বিষয়বস্তুগুলি প্রতিস্থাপন করব :

TRUNCATE TABLE dbo.T;

INSERT dbo.T (i) 
VALUES (50005), (50005), (50005), (50005), (50005);

পুনঃসংশ্লিষ্ট প্যারামিটার সহ ক্যোয়ারী:

SELECT T.i,
       IR.n,
       IR.ts
FROM dbo.T AS T
CROSS APPLY dbo.IntegerRange(1, T.i) AS IR
WHERE IR.n = T.i;

এবার প্রায় 1.5 সেকেন্ডের মধ্যে ফলাফলগুলি প্রদর্শিত হবে :

মূল সারি ফলাফল

প্রতিটি সারিতে অভিন্ন টাইমস্ট্যাম্পগুলি নোট করুন। সারণী ভেরিয়েবলের ক্যাশেড ফলাফলটি পরবর্তী পুনরাবৃত্তির জন্য পুনরায় ব্যবহার করা হয় যেখানে সম্পর্কিত মানটি iঅপরিবর্তিত থাকে। ফলাফলটি পুনঃব্যবহার করা প্রতিটি সময় 50,005 টি সারি thanোকানোর চেয়ে অনেক দ্রুত is

এক্সিকিউশন প্ল্যানটি আগের মতো দেখতে অনেকটা অনুরূপ:

অভিন্ন সারি জন্য পরিকল্পনা

মূল পার্থক্যটি হ'ল সারণী মূল্যবান ফাংশন অপারেটরের প্রকৃত রিবাইন্ডস এবং প্রকৃত রিওয়াইন্ড বৈশিষ্ট্যগুলিতে:

অপারেটর বৈশিষ্ট্য

যখন সম্পর্কযুক্ত প্যারামিটারগুলি পরিবর্তন হয় না, এসকিউএল সার্ভার সারণী ভেরিয়েবলের বর্তমান ফলাফলগুলি পুনরায় খেলতে (রিওয়াইন্ড) করতে পারে। যখন পারস্পরিক সম্পর্ক পরিবর্তিত হয়, এসকিউএল সার্ভারকে অবশ্যই টেবিলের ভেরিয়েবল (পুনঃত্যাগ) কেটে ফেলা এবং পুনরায় তৈরি করতে হবে। প্রথম পুনরাবৃত্তির মধ্যে একটি পুনঃতফসিল ঘটে; পরবর্তী চারটি পুনরাবৃত্তির মানগুলি T.iঅপরিবর্তিত হওয়ার কারণে সমস্তগুলি রিওয়াইন্ড হয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.