मेरे पास एक SQL क्वेरी है जिसे मैं अनुकूलित करने की कोशिश कर रहा हूं:
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)
जब मैं क्वेरी को बिल्कुल ऊपर लिखे अनुसार निष्पादित करता हूं, तो SQL सर्वर पहले सूचकांक को स्कैन करता है, जिसके परिणामस्वरूप 189,703 तार्किक रीड और 2-3 सेकंड की अवधि होती है।
जब मैं @Id
चर को इनलाइन करता हूं और क्वेरी को फिर से निष्पादित करता हूं , तो SQL सर्वर दूसरा सूचकांक खोजता है, जिसके परिणामस्वरूप केवल 104 तार्किक रीड और 0.001 सेकंड की अवधि (मूल रूप से तत्काल) होती है।
मुझे चर की आवश्यकता है, लेकिन मैं चाहता हूं कि एसक्यूएल अच्छी योजना का उपयोग करे। एक अस्थायी समाधान के रूप में मैंने क्वेरी पर एक सूचकांक संकेत दिया है, और क्वेरी मूल रूप से तत्काल है। हालांकि, मैं संभव होने पर सूचकांक के संकेतों से दूर रहने की कोशिश करता हूं। मैं आमतौर पर यह मानता हूं कि यदि क्वेरी ऑप्टिमाइज़र अपना काम करने में असमर्थ है, तो कुछ ऐसा है जो मैं कर सकता हूं (या करना बंद कर रहा हूं) यह स्पष्ट रूप से बताए बिना कि यह क्या करना है।
इसलिए, जब मैं चर को इनलाइन करता हूं तो SQL सर्वर एक बेहतर योजना के साथ क्यों आता है?