मेरे पास इस तरह की एक तालिका है:
CREATE TABLE Updates
(
UpdateId INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
ObjectId INT NOT NULL
)
बढ़ती आईडी के साथ वस्तुओं को अनिवार्य रूप से अपडेट करना।
इस तालिका का उपभोक्ता UpdateId
विशिष्ट से शुरू और शुरू किए गए 100 अलग-अलग ऑब्जेक्ट आईडी का एक हिस्सा चुन लेगा UpdateId
। अनिवार्य रूप से, जहां यह बंद है और फिर किसी भी अपडेट के लिए क्वेरी करना है, उस पर नज़र रखना।
मैं इस पाया है एक दिलचस्प अनुकूलन समस्या हो सकता है क्योंकि मैं केवल उन क्वेरी के लिए लिख कर एक अधिकतम इष्टतम क्वेरी योजना उत्पन्न करने में सक्षम किया गया है हो मैं क्या अनुक्रमित की वजह से चाहते हैं, लेकिन नहीं है ऐसा करने के लिए गारंटी है कि मैं क्या करना चाहते हैं:
SELECT DISTINCT TOP 100 ObjectId
FROM Updates
WHERE UpdateId > @fromUpdateId
@fromUpdateId
एक संग्रहीत प्रक्रिया पैरामीटर कहाँ है।
की एक योजना के साथ:
SELECT <- TOP <- Hash match (flow distinct, 100 rows touched) <- Index seek
UpdateId
इंडेक्स के उपयोग की तलाश के कारण , परिणाम पहले से ही अच्छे हैं और सबसे कम से लेकर उच्चतम अपडेट आईडी जैसे कि मैं चाहता हूं, का आदेश दिया गया है। और यह एक प्रवाह अलग योजना बनाता है , जो मैं चाहता हूं। लेकिन आदेश स्पष्ट रूप से व्यवहार की गारंटी नहीं है, इसलिए मैं इसका उपयोग नहीं करना चाहता।
यह चाल समान क्वेरी योजना (हालांकि निरर्थक TOP के साथ) के परिणामस्वरूप होती है:
WITH ids AS
(
SELECT ObjectId
FROM Updates
WHERE UpdateId > @fromUpdateId
ORDER BY UpdateId OFFSET 0 ROWS
)
SELECT DISTINCT TOP 100 ObjectId FROM ids
हालांकि, मुझे यकीन नहीं है (और संदेह नहीं) अगर यह सही मायने में आदेश की गारंटी देता है।
एक क्वेरी मुझे आशा थी कि SQL सर्वर को सरल बनाने के लिए पर्याप्त स्मार्ट होगा, लेकिन यह एक बहुत खराब क्वेरी योजना उत्पन्न करता है:
SELECT TOP 100 ObjectId
FROM Updates
WHERE UpdateId > @fromUpdateId
GROUP BY ObjectId
ORDER BY MIN(UpdateId)
की एक योजना के साथ:
SELECT <- Top N Sort <- Hash Match aggregate (50,000+ rows touched) <- Index Seek
मैं डुप्लिकेट को हटाने के लिए एक इंडेक्स की तलाश में एक इष्टतम योजना UpdateId
और एक फ्लो विशिष्ट के साथ एक तरीका खोजने की कोशिश कर रहा हूं ObjectId
। कोई विचार?
यदि आप चाहें तो नमूना डेटा । ऑब्जेक्ट्स शायद ही कभी एक से अधिक अद्यतन होंगे, और लगभग 100 पंक्तियों के एक सेट के भीतर लगभग कभी भी एक से अधिक नहीं होना चाहिए, यही कारण है कि मैं एक प्रवाह के बाद हूं , जब तक कि कुछ बेहतर न हो मुझे पता नहीं है? हालाँकि, इस बात की कोई गारंटी नहीं है कि किसी ObjectId
तालिका में 100 से अधिक पंक्तियाँ नहीं होंगी। तालिका में 1,000,000 पंक्तियाँ हैं और इसके तेजी से बढ़ने की उम्मीद है।
मान लें कि इसके उपयोगकर्ता के पास उपयुक्त अगला खोजने का एक और तरीका है @fromUpdateId
। इस क्वेरी में इसे वापस करने की आवश्यकता नहीं है।