2011-03-25 10 views
10

क्वेरी 1: (बिजली की तेजी)धीमी चलाने sp_executesql जब मापदंडों तर्क के रूप में पारित कर रहे हैं क्यों

sp_executesql "select * from tablesView where Id = 1" 

बनाम

क्वेरी 2: (बहुत धीमी गति से)

sp_executesql "select * from tablesView where Id = @Id", N"@Id int", @Id=1 

tablesView - a view containing multiple joins

LINQ हमेशा प्रश्नों को क्वेरी 2 रूप में परिवर्तित करता है और इसलिए प्रदर्शन वास्तव में खराब है।

प्रश्न: मुझे क्वेरी 2 धीमेपन के कारण की आवश्यकता है, और यदि कोई है तो कोई संकल्प। और LINQ के लिए एक प्रस्ताव।

---- अतिरिक्त टिप्पणियाँ:

प्रदर्शन हिट निश्चित रूप से 2 कॉलम जो रैंकिंग कार्य (ROW_NUMBER) का उपयोग कर रहे की वजह से है लेकिन मैं उन्हें टाल नहीं सकते मैं उन्हें जरूरत है।

+0

आप आईडी = 1 के साथ बहुत सी पंक्तियाँ है:

वहाँ एक लेख यहाँ समझा क्या पैरामीटर सूंघने है? –

+0

@Lasse, भले ही मेरे पास 50 रिकॉर्ड हों, अंतर बहुत बड़ा है। 0 सेकंड बनाम 10 सेकेंड की तरह, टेबल से एक चीज का चयन किया जाता है, आम तौर पर बहुत सारे जोड़ों के साथ एक दृश्य होता है। – WhoIsNinja

+0

'आईडी' के लिए डेटाटाइप पास किया गया है? आपके पास इंडेक्स के उपयोग को रोकने पर एक निहित कास्ट हो सकता है। –

उत्तर

0
  1. बचें चुनें *
  2. ADO.NET 3.5 वहाँ Linq में है "पैरामीटर quessing" का उपयोग कर 1 = TINYINT 2345 = SMALLINT 76,357,242 = INT .. ADO.NET में 4.0 पैरामीटर quessing डिफ़ॉल्ट INT डेटा साथ बदल दिया है टाइप 1 = INT, 2335 = INT, 76,357,242 = INT)
+0

मैं कभी भी चयन * का उपयोग नहीं करता, यह सिर्फ उदाहरण के लिए था। – WhoIsNinja

7

मैं यहाँ एक अंग पर बाहर जाना और मान लें कि आपके बहुत सी पंक्तियाँ जहां आईडी = 1.

यदि नहीं है जा रहा हूँ , कृप्या मुझे सही करें।

हम्म, मुझे आश्चर्य है कि क्या वह उस पैरामीटर के लिए पारित करने के लिए जा रहा है:

एक संभावित कारण यह है कि एसक्यूएल सर्वर आपकी क्वेरी धीमी गति से संसाधित कर रहा है कि यह क्वेरी को देखता है और चला जाता है।
क्या यह 1 होगा? जहां मेरे पास एक गजबानी पंक्तियां हैं?
या शायद 1742, जहां मैं सिर्फ 3
मैं बस नहीं जानता है, मैं बेहतर एक मेज स्कैन कर एक कार्य योजना लागू है कि मेरे सभी ठिकानों

एक स्तंभ हैं कवर किया जाएगा उत्पादन करने के लिए सुनिश्चित करने के लिए, या एक स्तंभ सेट, कम चयनकता है (यानी अद्वितीय मानों की संख्या पंक्तियों की संख्या से बहुत कम है), एसक्यूएल सर्वर कभी-कभी सभी पंक्तियों को निश्चित रूप से प्राप्त करने के लिए, एक टेबलकेन या इसी तरह वापस लौटाएगा।

कम से कम यह मेरा अनुभव रहा है। विशेष रूप से मैंने वही व्यवहार देखा है जब दिनांक सीमा समय सारिणी वाले डेटा के साथ टेबल पर चयन करती है, WHERE dt <= @dt AND dt >= @dt कर रही है ताकि सभी पंक्तियां प्राप्त हो सकें जहां @ डीटी उस पंक्ति में समय के भीतर है, एक टेबल-स्कैन पर वापस आती है, और तब जब मैं वास्तविक तिथि को एसक्यूएल में एक शाब्दिक के रूप में रखता हूं तो यह बहुत तेज़ चलता है।

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

पैरामीटर के लिए विशिष्ट मान निर्दिष्ट करने के लिए एक क्वेरी संकेत जोड़ने का प्रयास करें।:

sp_executesql "select * from tablesView where Id = @Id option (optimize for (@id = 1742))", N"@Id int", @Id=1 
+0

अनुकूलित करने में मदद नहीं करता है, क्योंकि मैं लिनक से पूछताछ के अंदर ऑप्टिमाइज़ जोड़ने के लिए नहीं कह सकता हूं। :( – WhoIsNinja

+0

और रिकॉर्ड के बारे में बात करते हुए, यदि इस प्रश्न में कोई खंड नहीं है, तो लाखों रिकॉर्ड वापस आएंगे, क्योंकि दृश्य में बड़ी तालिका – WhoIsNinja

+1

के बीच शामिल है। "कोई कहां नहीं है" के बारे में कुछ भी कहा? और 2. क्या आपने खंड के अनुकूलन के साथ एसक्यूएल को निष्पादित करने और मतभेदों को देखने का प्रयास करें? और 3) ... एक ओआरएम है जो आपके डेटा को अभी भी सबसे अच्छा तरीका नहीं जानता है? –

2

यह एक पैरामीटर समस्या सूँघने हो सकता है। लाइन सहित:

OPTION (RECOMPILE) 

आपकी SQL क्वेरी के अंत में प्रयास करें। http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

+0

हालांकि मैं इसे सीधे उपयोग नहीं कर सका, यह मेरी समस्या का उत्तर था, अर्थात् पैरामीटर इंडेक्स का उपयोग करने के बजाय टेबल स्कैन का कारण बन रहे थे। विकल्प (रिकॉम्पिल) का उपयोग करके तालिका सूचकांक के योजना बनाने के उपयोग के लिए अंतर्निहित दृश्य को मजबूर किया गया। दुर्भाग्य से मैं इसका उपयोग नहीं कर सका क्योंकि मेरा एसक्यूएल मिडलवेयर पार्सर सिंटैक्स स्वीकार नहीं कर सकता है। मेरा कामकाज पैरामीटर के बिना एसक्यूएल बनाना था, क्वेरी में मूल्यों को प्रभावी ढंग से कोड करना मुश्किल था। कोई आदर्श नहीं है, लेकिन यह क्वेरी को sp_executesql में बदल दिया गया है। – Paul

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