আমার একটি এসকিউএল ক্যোয়ারী রয়েছে যা আমি অনুকূলিত করার চেষ্টা করছি:
DECLARE @Id UNIQUEIDENTIFIER = 'cec094e5-b312-4b13-997a-c91a8c662962'
SELECT
Id,
MIN(SomeTimestamp),
MAX(SomeInt)
FROM dbo.MyTable
WHERE Id = @Id
AND SomeBit = 1
GROUP BY Id
MyTable
দুটি সূচক রয়েছে:
CREATE NONCLUSTERED INDEX IX_MyTable_SomeTimestamp_Includes
ON dbo.MyTable (SomeTimestamp ASC)
INCLUDE(Id, SomeInt)
CREATE NONCLUSTERED INDEX IX_MyTable_Id_SomeBit_Includes
ON dbo.MyTable (Id, SomeBit)
INCLUDE (TotallyUnrelatedTimestamp)
আমি যখন উপরের লিখিতভাবে ঠিক মতো কোয়েরিটি সম্পাদন করি তখন এসকিউএল সার্ভার প্রথম সূচকটি স্ক্যান করে, ফলস্বরূপ 189,703 লজিকাল রিড এবং একটি 2-3 দ্বিতীয় সময়কাল হয়।
আমি যখন @Id
ভেরিয়েবলটি ইনলাইন করি এবং আবার কোয়েরিটি সম্পাদন করি , এসকিউএল সার্ভার দ্বিতীয় সূচীর সন্ধান করে, যার ফলে কেবলমাত্র 104 লজিকাল রিড হয় এবং একটি 0.001 দ্বিতীয় সময়কাল (মূলত তাত্ক্ষণিক)।
আমার ভেরিয়েবল দরকার তবে এসকিউএল ভাল পরিকল্পনাটি ব্যবহার করতে চাই। অস্থায়ী সমাধান হিসাবে আমি ক্যোয়ারিতে একটি সূচক ইঙ্গিত দিয়েছি এবং ক্যোরিটি মূলত তাত্ক্ষণিক। যাইহোক, আমি সম্ভব হলে সূচক ইঙ্গিত থেকে দূরে থাকার চেষ্টা করি। আমি সাধারণত ধরে নিয়েছি যে যদি ক্যোয়ারী অপ্টিমাইজার এর কাজটি করতে অক্ষম হয়, তবে এটি করার জন্য স্পষ্টভাবে কিছু না বলে এটিকে সহায়তা করার জন্য আমি কিছু করতে পারি (বা করা বন্ধ করে)।
সুতরাং, যখন আমি ভেরিয়েবলটি ইনলাইন করব তখন এসকিউএল সার্ভার কেন আরও ভাল পরিকল্পনা নিয়ে আসে?