(এসও থেকে প্রশ্ন সরানো হয়েছে)
ক্লাস্টারড ইনডেক্স সহ আমার একটি টেবিল (ডামি ডেটা) রয়েছে 2 টি কলাম রয়েছে:
এখন আমি এই দুটি প্রশ্ন চালাচ্ছি:
declare
@productid int =1 ,
@priceid int = 1
SELECT productid,
t.priceID
FROM Transactions AS t
WHERE (productID = @productid OR @productid IS NULL)
AND (priceid = @priceid OR @priceid IS NULL)
SELECT productid,
t.priceID
FROM Transactions AS t
WHERE (productID = @productid)
AND (priceid = @priceid)
উভয় প্রশ্নের জন্য প্রকৃত বাস্তবায়ন পরিকল্পনাটি হ'ল:
আপনি দেখতে পাচ্ছেন, প্রথমটি স্ক্যান ব্যবহার করছে যখন দ্বিতীয়টি সেক ব্যবহার করছে।
যাইহোক - OPTION (RECOMPILE)
প্রথম ক্যোয়ারীতে যুক্ত করে এসইকে ব্যবহারের জন্য এক্সিকিউশন প্ল্যানও তৈরি করেছে:
ডিবিএ আড্ডায় বন্ধুরা আমাকে বলেছিল:
আপনার ক্যোয়ারিতে, @ producttid = 1, যার অর্থ (productID = @ productID বা @ productID NULL) (productID = @ productID) এ সরলীকৃত করা যেতে পারে। প্রাক্তনটির @ প্রোডাক্টআইডিএডের কোনও মান নিয়ে কাজ করার জন্য একটি স্ক্যান প্রয়োজন, পরে কোনও সন্ধান করতে পারে। সুতরাং, যখন আপনি RECOMPILE ব্যবহার করবেন, এসকিউএল সার্ভার আপনার কাছে @ প্রোডাক্টআইডিএডে আসলে কতটা মূল্য আছে তা দেখবে এবং এর জন্য সেরা পরিকল্পনা করবে। @ উত্পাদকআইডি-এ একটি নন-নাল মান সহ, একটি সন্ধানটি সেরা is যদি @ প্রোডাক্টআইডিটির মান অজানা থাকে তবে পরিকল্পনাকে @ প্রোডাক্টআইডিআইডি-তে কোনও সম্ভাব্য মানের সাথে মানিয়ে নিতে হবে, যার জন্য একটি স্ক্যান দরকার। সতর্কতা অবলম্বন করুন: অপশন (রিকম্পাইল) আপনি যখনই এটি চালাবেন ততবার পরিকল্পনার পুনরায় সংকলন করতে বাধ্য করবে, যা প্রতিটি সম্পাদনে কয়েক মিলিসেকেন্ড যুক্ত করবে। যদিও কোয়েরিটি খুব ঘন ঘন চলতে পারে তবে এটি কেবল একটি সমস্যা।
এছাড়াও:
@ প্রোডাক্টআইডিডিটি যদি নাল হয় তবে আপনি কোন মানটির সন্ধান করবেন? উত্তর: খোঁজ করার মতো কিছুই নেই। সমস্ত মান যোগ্যতা অর্জন করে।
আমি বুঝতে পারি যে OPTION (RECOMPILE)
এসকিউএল সার্ভারকে প্যারামিটারগুলির প্রকৃত মূল্যবোধগুলি দেখতে বাধ্য করে এবং এটি এটি অনুসন্ধান করতে পারে কিনা তা দেখুন।
তবে এখন আমি সামনের-সংকলনের সুবিধাটি হারাচ্ছি।
প্রশ্ন
আইএমএইচও - স্ক্যান কেবল তখনই ঘটে যখন কোনও প্যারাম শূন্য থাকে।
এটি ঠিক আছে - এসকিউএল সার্ভারকে স্ক্যানের জন্য একটি কার্যকরকরণ পরিকল্পনা তৈরি করতে দিন।
কিন্তু যদি এসকিউএল সার্ভার দেখতে পায় যে আমি এই কোয়েরিটি বহুবার মান সহ চালাচ্ছি: 1,1
তবে কেন এটি অন্য কোনও কার্যনির্বাহী পরিকল্পনা তৈরি করে এবং এর জন্য অনুসন্ধান ব্যবহার করে না?
আফাইক - এসকিউএল সর্বাধিক হিট প্রশ্নের জন্য কার্যকরকরণ পরিকল্পনা তৈরি করে ।
এসকিউএল সার্ভার কেন একটি সম্পাদন পরিকল্পনা সংরক্ষণ করে না:
@productid int =1 , @priceid int = 1
(আমি এই মানগুলি দিয়ে বহুবার চালাই)
- ভবিষ্যতের অনুরোধের জন্য - এসকিউএলকে সেই কার্যকরকরণ পরিকল্পনা (যা সেক ব্যবহার করে) রাখার জন্য বাধ্য করা সম্ভব?