ORDER BY
में खंड SELECT
बयान अनावश्यक है।
यह निरर्थक है क्योंकि जो पंक्तियाँ डाली जाएंगी, अगर उन्हें क्रमबद्ध करने की आवश्यकता है , तो वैसे भी हल किया जाता है।
आइए हम एक टेस्ट केस बनाते हैं।
CREATE TABLE #Test (
id INTEGER NOT NULL
);
CREATE UNIQUE CLUSTERED INDEX CL_Test_ID ON #Test (id);
CREATE TABLE #Sequence (
number INTEGER NOT NULL
);
INSERT INTO #Sequence
SELECT number FROM master..spt_values WHERE name IS NULL;
चलिए वास्तविक क्वेरी योजनाओं के पाठ प्रदर्शन को सक्षम करते हैं, इसलिए हम देख सकते हैं कि क्वेरी प्रोसेसर द्वारा क्या कार्य किए जाते हैं।
SET STATISTICS PROFILE ON;
GO
अब, INSERT
एक ORDER BY
खंड के बिना तालिका में 2k पंक्तियों को दें ।
INSERT INTO #Test
SELECT number
FROM #Sequence
इस क्वेरी के लिए वास्तविक निष्पादन योजना निम्नलिखित है।
INSERT INTO #Test SELECT number FROM #Sequence
|--Clustered Index Insert(OBJECT:([tempdb].[dbo].[#Test]), SET:([tempdb].[dbo].[#Test].[id] = [tempdb].[dbo].[#Sequence].[number]))
|--Top(ROWCOUNT est 0)
|--Sort(ORDER BY:([tempdb].[dbo].[#Sequence].[number] ASC))
|--Table Scan(OBJECT:([tempdb].[dbo].[#Sequence]))
जैसा कि आप देख सकते हैं, वास्तविक INSERT होने से पहले एक सॉर्ट ऑपरेटर है।
अब, तालिका को साफ़ करें, और INSERT
2k पंक्तियों को ORDER BY
खंड के साथ तालिका में डालें।
TRUNCATE TABLE #Test;
GO
INSERT INTO #Test
SELECT number
FROM #Sequence
ORDER BY number
इस क्वेरी के लिए वास्तविक निष्पादन योजना निम्नलिखित है।
INSERT INTO #Test SELECT number FROM #Sequence ORDER BY number
|--Clustered Index Insert(OBJECT:([tempdb].[dbo].[#Test]), SET:([tempdb].[dbo].[#Test].[id] = [tempdb].[dbo].[#Sequence].[number]))
|--Top(ROWCOUNT est 0)
|--Sort(ORDER BY:([tempdb].[dbo].[#Sequence].[number] ASC))
|--Table Scan(OBJECT:([tempdb].[dbo].[#Sequence]))
ध्यान दें कि यह वही निष्पादन योजना है जिसका उपयोग INSERT
बिना ORDER BY
खंड के कथन के लिए किया गया था ।
अब, Sort
ऑपरेशन की हमेशा आवश्यकता नहीं होती है, जैसा कि मार्क स्मिथ ने एक अन्य उत्तर में दिखाया है (यदि सम्मिलित की जाने वाली पंक्तियों की संख्या कम है), लेकिन ORDER BY
खंड अभी भी उस मामले में निरर्थक है, क्योंकि एक स्पष्ट के साथ भी ORDER BY
, कोई भी Sort
ऑपरेशन उत्पन्न नहीं होता है क्वेरी प्रोसेसर द्वारा।
आप INSERT
न्यूनतम-लॉग-इन का उपयोग करके किसी कथन को क्लस्टर इंडेक्स वाली तालिका में ऑप्टिमाइज़ कर सकते हैं INSERT
, लेकिन यह इस प्रश्न के दायरे से बाहर है।
2011-11-02 अपडेट किया गया है: जैसा कि मार्क स्मिथ ने दिखाया है , INSERT
एक क्लस्टर इंडेक्स वाली तालिका में हमेशा छंटनी की आवश्यकता नहीं होती है - ORDER BY
हालांकि उस मामले में भी यह खंड बेमानी है।