আমার একটি টেবিলের উপর অবিরাম গণিত কলাম রয়েছে যা খালি খাঁটি কলামগুলি তৈরি করা হয়, যেমন
CREATE TABLE dbo.T
(
ID INT IDENTITY(1, 1) NOT NULL CONSTRAINT PK_T_ID PRIMARY KEY,
A VARCHAR(20) NOT NULL,
B VARCHAR(20) NOT NULL,
C VARCHAR(20) NOT NULL,
D DATE NULL,
E VARCHAR(20) NULL,
Comp AS A + '-' + B + '-' + C PERSISTED NOT NULL
);
এটিতে Comp
অনন্য নয়, এবং ডি এর প্রতিটি সংমিশ্রণের তারিখ থেকে বৈধ A, B, C
, সুতরাং আমি প্রত্যেকের শেষের তারিখ পেতে নিম্নলিখিত কোয়েরিটি ব্যবহার করি A, B, C
(মূলত কমপের একই মানের জন্য পরবর্তী সূচনা তারিখ):
SELECT t1.ID,
t1.Comp,
t1.D,
D2 = ( SELECT TOP 1 t2.D
FROM dbo.T t2
WHERE t2.Comp = t1.Comp
AND t2.D > t1.D
ORDER BY t2.D
)
FROM dbo.T t1
WHERE t1.D IS NOT NULL -- DON'T CARE ABOUT INACTIVE RECORDS
ORDER BY t1.Comp;
আমি তখন এই ক্যোয়ারীতে সহায়তা করার জন্য গণিত কলামে একটি সূচক যুক্ত করেছি (এবং অন্যরাও):
CREATE NONCLUSTERED INDEX IX_T_Comp_D ON dbo.T (Comp, D) WHERE D IS NOT NULL;
ক্যোয়ারী প্ল্যানটি তবে আমাকে অবাক করেছে। আমি ভেবেছি যেহেতু আমার কাছে এমন একটি ধারা রয়েছে যা উল্লেখ করে D IS NOT NULL
আমি বাছাই করছি Comp
, এবং সূচকের বাইরে কোনও কলামকে উল্লেখ করছি না যে গণনা করা কলামের সূচকটি টি 1 এবং টি 2 স্ক্যান করতে ব্যবহার করা যেতে পারে তবে আমি একটি ক্লাস্টার্ড সূচক দেখেছি স্ক্যান.
সুতরাং আমি এই সূচকটি ব্যবহার করতে আরও বাধ্য করলাম এটি আরও ভাল পরিকল্পনা এনেছে কিনা:
SELECT t1.ID,
t1.Comp,
t1.D,
D2 = ( SELECT TOP 1 t2.D
FROM dbo.T t2
WHERE t2.Comp = t1.Comp
AND t2.D > t1.D
ORDER BY t2.D
)
FROM dbo.T t1 WITH (INDEX (IX_T_Comp_D))
WHERE t1.D IS NOT NULL
ORDER BY t1.Comp;
যা এই পরিকল্পনা দিয়েছে
এটি দেখায় যে একটি কী লুকআপ ব্যবহৃত হচ্ছে, তার বিবরণগুলি:
এখন, এসকিউএল-সার্ভার ডকুমেন্টেশন অনুসারে:
আপনি একটি গণনাকারী কলামে একটি সূচক তৈরি করতে পারেন যা নির্ধারিত সংজ্ঞাযুক্ত, তবে অসম্পূর্ণ, অভিব্যক্তিটি তৈরি করা হয়েছে যদি কলামটি সারণী তৈরি বা টেবিল স্টেটমেন্ট বিবৃতিতে পার্স্টিস্ট চিহ্নিত করা থাকে। এর অর্থ হ'ল ডাটাবেস ইঞ্জিনটি সারণীতে গণিত মানগুলি সংরক্ষণ করে এবং যখন কোনও অন্যান্য কলাম যার উপর নির্ভর করে গণনা করা কলামটি আপডেট করা থাকে সেগুলি আপডেট করে। ডেটাবেস ইঞ্জিন কলামে একটি সূচক তৈরি করার সময়, এবং যখন সূচীটি কোনও প্রশ্নে রেফারেন্স করা হয় তখন এই স্থায়ী মানগুলি ব্যবহার করে। এই বিকল্পটি আপনাকে একটি গণিত কলামে একটি সূচক তৈরি করতে সক্ষম করে যখন ডাটাবেস ইঞ্জিন নির্ভুলতার সাথে প্রমাণ করতে পারে না যে কোনও ফাংশন যা গণিত কলামের এক্সপ্রেশনগুলি ফিরিয়ে দেয়, বিশেষত একটি সিএলআর ফাংশন যা .NET ফ্রেমওয়ার্কে তৈরি হয়, উভয়ই নির্বিচারক এবং নির্ভুল।
সুতরাং, যদি ডক্স হিসাবে "ডাটাবেস ইঞ্জিনটি সারণীতে গণিত মানগুলি সংরক্ষণ করে " বলে , এবং মানটি আমার সূচকগুলিতেও সঞ্চয় করা হয়, তখন কেন, এ, বি এবং সি প্রাপ্ত করার জন্য কী লুপআপের প্রয়োজন হয়? প্রশ্নটি আদৌ? আমি ধরে নিলাম সেগুলি কমপ গণনা করতে ব্যবহৃত হচ্ছে, তবে কেন? এছাড়াও, কেন কোয়েরি সূচকটি চালু রাখতে পারে t2
, তবে চালু হয় না t1
?
এসকিউএল ফিডেলে প্রশ্ন এবং ডিডিএল
এনবি আমি এসকিউএল সার্ভার ২০০৮-এ ট্যাগ করেছি কারণ এটিই হ'ল সংস্করণ যে আমার মূল সমস্যাটি রয়েছে তবে আমি ২০১২ সালেও একই আচরণ পেয়েছি।