दिलचस्प पोस्ट
विज़ुअल स्टूडियो एक्सप्रेस 2005 के साथ मैं पूरी तरह से स्टैटिकली लिंक से जुड़े .exe कैसे बना सकता हूं? MVC एचटीएमएल.पार्टीअल या एचटीएमएलएक्शन सी # कैसे WM_GETTEXT / GetWindowText API का उपयोग करें सतर्क ध्वनि प्ले करें (डिफ़ॉल्ट संदेश रिंगटोन के समान) "स्थानीय" डाटा के साथ jqGrid उपग्रिड थ्रेड फेंकने अपवाद बढ़ावा "thread_resource_error: संसाधन अस्थायी रूप से अनुपलब्ध" क्या है & PHP में क्या मतलब है? मैं सी हेडर में एक निर्देशिका कैसे जोड़ूं, जिसमें पथ शामिल है? मैं एक स्थानीय मणि कैसे स्थापित कर सकता हूं? NSCopying को कार्यान्वित करना Jquery: यह देखने के लिए जांच रहा है कि क्या div में पाठ है, फिर क्रिया जावा HTTPS क्लाइंट प्रमाणन प्रमाणीकरण रनटाइम पर भाषा बदलने का सही तरीका क्यों सी +11 11 में क्लास प्रारंभकर्ता कोष्ठक का उपयोग नहीं कर सकते? एसक्यूएल सर्वर दो फ़ील्ड ऑटो-इंफिरिमेंट के साथ दो फील्ड की अद्वितीय कम्पोजिट कुंजी

SQL क्वेरी .NET अनुप्रयोग में धीमा है लेकिन SQL सर्वर प्रबंधन स्टूडियो में तात्कालिक

यहाँ एसक्यूएल है

SELECT tal.TrustAccountValue FROM TrustAccountLog AS tal INNER JOIN TrustAccount ta ON ta.TrustAccountID = tal.TrustAccountID INNER JOIN Users usr ON usr.UserID = ta.UserID WHERE usr.UserID = 70402 AND ta.TrustAccountID = 117249 AND tal.trustaccountlogid = ( SELECT MAX (tal.trustaccountlogid) FROM TrustAccountLog AS tal INNER JOIN TrustAccount ta ON ta.TrustAccountID = tal.TrustAccountID INNER JOIN Users usr ON usr.UserID = ta.UserID WHERE usr.UserID = 70402 AND ta.TrustAccountID = 117249 AND tal.TrustAccountLogDate < '3/1/2010 12:00:00 AM' ) 

Basicaly एक उपयोगकर्ता टेबल एक TrustAccount तालिका और एक TrustAccountLog तालिका है।
उपयोगकर्ता: उपयोगकर्ता और उनके विवरण शामिल हैं
TrustAccount: एक उपयोगकर्ता एकाधिक TrustAccounts हो सकता है
TrustAccountLog: इसमें सभी ट्रस्ट अकाउंट "आंदोलनों" का ऑडिट हुआ है। ए
TrustAccount एकाधिक TrustAccountLog प्रविष्टियों के साथ जुड़ा हुआ है। अब यह क्वेरी SQL सर्वर प्रबंधन स्टूडियो के अंदर मिलीसेकंड में कार्यान्वित करता है, लेकिन कुछ अजीब कारणों से यह मेरे सी # ऐप में हमेशा के लिए लेता है और कभी-कभी टाइमआउट (120)

यहाँ संक्षेप में कोड है इसे लूप में कई बार कहा जाता है और बयान तैयार हो जाता है।

 cmd.CommandTimeout = Configuration.DBTimeout; cmd.CommandText = "SELECT tal.TrustAccountValue FROM TrustAccountLog AS tal INNER JOIN TrustAccount ta ON ta.TrustAccountID = tal.TrustAccountID INNER JOIN Users usr ON usr.UserID = ta.UserID WHERE usr.UserID = @UserID1 AND ta.TrustAccountID = @TrustAccountID1 AND tal.trustaccountlogid = (SELECT MAX (tal.trustaccountlogid) FROM TrustAccountLog AS tal INNER JOIN TrustAccount ta ON ta.TrustAccountID = tal.TrustAccountID INNER JOIN Users usr ON usr.UserID = ta.UserID WHERE usr.UserID = @UserID2 AND ta.TrustAccountID = @TrustAccountID2 AND tal.TrustAccountLogDate < @TrustAccountLogDate2 ))"; cmd.Parameters.Add("@TrustAccountID1", SqlDbType.Int).Value = trustAccountId; cmd.Parameters.Add("@UserID1", SqlDbType.Int).Value = userId; cmd.Parameters.Add("@TrustAccountID2", SqlDbType.Int).Value = trustAccountId; cmd.Parameters.Add("@UserID2", SqlDbType.Int).Value = userId; cmd.Parameters.Add("@TrustAccountLogDate2", SqlDbType.DateTime).Value =TrustAccountLogDate; // And then... reader = cmd.ExecuteReader(); if (reader.Read()) { double value = (double)reader.GetValue(0); if (System.Double.IsNaN(value)) return 0; else return value; } else return 0; 

