2010-09-10 14 views
10

डेटाबेस तालिका पर sp_executesql चलाते समय मुझे कुछ समस्याएं आ रही हैं। मैं एक ओआरएम (एनएचबीरनेट) का उपयोग कर रहा हूं जो एक SQL क्वेरी उत्पन्न करता है जो इस मामले में एक तालिका से पूछताछ करता है। इस तालिका में इसके बारे में 7 मिलियन रिकॉर्ड हैं और अत्यधिक अनुक्रमित हैं।sp_executesql मेरी क्वेरी को बहुत धीमा होने के कारण

जब मैं क्वेरी चलाता हूं कि ORM sp_executesql के बिना बाहर निकलता है, तो यह बहुत तेज़ चलता है और प्रोफाइलर दिखाता है कि इसमें 85 पढ़े गए हैं। जब मैं sp_executesql का उपयोग कर एक ही क्वेरी चलाता हूं, तो इसमें लगभग 201,828 पढ़ते हैं।

क्या कुछ ऐसा है जो मुझे अपने SQL सर्वर पर sp_exectuesql के बिना क्वेरी चलाने के प्रदर्शन को बेहतर बनाने के लिए करना है? ऐसा लगता है कि यह मेरे सूचकांक का उपयोग नहीं कर रहा है।

इस समस्या को ठीक करने का सबसे अच्छा तरीका क्या है? यदि संभव हो, तो मैं ओआरएम एसक्यूएल उत्पन्न करने के तरीके को नहीं बदलेगा बल्कि इसके बजाय SQL सर्वर/डेटाबेस स्तर पर समस्या को ठीक करता है क्योंकि ऐसा लगता है कि समस्या है। मुझे लगता है कि मुझे इस समस्या को ठीक करने के लिए डेटाबेस पर अधिक अनुकूलन करने की आवश्यकता है, मुझे बस पता नहीं है कि क्या।

exec sp_executesql N'SELECT top 20 
          this_.Id as Id0_0_, 
          this_.Application as Applicat2_0_0_, 
          this_.[Context] as column3_0_0_, 
          this_.Logger as Logger0_0_, 
          this_.Message as Message0_0_, 
          this_.Exception as Exception0_0_, 
          this_.Thread as Thread0_0_, 
          this_.[Level] as column8_0_0_, 
          this_.LogDate as LogDate0_0_, 
          this_.SessionId as SessionId0_0_ 
         FROM LogMessages this_ 
         WHERE this_.[Context] = @p0', 
        N'@p0 nvarchar(2)', 
        @p0 = N'55' 

संदर्भ एक वर्चर (255) है। यह क्षेत्र बहुत नि: शुल्क रूप है। यह हमेशा एक पूर्णांक नहीं होता है और लंबाई बहुत हो सकती है। इस मामले में, मैं '55' के एक मूल्य के लिए क्वेरी कर रहा हूँ, लेकिन यह सिर्फ के रूप में आसानी के लिए 'Foooooobaaaarrr'

+1

SQL सर्वर का संस्करण क्या है? क्वेरी कैसी दिखती है? –

+1

कोई कोड देखे बिना हम केवल – SQLMenace

+0

SQL Server 2008 – Rob

उत्तर

13

क्या के डेटा प्रकार है। [संदर्भ] क्वेरी करने जा सकता है

अभी एक ही डेटाप्रकार का उपयोग आप nvarchar (2) का उपयोग कर रहे हैं, लेकिन यह 55 की तरह कुछ के लिए अजीब लगता है, यदि आप एक ही डेटा प्रकार का उपयोग नहीं कर रहे हैं तो आपको रूपांतरण मिलेगा, जिसके बाद स्कैन

आपके अपडेट किए गए प्रश्न के आधार पर ऐसा लगता है कि यह वर्चर है (255), तो यह

WHERE this_.[Context] = @p0',N'@p0 varchar(255)',@p0='55' 
+4

"रूपांतरण प्राप्त करें जो स्कैन का कारण बनता है" वह उत्तर है जिसे मैं ढूंढ रहा था। ऐसा लगता है कि किसी कारण से, NHibernate nvarchar का उपयोग करने की कोशिश कर रहा है, न कि वर्चर जो समस्या पैदा कर रहा है। वर्चर्स को मैन्युअल रूप से बदलना समस्या को हल करता है। – Rob

+2

क्योंकि .NET में तार यूनिकोड हैं और यह nvarchar में स्थानांतरित हो जाता है – SQLMenace

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