मेरे पास एक संग्रहित प्रक्रिया है जो System.Data.SqlClient.SqlCommand
(2 मिनट के बाद के समय) के साथ चलाने के दौरान एसक्यूएल सर्वर प्रबंधन स्टूडियो (2 सेकंड) से बहुत तेज निष्पादित करती है।SqlCommand के साथ उपयोग किए जाने पर कुछ एसक्यूएल क्वेरी कितनी धीमी है?
इसका कारण क्या हो सकता है?
विवरण: Sql सर्वर प्रबंधन स्टूडियो में इस (उत्पादन डेटाबेस पर) 2 सेकंड में चलाता है:
EXEC sp_Stat @DepartmentID = NULL
में नेट/सी # निम्नलिखित समय बाहर 2 मिनट के बाद (उत्पादन डेटाबेस पर) :
string selectCommand = @"
EXEC sp_Stat
@DepartmentID = NULL";
string connectionString = "server=***;database=***;user id=***;pwd=***";
using (SqlConnection connection = new SqlConnection(connectionString))
{
using (SqlCommand command = new SqlCommand(selectCommand, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
}
}
}
}
मैं भी selectCommand = "sp_Stat"
, CommandType = StoredProcedure
, और एक SqlParameter
साथ करने की कोशिश की है, लेकिन यह एक ही परिणाम है।
और EXEC
के बिना यह भी वही परिणाम है।
लगभग डेटा-खाली विकास डेटाबेस पर दोनों मामले 1 सेकंड से भी कम समय में समाप्त होते हैं। तो यह वहाँ डेटाबेस में डेटा का एक बहुत है कि से संबंधित है, लेकिन यह केवल नेट से हो रहा है ...
क्या मार्क Gravell अलग SET
मूल्यों के बारे में लिखा प्रस्तुत मामले में फर्क नहीं पड़ता।
एसक्यूएल सर्वर प्रोफाइलर से पता चला है Sql सर्वर प्रबंधन स्टूडियो चलाता है जो निम्न SET
की जो .NET Sql क्लाइंट डेटा प्रदाता नहीं करता है:
SET ROWCOUNT 0
SET TEXTSIZE 2147483647
SET NOCOUNT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ARITHABORT ON
SET LOCK_TIMEOUT -1
SET QUERY_GOVERNOR_COST_LIMIT 0
SET DEADLOCK_PRIORITY NORMAL
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET ANSI_NULLS ON
SET ANSI_NULL_DFLT_ON ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET CURSOR_CLOSE_ON_COMMIT OFF
SET IMPLICIT_TRANSACTIONS OFF
SET QUOTED_IDENTIFIER ON
SET NOEXEC, PARSEONLY, FMTONLY OFF
जब मैं इन शामिल एक ही क्वेरी उतना ही समय ले लिया एसएसएमएस और .NET में। और जिम्मेदार SET
SET ARITHABORT ON
मैं क्या सीखा है ...? हो सकता है कि अनुमान लगा के बजाय एक प्रोफाइलर उपयोग करने के लिए ...
(पहली बार में समाधान सूँघने पैरामीटर के लिए संबंधित होने के लिए लग रहा था। लेकिन मैं कुछ चीजें मिश्रित था ...)
विचार करने के लिए एक और बात: यदि आपके पास 'एरिथबॉर्ट ऑफ़' के साथ प्रदर्शन जुर्माना है तो आप स्ट्रिंग और न्यूमेरिक फ़ील्ड द्वारा दो टेबलों में शामिल हो सकते हैं। मेरे मामले में, एक सरल 'ISNUMERIC (string_field) = 1' जोड़ना _before_ समस्या को हल करने में शामिल हों :) – Loris
मैंने कभी यह नहीं माना होगा - बहुत उपयोगी प्रश्न/उत्तर! :) हमारे पास सिर्फ एक कच्ची एसक्यूएल क्वेरी है जिसे डैपर के माध्यम से निष्पादित किया जा रहा है और वही एसईटी अपराधी था। – Jedidja
एप्लिकेशन परत में ARITHABORT को सेट करने के बारे में जागरूक रहें .. "अपनी प्रक्रिया पर सेट एथिबैबर्ट जोड़ना कोई समाधान नहीं है। जब आप इसे आजमाते हैं तो यह काम करेगा। लेकिन ऐसा इसलिए है क्योंकि आपने प्रक्रिया को फिर से बनाया है जिसने एक नया संकलन मजबूर किया है" यहां पूरा लेख: http://www.sommarskog.se/query-plan-mysteries.html –