मैं यह प्रश्न पूछ रहा हूं ताकि ऑप्टिमाइज़र के व्यवहार को बेहतर ढंग से समझने और सूचकांक स्पूल के आसपास की सीमाओं को समझने के लिए। मान लीजिए कि मैंने पूर्णांक 1 से 10000 तक ढेर में डाल दिया है:
CREATE TABLE X_10000 (ID INT NOT NULL);
truncate table X_10000;
INSERT INTO X_10000 WITH (TABLOCK)
SELECT TOP 10000 ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;
और एक नेस्टेड लूप के साथ मजबूर करें MAXDOP 1
:
SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID = b.ID
OPTION (LOOP JOIN, MAXDOP 1);
यह SQL सर्वर की ओर ले जाने के लिए एक बल्कि अमित्र कार्रवाई है। जब दोनों तालिकाओं के पास कोई प्रासंगिक अनुक्रमणिका नहीं है, तो नेस्टेड लूप जॉइन अक्सर एक अच्छा विकल्प नहीं होता है। यहाँ योजना है:
क्वेरी मशीन स्पूल से प्राप्त 100000000 पंक्तियों के साथ मेरी मशीन पर 13 सेकंड लेती है। हालाँकि, मैं यह नहीं देखता कि क्वेरी को धीमा क्यों होना है। क्वेरी ऑप्टिमाइज़र में इंडेक्स स्पूल के माध्यम से फ्लाई पर इंडेक्स बनाने की क्षमता होती है । ऐसा लगता है कि यह सूचकांक स्पूल के लिए एक आदर्श उम्मीदवार होगा।
निम्न क्वेरी पहले वाले के समान परिणाम देती है, जिसमें एक इंडेक्स स्पूल होता है, और एक सेकंड से भी कम समय में समाप्त होता है:
SELECT *
FROM X_10000 a
CROSS APPLY (SELECT TOP (9223372036854775807) b.ID FROM X_10000 b WHERE a.ID = b.ID) ca
OPTION (LOOP JOIN, MAXDOP 1);
इस क्वेरी में एक इंडेक्स स्पूल भी है और एक सेकंड से भी कम समय में खत्म होता है:
SELECT *
FROM X_10000 a
INNER JOIN X_10000 b ON a.ID >= b.ID AND a.ID <= b.ID
OPTION (LOOP JOIN, MAXDOP 1);
मूल क्वेरी में इंडेक्स स्पूल क्यों नहीं है? क्या प्रलेखित या अनिर्दिष्ट संकेत या झंडे के निशान का कोई सेट है जो इसे एक सूचकांक स्पूल देगा? मुझे यह संबंधित प्रश्न मिला , लेकिन यह मेरे प्रश्न का पूरी तरह से उत्तर नहीं देता है और मुझे इस क्वेरी के लिए रहस्यमय ट्रेस ध्वज नहीं मिल सकता है।