Solutions Collecting From Web of "SQL क्वेरी .NET अनुप्रयोग में धीमा है लेकिन SQL सर्वर प्रबंधन स्टूडियो में तात्कालिक"

यदि यह पैरामीटर सूँघने वाला है, तो अपनी क्वेरी के अंत में option(recompile) जोड़ने का प्रयास करें। मैं अधिक प्रबंधनीय तरीके से तर्क को समापित करने के लिए एक संग्रहीत कार्यप्रणाली बनाने की अनुशंसा करता हूं। इसके साथ सहमत – आप केवल तीन मापदंडों का पालन क्यों करते हैं, उदाहरण के आधार पर पहचानते हैं? क्या आप इसके बजाय इस क्वेरी का उपयोग कर सकते हैं?

 select TrustAccountValue from ( SELECT MAX (tal.trustaccountlogid), tal.TrustAccountValue FROM TrustAccountLog AS tal INNER JOIN TrustAccount ta ON ta.TrustAccountID = tal.TrustAccountID INNER JOIN Users usr ON usr.UserID = ta.UserID WHERE usr.UserID = 70402 AND ta.TrustAccountID = 117249 AND tal.TrustAccountLogDate < '3/1/2010 12:00:00 AM' group by tal.TrustAccountValue ) q 

और, जो इसके लायक है, आप उपयोगकर्ता को क्वेरी निष्पादित करने की भाषा सेटिंग के आधार पर अस्पष्ट दिनांक प्रारूप का उपयोग कर रहे हैं। उदाहरण के लिए, यह मार्च का 1 जनवरी, 3 मार्च नहीं है। इसकी जांच करें:

 set language us_english go select @@language --us_english select convert(datetime, '3/1/2010 12:00:00 AM') go set language british go select @@language --british select convert(datetime, '3/1/2010 12:00:00 AM') 

अनुशंसित दृष्टिकोण 'आईएसओ' प्रारूप का उपयोग करना है yyyymmdd hh: mm: ss

 select convert(datetime, '20100301 00:00:00') --midnight 00, noon 12 

मेरे अनुभव में सामान्य कारण है कि एक क्वेरी एसएसएमएस में तेजी से चलती है लेकिन नेट से धीमी गति से कनेक्शन के SET सेटिंग्स में अंतर के कारण है। जब कोई कनेक्शन एसएसएमएस या SqlConnection कनेक्शन द्वारा खोला जाता है, तो SET आदेशों का एक हिस्सा स्वचालित रूप से निष्पादन पर्यावरण की स्थापना के लिए जारी किया जाता है। दुर्भाग्य से एसएसएमएस और SqlConnection का अलग SET डिफॉल्ट होता है।

एक आम अंतर SET ARITHABORT । अपने SET ARITHABORT ON कोड से पहली कमांड के रूप में SET ARITHABORT ON जारी करने का प्रयास करें।

एसक्यूएल प्रोफेलर का इस्तेमाल एसएसएमएस और एनएटी दोनों द्वारा SET आदेश जारी करने के लिए किया जा सकता है ताकि आपको अन्य मतभेद मिलें।

