2011-10-24 5 views
5

उत्पन्न करने के बाद एसक्यूएल GROUP के LINQ, इस उदाहरण में खंड होने के लिए LINQ करने के लिए एसक्यूएल रूपांतरण:द्वारा सभी नमूनों के अनुसार के रूप में ही सबक्वेरी

SELECT NAME 
FROM TABLES 
GROUP BY NAME 
HAVING COUNT(*) > 1 

है: (vb.net)

from t in tables 
group t by t.NAME into g = Group 
where g.count > 1 
select g 

लेकिन इसके बाद के संस्करण LINQ बयान निम्नलिखित एसक्यूएल करने के लिए अनुवाद किया है:


SELECT [t1].[NAME] AS [Key] 
FROM (
    SELECT COUNT(*) AS [value], [t0].[NAME] 
    FROM [tables] AS [t0] 
    WHERE [t0].[NAME] <> @p0 
    GROUP BY [t0].[NAME] 
    ) AS [t1] 
WHERE [t1].[value] > @p1 

मैं कभी भी हैविंग क्लॉज फॉर्म LINQ उत्पन्न करने में सफल नहीं हूं। मान लें कि WHERE के साथ HAVING और subquery समूह परिणाम के बराबर हैं, लेकिन प्रदर्शन में कोई अंतर है? मेरे मूल एसक्यूएल प्रश्नों को कम से कम सिमिलर रखने के बारे में क्या LINQ अंतर्निहित उत्पन्न करता है?

उत्तर

4

आप प्रदर्शन कर सकते हैं कि निष्पादन योजनाओं को देखकर SQL सर्वर द्वारा प्रश्न में दो प्रश्नों को निष्पादित किया गया है या नहीं। निम्न परीक्षण कोड ले लो (मैं एसक्यूएल सर्वर 2008 का इस्तेमाल किया):

:

CREATE TABLE #TABLES ([ID] INT IDENTITY, [Name] VARCHAR(30)) 
INSERT INTO #TABLES VALUES('A') 
INSERT INTO #TABLES VALUES('A') 
INSERT INTO #TABLES VALUES('B') 
INSERT INTO #TABLES VALUES('C') 
INSERT INTO #TABLES VALUES('D') 

SELECT NAME 
FROM #TABLES 
WHERE [Name] <> 'D' 
GROUP BY NAME 
HAVING COUNT(*) > 1 

SELECT [t1].[NAME] 
FROM (
    SELECT COUNT(*) AS [value], [t0].[NAME] 
    FROM [#TABLES] AS [t0] 
    WHERE [t0].[NAME] <> 'D' 
    GROUP BY [t0].[NAME] 
    ) AS [t1] 
WHERE [t1].[value] > 1 

DROP TABLE #TABLES 

साथ एसक्यूएल क्वेरी विश्लेषक से इन प्रश्नों निष्पादित "क्वेरी" मेनू के तहत चयनित निम्नलिखित उत्पादन निकलेगा "वास्तविक निष्पादन योजना शामिल करें"

execution plans

इस मामले में, जेनरेट की गई क्वेरी योजनाएं बिल्कुल वही हैं, इसलिए यह निश्चित रूप से प्रतीत होता है कि आपके LINQ कथन से उत्पन्न आपके SQL और SQL के बीच कोई प्रदर्शन अंतर नहीं होना चाहिए।

एक साइड नोट के रूप में, दुर्भाग्यवश, मुझे कोई दस्तावेज नहीं मिला कि क्यों LinqToSql HAVING का उपयोग नहीं करता है, या यदि उप-चयन उपज का उपयोग करके हैविंग बनाम का उपयोग करना एक प्रदर्शन लाभ एक तरफ या दूसरा है। अगर मुझे लगता है कि मैं कहूंगा कि SQL सर्वर में क्वेरी ऑप्टिमाइज़र आंतरिक रूप से इन कथनों को निष्पादित करने से पहले एक ही क्वेरी में बदल देता है, यही कारण है कि निष्पादन योजना दोनों कथनों के लिए समान होती है। मेरा पिछला कथन सत्य है या नहीं, मैं कहूंगा कि यदि आप कभी संदेह में हैं, तो अपने SQL संस्करण के लिए Exqution Plans को LinqToSQL संस्करण बनाम देखें। यदि वे वही हैं तो आपके पास प्रदर्शन के बारे में चिंता करने के लिए कुछ भी नहीं है। यदि आपका एसक्यूएल संस्करण अधिक कुशल है, तो आप हमेशा एक संग्रहीत प्रक्रिया लिख ​​सकते हैं और केवल LinqToSql का उपयोग करके संग्रहीत प्रक्रिया को कॉल कर सकते हैं।

संबंधित मुद्दे