সিক প্রিডিকেট এবং প্রিডিকেট এর মধ্যে পার্থক্য


12

আমি এসকিউএল সার্ভার 2014 এন্টারপ্রাইজে থাকা একটি ক্যোয়ারীর সাথে টিউন করার চেষ্টা করছি।

আমি এসকিউএল সেন্ট্রি প্ল্যান এক্সপ্লোরার-এ প্রকৃত ক্যোয়ারী প্ল্যানটি খুলেছি এবং আমি একটি নোডে দেখতে পাচ্ছি যে এটির একটি প্রেডিকেট এবং একটি ভবিষ্যদ্বানীও রয়েছে

সিক প্রিডিকেট এবং প্রিডিকেট এর মধ্যে পার্থক্য কী ?

এখানে চিত্র বর্ণনা লিখুন

দ্রষ্টব্য: আমি দেখতে পাচ্ছি যে এই নোডের সাথে প্রচুর সমস্যা রয়েছে (উদাঃ আনুমানিক বনাম আসল সারি, অবশিষ্ট আইও), তবে প্রশ্নটি কোনওটির সাথেই সম্পর্কিত নয়।


3
অনুসন্ধানের পূর্বে সাঁইশাকটি যোগদানের জন্য সহায়তা করে, কেবলমাত্র অন্যান্য সারণীতে পাওয়া সারিগুলিতে ফিল্টার করে (যেটি আপনি পুনঃনির্দেশ করেছেন)। সম্পৃক্ত (ক অবশিষ্ট সম্পৃক্ত) তারপর নির্দিষ্ট 2. মর্যাদা দিয়ে সারি ঘটিয়েছে
হারুন বারট্রান্ড

5
রব ফারলে এখানে একটি মন্তব্যে নিম্নলিখিতটি বলেছেন :The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
অ্যারন বারট্রান্ড

উত্তর:


18

আসুন কয়েক কলাম সহ দশ মিলিয়ন সারি একটি টেম্প টেবিলের মধ্যে ফেলে দিন:

CREATE TABLE #174860 (
PK INT NOT NULL, 
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (PK)
);

INSERT INTO #174860 WITH (TABLOCK)
SELECT RN
, RN % 1000
, RN % 10000
FROM 
(
    SELECT TOP 1000000 ROW_NUMBER () OVER (ORDER BY (SELECT NULL)) RN
    FROM   master..spt_values v1,
           master..spt_values v2
) t;

CREATE INDEX IX_174860_IX ON #174860 (COL1) INCLUDE (COL2);

এখানে আমার PKকলামে একটি ক্লাস্টার ইনডেক্স আছে (ডিফল্টরূপে) । এটিতে COL1একটি মূল বিবিধ তালিকা COL1রয়েছে এবং এর অন্তর্ভুক্ত রয়েছে COL2

নিম্নলিখিত কোয়েরি বিবেচনা করুন:

SELECT *
FROM #174860
WHERE PK >= 15000 AND PK < 15005
AND COL2 = 5000;

এখানে আমি ব্যবহার করছি না BETWEENকারণ অ্যারন বারট্রান্ড এই প্রশ্নটি ঘিরে আছে।

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

এখানে চিত্র বর্ণনা লিখুন

এসকিউএল সার্ভারটি প্রিকিকেট ব্যবহার করে পাঁচটি সারি সন্ধান করে এবং আরও পাঁচটি সারিটি সাধারণ প্রিকেটের সাহায্যে এক সারিতে হ্রাস করে।

যদি আমি ক্লাস্টারড সূচকটি আলাদাভাবে সংজ্ঞায়িত করি:

CREATE TABLE #174860 (
PK INT NOT NULL, 
COL1 INT NOT NULL,
COL2 INT NOT NULL,
PRIMARY KEY (COL2, PK)
);

এবং একই ক্যোয়ারী চালান আমি বিভিন্ন ফলাফল পাই:

এখানে চিত্র বর্ণনা লিখুন

এই ক্ষেত্রে, এসকিউএল সার্ভার ধারাটিতে উভয় কলাম ব্যবহার করতে চাইতে পারে WHERE। কী কলামগুলি ব্যবহার করে টেবিল থেকে হুবহু এক সারি পাঠ করা হয়।

আরও একটি উদাহরণের জন্য এই প্রশ্নটি বিবেচনা করুন:

SELECT *
FROM #174860
WHERE COL1 = 500
AND COL2 = 3545;

IX_174860_IX সূচকটি একটি প্রচ্ছদ সূচক কারণ এটিতে ক্যোয়ারির জন্য প্রয়োজনীয় সমস্ত কলাম রয়েছে। তবে, শুধুমাত্র COL1একটি মূল কলাম। এসকিউএল সার্ভার সেই মানকটির সাথে 1000 টি সারি খুঁজে পেতে সেই কলামটির সাহায্য নিতে পারে COL1COL2চূড়ান্ত ফলাফলটি 0 টি সারিতে সেট করতে হ্রাস করতে এটি কলামের সেই সারিগুলিকে আরও ফিল্টার করতে পারে।

এখানে চিত্র বর্ণনা লিখুন

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