2010-09-14 13 views
6

मेरे पास एक क्वेरी है जो SQL सर्वर प्रबंधन स्टूडियो में सुपरफास्ट है और SP_ExecuteSQL के अंतर्गत चलाने पर सुपर धीमी है।एसक्यूएल सर्वर sp_ExecuteSQL और निष्पादन योजना

क्या यह निष्पादन योजनाओं के कैशिंग के साथ ऐसा करने के लिए किया जाता है जब spExecuteSQL के तहत चलाया जाता है?

+7

मुझे आश्चर्य है कि "sp_executesql योजनाओं को कैश नहीं करता है" मिथक कभी मर जाएगा - पढ़ें [गतिशील एसक्यूएल का अभिशाप और आशीर्वाद] (http://www.sommarskog.se/dynamic_sql.html) –

+0

@OMG टट्टू - पैरामीटर स्नीफिंग SP_ExecuteSQL के साथ कोई समस्या हो सकती है? – JNK

+0

@ जेएनके: व्यवहार का अनुभव करने के बाद से, मैंने डिफ़ॉल्ट रूप से एंटी-पैरामेट स्नीफिंग में डाल दिया है। –

उत्तर

8

सं

आप दोनों निष्पादन की योजना को देखते हैं और निम्न क्वेरी का उपयोग कर उन्हें तुलना कर सकते हैं।

SELECT usecounts, cacheobjtype, objtype, text, query_plan, value as set_options 
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) 
cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa 
where text like '%Some unique string in your query%' 
              and attribute='set_options' 

sp_executesql संस्करण का एक objtype होगा "तैयार"

+3

निष्पादन योजना इतनी मूल रूप से अलग क्यों होगी? उदाहरण के लिए, मैंने एसक्यूएल प्रबंधन स्टूडियो (3 सेकंड लेता है) से सीधे मेरी क्वेरी निष्पादन योजना को देखा है, और sp_executeSql से निष्पादन योजना (5+ मिनट लगती है)। sp_executeSql की योजना पूरी तरह से उन प्रमुख इंडेक्स को अनदेखा करती है जिन्हें प्रत्यक्ष कॉल मिला। क्या कोई समझा सकता है कि प्रबंधन स्टूडियो से कॉल को चाबियाँ क्यों मिलती हैं, लेकिन sp_ExecuteSql के माध्यम से कॉल नहीं करता है? –

+0

@NathanTregillus - शायद पैरामीटर स्नीफिंग, आप कैश किए गए योजना एक्सएमएल को उन पैरामीटर के मानों को देखने के लिए देख सकते हैं जिनकी योजना वास्तव में संकलित की गई थी। –

+0

प्रतिक्रिया @MartinSmith के लिए धन्यवाद। वास्तव में यह हमारे संदर्भ में फ़िल्टर के रूप में contextInfo का उपयोग करने के तरीके के कारण था, और यह निष्पादन योजना में कैसा नहीं है –

1

समान व्यवहार अनुभवी। (सेट विकल्प बराबर) समांतर योजना का उत्पादन करने वाली नियमित क्वेरी और sp_executesql का उपयोग करके यह एक धारावाहिक योजना उत्पन्न करता है।

declare @xyzParam1 datetime,@xyzParam2 datetime 
select @xyzParam1='Sep 1 2014 12:00:00:000AM',@xyzParam2='Sep 26 2014 11:59:59:000PM' 
SELECT * FROM Theview WHERE departuretime BETWEEN @xyzParam1 AND @xyzParam2 
; 

बनाम

exec sp_executesql N'SELECT * FROM Theview WHERE departuretime BETWEEN @xyzParam1 AND @xyzParam2',N'@xyzParam1 datetime,@xyzParam2 datetime',@xyzParam1='Sep 1 2014 12:00:00:000AM',@xyzParam2='Sep 26 2014 11:59:59:000PM' 

मैं इस्तेमाल किया दृश्य को संशोधित करने, क्योंकि यह जैसे निहित एक इष्टतम परिणाम ही प्राप्त कर सके शेष डेटा के लिए बाएं जुड़ता है जिसे हमेशा उम्मीद थी। (INNER में शामिल हो गए)

अब नियमित क्वेरी उसी योजना को चुनती है जैसे sp_executesql का उपयोग करके प्राप्त किया गया है और प्रदर्शन बेहतर तरीका है।

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