এই কনস্ট্যান্ট স্ক্যান এবং বাম বহিরাগত যোগদান কোন্ কোয়ান্টাম সিলেক্ট কোয়েরি প্ল্যান থেকে আসে?


21

আমার এই টেবিলটি রয়েছে:

CREATE TABLE [dbo].[Accounts] (
    [AccountId] UNIQUEIDENTIFIER UNIQUE NOT NULL DEFAULT NEWID(),
    -- WHATEVER other columns
);
GO
CREATE UNIQUE CLUSTERED INDEX [AccountsIndex]
    ON [dbo].[Accounts]([AccountId] ASC);
GO

এই ক্যোয়ারী:

DECLARE @result UNIQUEIDENTIFIER
SELECT @result = AccountId FROM Accounts WHERE AccountId='guid-here'

একক সূচি সন্ধান নিয়ে গঠিত ক্যোয়ারী পরিকল্পনা সহ কার্যকর করে - প্রত্যাশা অনুযায়ী:

SELECT <---- Clustered Index Seek

এই ক্যোয়ারী একই কাজ করে:

DECLARE @result UNIQUEIDENTIFIER
SET @result = (SELECT AccountId FROM Accounts WHERE AccountId='guid-here')

তবে এটি এমন একটি পরিকল্পনার সাথে বাস্তবায়িত হয় যেখানে সূচিপত্র অনুসন্ধানের ফলাফল বাম আউটারের সাথে কিছু কনস্ট্যান্ট স্ক্যানের ফলাফলের সাথে যোগ হয় এবং তারপরে কম্পিউট স্ক্যালারে খাওয়ানো হয়:

SELECT <--- Compute Scalar <--- Left Outer Join <--- Constant Scan
                                      ^
                                      |------Clustered Index Seek

কি অতিরিক্ত ম্যাজিক? বাম আউটার যোগদানের পরে কনস্ট্যান্ট স্ক্যানটি কী করবে?

উত্তর:


29

দুটি বক্তব্যের শব্দার্থকতা পৃথক:

  • কোনও সারি পাওয়া না গেলে প্রথমটি ভেরিয়েবলের মান সেট করে না।
  • দ্বিতীয়টি সর্বদা চলক সেট করে, যদি কোনও সারি না পাওয়া যায় তবে নালও সহ।

কনস্ট্যান্ট স্ক্যানটি একটি খালি সারি তৈরি করে (কোনও কলাম ছাড়াই!) যার ফলে বেস টেবিলের সাথে কিছু না মিললে পরিবর্তনশীল আপডেট হবে updated বাম জয়েন্টটি নিশ্চিত করে যে খালি সারিটি জোড়ায় বেঁচে থাকবে। ভেরিয়েবল অ্যাসাইনমেন্টটি বাস্তবায়ন পরিকল্পনার মূল নোডে ঘটে যাওয়া হিসাবে ভাবা যেতে পারে।

ব্যবহার SELECT @result

-- Set initial value
DECLARE @result uniqueidentifier = {guid 'FE2CA909-1162-4C6C-A7AC-33B257E28539'};

-- @result does not change
SELECT @result = AccountId 
FROM Accounts 
WHERE AccountId={guid '7AD4D33C-1ED7-4183-B7F3-48C33D666525'};

SELECT @result;

ফলাফল 1

ব্যবহার SET @result

-- Set initial value
DECLARE @result uniqueidentifier = {guid 'FE2CA909-1162-4C6C-A7AC-33B257E28539'};

-- @result set to null
SET @result = 
(
    SELECT AccountId 
    FROM Accounts 
    WHERE AccountId={guid '7AD4D33C-1ED7-4183-B7F3-48C33D666525'}
);

SELECT @result;

ফলাফল 2

কার্যকর করার পরিকল্পনা রয়েছে

নির্বাচন করুনরুট নোডে কোনও সারি আসে না, সুতরাং কোনও অ্যাসাইনমেন্ট ঘটে না।

এসিট নিয়োগএকটি সারি সর্বদা রুট নোডে উপস্থিত হয়, সুতরাং পরিবর্তনশীল অ্যাসাইনমেন্ট ঘটে।


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

একটি ভেরিয়েবল অ্যাসাইনমেন্ট ঘটে তা নিশ্চিত করার জন্য সাবকিউরি থেকে একটি সারি তৈরি হয়েছে তা নিশ্চিত করার অন্যান্য উপায় রয়েছে। একটি হ'ল রিডানড্যান্ট স্কেলার অগ্রিগেট (ক্লজ অনুসারে কোনও গ্রুপ নয়):

-- Set initial value
DECLARE @result uniqueidentifier = {guid 'FE2CA909-1162-4C6C-A7AC-33B257E28539'};

-- @result set to null
SET @result = 
    (
        SELECT MAX(AccountId)
        FROM Accounts 
        WHERE AccountId={guid '7AD4D33C-1ED7-4183-B7F3-48C33D666525'} 
    );
SELECT @result;

ফলাফল 3

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

লক্ষ্য করুন যে স্কেলার সমষ্টিগুলি কোনও সারি ইনপুট না পেয়েও একটি সারি উত্পাদন করে।

ডকুমেন্টেশন:

যদি নির্বাচনের বিবৃতিটি কোনও সারি দেয় না, পরিবর্তনশীল তার বর্তমান মান ধরে রাখে। যদি অভিব্যক্তিটি কোনও স্কেলার সাবকোয়ারি হয় যা কোনও মান দেয় না, তবে ভেরিয়েবলটি NULL এ সেট করা হয়।

ভেরিয়েবলগুলি বরাদ্দের জন্য, আমরা আপনাকে প্রস্তাব দিচ্ছি যে আপনি SELECT @ লোকাল_ভরিয়েবলের পরিবর্তে SET @ লোকাল_ভরিভেবল ব্যবহার করুন।

আরও পড়া:

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