निम्नलिखित कोड दर्शाता है कि एक SET आदेश कैसे जारी किया जाए, लेकिन ध्यान दें कि इस कोड का परीक्षण नहीं किया गया है।

 using (SqlConnection conn = new SqlConnection("<CONNECTION_STRING>")) { conn.Open(); using (SqlCommand comm = new SqlCommand("SET ARITHABORT ON", conn)) { comm.ExecuteNonQuery(); } // Do your own stuff here but you must use the same connection object // The SET command applies to the connection. Any other connections will not // be affected, nor will any new connections opened. If you want this applied // to every connection, you must do it every time one is opened. } 

परीक्षण वातावरण में एक ही समस्या थी, हालांकि, लाइव सिस्टम (समान एसक्यूएल सर्वर पर) ठीक चल रहा था। OPTION (RECOMPILE) और विकल्प भी जोड़ना (ऑप्टिमाइज़ के लिए ऑप्ट (@ पी 1 UNKNOWN)) ने मदद नहीं की।

मैं एसक्यूएल exec sp_executesql N'select ... उपयोग सटीक क्वेरी को पकड़ने के लिए किया था, जो कि शुद्ध क्लाइंट भेज रहा था और पाया था कि यह exec sp_executesql N'select ... साथ लिपटे गया था और यह मानकों को exec sp_executesql N'select ... रूप में घोषित किया गया था – स्तंभों को सरल वार्चर्स की तुलना में किया जाता है

कब्जा किए गए क्वेरी पाठ को एसएसएमएस में डाल दिया गया है, यह पुष्टि की जाती है कि जैसे ही यह नेट क्लाइंट से चलता है।

मुझे पता चला कि AnsiText के मापदंडों को बदलने से समस्या को साफ़ किया गया है:

p = cm.CreateParameter() p.ParameterName = "@company" p.Value = company p.DbType = DbType.AnsiString cm.Parameters.Add(p)

मैं कभी यह नहीं समझा सकता कि परीक्षण और लाइव वातावरण के प्रदर्शन में इतनी अहम अंतर क्यों है।

सबसे अधिक संभावना समस्या कसौटी में निहित है

 tal.TrustAccountLogDate < @TrustAccountLogDate2 

इष्टतम निष्पादन योजना पैरामीटर के मूल्य पर अत्यधिक निर्भर होगी, जो 1 910-01-01 पास हो रही है (जो कोई पंक्ति नहीं देता) सबसे निश्चित रूप से 2100-12-31 (जो सभी पंक्तियां देता है) से एक अलग योजना का कारण होगा।

जब क्वेरी को क्वेरी में एक शाब्दिक रूप में निर्दिष्ट किया जाता है, तो SQL सर्वर जानता है कि योजना जनरेशन के दौरान किस मूल्य का उपयोग किया जाए। जब एक पैरामीटर का उपयोग किया जाता है, तो SQL सर्वर केवल एक बार योजना तैयार करेगा और फिर उसे पुन: उपयोग करेगा, और यदि बाद के निष्पादन में मान मूल एक से बहुत अलग है, तो योजना इष्टतम नहीं होगी।

स्थिति का समाधान करने के लिए, आप क्वेरी में OPTION(RECOMPILE) को निर्दिष्ट कर सकते हैं। क्वेरी को एक संग्रहीत कार्यविधि में जोड़ने से आपको इस विशेष समस्या के साथ मदद नहीं मिलेगी, जब तक आप RECOMPILE के साथ प्रक्रिया नहीं बनाते

दूसरों ने पहले से ही ("पैरामीटर सूँघने") का उल्लेख किया है, लेकिन मैंने सोचा था कि अवधारणा का एक सरल विवरण दुख नहीं होगा।

यह टाइप रूपांतरण मुद्दों हो सकता है क्या सभी आईडी वास्तव में डेटा स्तरीय पर SqlDbType.Int ?

इसके अलावा, क्यों 4 पैरामीटर हैं जहां 2 करेंगे?

 cmd.Parameters.Add("@TrustAccountID1", SqlDbType.Int).Value = trustAccountId; cmd.Parameters.Add("@UserID1", SqlDbType.Int).Value = userId; cmd.Parameters.Add("@TrustAccountID2", SqlDbType.Int).Value = trustAccountId; cmd.Parameters.Add("@UserID2", SqlDbType.Int).Value = userId; 

हो सकता है

 cmd.Parameters.Add("@TrustAccountID", SqlDbType.Int).Value = trustAccountId; cmd.Parameters.Add("@UserID", SqlDbType.Int).Value = userId; 

चूंकि वे दोनों एक ही चर आवंटित कर रहे हैं।

(यह सर्वर को एक अलग योजना बनाने के कारण पैदा हो सकता है क्योंकि यह चार अलग-अलग चर के रूप में ऑप्शन 4 से स्थिरांक की अपेक्षा करता है – जिससे यह 2 चर सर्वर अनुकूलन के लिए एक अंतर बना सकता है।)

चूंकि आप केवल एक कॉलम से एक कॉलम से केवल एक कॉलम से लौटते हुए दिखाई देते हैं, तो आप इसके बजाय कमान ऑब्जेक्ट पर ExecuteScalar () का उपयोग कर सकते हैं, जो कि अधिक कुशल होना चाहिए:

  object value = cmd.ExecuteScalar(); if (value == null) return 0; else return (double)value; 

मेरे मामले में समस्या यह थी कि मेरी इकाई फ़्रेमवर्क क्वेरी को पैदा कर रहा था जो exec sp_executesql उपयोग करता है

जब पैरामीटर बिल्कुल प्रकार से मेल नहीं खाते, तो निष्पादन योजना इंडेक्स का उपयोग नहीं करती है क्योंकि यह रूपांतरण को स्वयं क्वेरी में डालता है जैसा कि आप सोच सकते हैं कि यह परिणाम बहुत धीमा प्रदर्शन में है

मेरे मामले में कॉलम को सीएचआर (3) के रूप में परिभाषित किया गया था और एंटिटी फ़्रेमवर्क N'str को पारित कर रहा था, जो क्वेरी से nchar से char तक रूपांतरण करता था। इसलिए एक ऐसी क्वेरी के लिए जो इस तरह दिखती है:

ctx.Events.Where(e => e.Status == "Snt")

यह एक एसक्यूएल क्वेरी उत्पन्न कर रहा था जो कि ऐसा कुछ दिखता है:

FROM [ExtEvents] AS [Extent1] ... WHERE (N''Snt'' = [Extent1].[Status]) ...

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

आशा है कि आपके विशिष्ट समस्या का हल अब के बाद किया गया है क्योंकि यह एक पुरानी पोस्ट है

निम्नलिखित SET विकल्प में प्लान रिज्यूज को प्रभावित करने की क्षमता है (अंत में पूरी सूची)

 SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO SET ARITHABORT ON GO 

निम्नलिखित दो कथन एमएसडीएन से हैं – एसईटी एरीथैबर्ट

एआरआईएमटीएएमटीएआरएफ़ को बंद करने से क्यूरीज़ ऑप्टिमाइज़ेशन पर नकारात्मक प्रभाव पड़ सकता है जो कि प्रदर्शन समस्याओं के कारण होता है।

SQL सर्वर प्रबंधन स्टूडियो के लिए डिफ़ॉल्ट ARITHABORT सेटिंग चालू है ARITHABORT को बंद करने के लिए क्लाइंट एप्लिकेशन विभिन्न क्वेरी योजनाओं को प्राप्त कर सकता है जिससे खराब प्रदर्शन करने वाले प्रश्नों का निवारण करना कठिन हो जाता है यही है, एक ही क्वेरी प्रबंधन स्टूडियो में तेजी से निष्पादित कर सकता है लेकिन आवेदन में धीमा है।

समझने के लिए एक और दिलचस्प विषय Parameter Sniffing जैसा कि स्लो इन द एप्लिकेशन, एसएसएमएस में फास्ट में उल्लिखित है ? प्रदर्शन रहस्य को समझना – एरलैंड सोमरसोग द्वारा

यूनीकोड ​​इनपुट पैरामीटर का उपयोग करते हुए Varchar स्तंभों में रूपांतरण (आंतरिक) रूपांतरण के साथ एक और संभावना है, जैसा कि वर्चार कॉलम पर एसक्यूएल सूचकांक प्रदर्शन समस्या निवारण में उल्लिखित है – जिमी बोगर्ड द्वारा

अज्ञात के लिए अनुकूल है

SQL सर्वर 2008 और इसके बाद के संस्करण में, अज्ञात के लिए ऑप्टिमाइज़ करें। अज्ञात: निर्दिष्ट करता है कि क्वेरी ऑप्टिमाइज़र क्वेरी ऑप्टिमाइज़ेशन के दौरान एक स्थानीय चर के लिए मूल्य निर्धारित करने के लिए प्रारंभिक मान के बजाय सांख्यिकीय डेटा का उपयोग करता है।

विकल्प (RECOMPILE)

यदि "केवल रिकॉम्पिले" के साथ "विकल्प (RECOMPILE)" का उपयोग करें, यदि पुनः संयोजित करना एकमात्र समाधान है। यह पैरामीटर एम्बेडिंग ऑप्टिमाइज़ेशन में मदद करता है। पैरामीटर सूँघना, एम्बेडिंग और रीकाम विकल्प पढ़ें – पॉल व्हाइट द्वारा

सेट विकल्प

SET बाद के विकल्प योजना-पुन: उपयोग को प्रभावित कर सकते हैं, एमएसडीएन – एसक्यूएल सर्वर 2008 में योजना कैशिंग के आधार पर

  1. ANSI_NULL_DFLT_OFF 2. ANSI_NULL_DFLT_ON 3. ANSI_NULLS 4. ANSI_PADDING 5. ANSI_WARNINGS 6. ARITHABORT 7. CONCAT_NULL_YIELDS_NUL 8. DATEFIRST 9. DATE FORMAT 10. FORCEPLAN 11. LANGUAGE 12. NO_BROWSETABLE 13. NUMERIC_ROUNDABORT 14. QUOTED_IDENTIFIER

लगता है संभवतः पैरामीटर सूँघने से संबंधित है? क्या आपने वास्तव में क्लाइंट कोड को SQL सर्वर पर कैप्चर करने की कोशिश की है (सटीक कथन को पकड़ने के लिए प्रोफाइलर का उपयोग करें) तो प्रबंधन स्टूडियो में चलाएं?

पैरामीटर सूँघने: एसक्यूएल गरीब संग्रहीत प्रक्रिया निष्पादन योजना प्रदर्शन – पैरामीटर सूँघने

मैंने इसे पहले कोड में नहीं देखा है, केवल प्रक्रियाओं में, लेकिन यह एक नज़र है

आप अपना डेटा रीडर बंद नहीं कर रहे हैं – यह कई पुनरावृत्तियों पर जोड़ना शुरू कर सकता है …

मुझे एक अलग मूल कारण के साथ एक समस्या थी जो इस प्रश्न के लक्षणों के शीर्षक के अनुरूप बिल्कुल ठीक है

मेरे मामले में समस्या यह थी कि परिणाम सेट को एप्लिकेशन के। NET कोड द्वारा खुला रखा गया था, जबकि प्रत्येक लौटे हुए रिकॉर्ड के माध्यम से इसे खोला गया था और डेटाबेस के खिलाफ अन्य तीन प्रश्नों को निष्पादित किया गया था! कई हज़ार पंक्तियों से यह गुमराह करने वाला मूल क्वेरी बना दिया गया था जैसे कि SQL सर्वर से टाइमिंग जानकारी के आधार पर यह धीमा हो गया था।

इसलिए तय किया गया था कि कॉल करने के लिए एनएटीटी कोड को रिफैक्टर करना चाहिए ताकि प्रत्येक पंक्ति के प्रसंस्करण के दौरान परिणाम सेट ओपन को पकड़ न हो।

मुझे एहसास है कि ओपी ने संग्रहित प्रक्रियाओं का इस्तेमाल नहीं किया है, लेकिन पैरामीटर को सूँघने वाले मुद्दों का एक वैकल्पिक समाधान है, जब उन संग्रहित प्रक्रियाओं का उपयोग करते हैं जो कम सुरुचिपूर्ण हैं, लेकिन मेरे लिए काम किया है जब OPTION(RECOMPILE) कुछ भी करने के लिए प्रकट नहीं होता है

बस अपने पैरामीटर को प्रक्रिया में घोषित चर के लिए कॉपी करें और इसके बजाय उपयोग करें।

उदाहरण:

 ALTER PROCEDURE [ExampleProcedure] @StartDate DATETIME, @EndDate DATETIME AS BEGIN --reassign to local variables to avoid parameter sniffing issues DECLARE @MyStartDate datetime, @MyEndDate datetime SELECT @MyStartDate = @StartDate, @MyEndDate = @EndDate --Rest of procedure goes here but refer to @MyStartDate and @MyEndDate END 

मेरा सुझाव है कि आप एक संग्रहीत प्रक्रिया का प्रयास करें और बनायें – जो कि SQL सर्वर द्वारा संकलित और कैश किया जा सकता है और इस प्रकार प्रदर्शन को बेहतर बनाता है