2013-01-09 29 views
5

में एसक्यूएल सर्वर प्रदर्शन शुरू करने से पहले, मैंने पिछले प्रदर्शन मुद्दे के बारे में कई पोस्ट पढ़ी हैं, लोगों ने एसडीएमएस में एडीओ बनाम एसक्यूएल कथन/प्रक्रियाओं को निष्पादित किया है। मैंने इस समस्या को हल करने की कोशिश कर रहे दिन का बेहतर हिस्सा बिताया है ... रीइंडेक्सिंग, sp_recompile का उपयोग करके, मेरी प्रक्रिया में Option(Recompile) जोड़ रहा है। कुछ भी काम नहीं किया है, इसलिए मैं सहायता के लिए समुदाय में बदल रहा हूं।एडीओ.NET बनाम एसएसएमएस

मेरे पास एक संग्रहीत प्रक्रिया है कि मेरे वेब अनुप्रयोगों में से एक रिपोर्ट चलाने के लिए निष्पादित करता है। यह प्रक्रिया विशेष रूप से गतिशील एसक्यूएल से बना है ताकि विभिन्न रिपोर्ट परिणामों को वापस आ सकें ... मेरी साइट पर एक गतिशील रिपोर्टिंग सुविधा का प्रकार। किसी भी तरह, कुछ रिपोर्ट चलायी जा सकती हैं (उसी प्रक्रिया का उपयोग करके) और परिणाम लगभग तुरंत वापस आते हैं। हालांकि, अन्य विकल्पों का उपयोग किया जा सकता है और प्रक्रिया को चलाने में कई मिनट लग सकते हैं। हालांकि, एसएसएमएस में उन विकल्पों के साथ मैन्युअल रूप से प्रक्रिया को चलाने से तत्काल परिणाम मिलते हैं। यह किसी प्रकार की योजना कैशिंग समस्या की तरह लगता है, लेकिन प्रक्रिया को पुन: संकलित करने और WITH(RECOMPILE) जोड़ने के बाद, यह अभी भी ADO.NET में डरावनी धीमी गति से चल रहा है।

इसलिए मैंने एसक्यूएल प्रोफाइल देखना शुरू कर दिया, शायद "एसईटी" आदेशों में से एक एडीओ का उपयोग कर रहा है जिससे समस्या उत्पन्न हो रही है। हालांकि, एक ही सटीक एसईटी कमांड का उपयोग करने के बाद भी यह एसएसएमएस का उपयोग कर लगभग तुरंत लौटता है।

मैंने किसी भी संग्रहीत योजना को साफ़ करने के लिए DBCC freeproccache और DBCC freesystemcache का उपयोग करने का प्रयास किया, हालांकि इससे भी मदद नहीं मिली।

मैंने कोशिश की एक और चीज गतिशील एसक्यूएल ले रही थी जो प्रक्रिया में उत्पन्न होती है और इसे सीधे SQLLommand कथन में चलाती है। यहां कोई पैरामीटर नहीं है, बस सादा एसक्यूएल। फिर यह एसएसएमएस में तुरंत चलता है लेकिन एडीओ.NET में हमेशा के लिए लेता है।

क्या उत्पन्न होने वाली योजना देखने के लिए कोई तरीका है (ADO.NET चल रहा है)? मैं एसएसएमएस में ऐसा कर सकता हूं, हालांकि यह मेरी मदद नहीं करेगा क्योंकि यह एसएसएमएस में ठीक है।

यह किसी भी मदद की है, यहां कच्चे एसक्यूएल बयान है ...

SELECT sf.ID [FileID], sb.ID [BillID], sb.Client_BillID, sf.BobID [ClientID], c.Name [ClientName], c.Parent_ID [ParentID], pnt.Name [ParentName], Network_ID, Facility_Name, OON, sb.TaxID, Inpatient, sf.ProcessDate, sb.Reversed, sb.State, sb.Product, sb.FormType, n.Direct 
INTO #t1 FROM SubmitterFiles sf WITH(NOLOCK) 
INNER JOIN SubmitterBills sb WITH (NOLOCK) ON sf.ID = sb.FileID 
LEFT JOIN PPORecords r WITH (NOLOCK) ON sb.RecordID = r.ID 
LEFT JOIN PPONetworks n WITH (NOLOCK) ON r.Network_ID = n.ID 
LEFT JOIN PPOProviders p WITH (NOLOCK) ON r.Provider_ID = p.ID 
INNER JOIN Clients c WITH (NOLOCK) ON sf.BobID = c.ID 
LEFT JOIN Clients pnt WITH (NOLOCK) ON c.Parent_ID = pnt.ID 
WHERE sf.ProcessDate BETWEEN 'Dec 1 2012 12:00AM' and 'Dec 31 2012 12:00AM' 
AND ISNULL(sb.Status,'') NOT IN ('E','V') 
AND (c.Parent_ID IN (1989) or c.ID IN (1989)) 
; 

SELECT TOP 100 0 as [placeholder],NULL AS BillID, NULL AS Client_BillID, NULL AS DOS 
,NULL AS Network_ID 
,NULL AS Client_ID 
,NULL AS Client_Name 
,NULL As ProcessDate 
,NULL As ProcessMonth 
,NULL AS SubClientID 
,NULL AS SubClientName 
,Product 
,TaxID 
, FacilityName 
, LastName 
, FirstName 
,State 
,County 
,NULL As ProcCode 
,NULL As FormType 
,NULL As Inpatient, NULL AS Outpatient 
,COUNT(DISTINCT sb.BillID) AS [Total_Bills] 
,SUM(sl.Amount) AS [Total_Charges] 
,SUM(sl.StateSavings) AS [Total_StateSavings] 
,SUM(sl.PPOSavings) AS [Total_PPOSavings] 
,COUNT(DISTINCT TaxID) AS [Total_Unique_TaxIds] 
,0,0,0,0,0 
,COUNT(DISTINCT CASE WHEN sb.OON = 1 THEN sb.BillID ELSE NULL END) AS [Out_Bills] 
,SUM(CASE WHEN sb.OON = 1 THEN sl.Amount ELSE 0 END) AS [Out_Charges] 
,SUM(CASE WHEN sb.OON = 1 THEN sl.StateSavings ELSE 0 END) AS [Out_StateSavings] 
,COUNT(DISTINCT CASE WHEN sb.OON = 1 THEN sb.TaxID ELSE NULL END) AS [Out_Unique_TaxIds] 
,0,0,0,0,0 
,0,0,0,0,0 
FROM SubmitterLines sl WITH (NOLOCK, INDEX(IX_SubmitterLines_BillID)) 
INNER JOIN #t1 sb WITH(NOLOCK) ON sl.BillID = sb.BillID 
INNER JOIN SubmitterBillProviders sbp WITH(NOLOCK) ON sb.BillID = sbp.ID 
INNER JOIN SubmitterBillZipCounty sbc WITH(NOLOCK) ON sb.BillID = sbc.ID 
WHERE 1 = 1 
GROUP BY Product 
,TaxID 
,FacilityName, LastName, FirstName 
,State 
,County 
ORDER BY [Out_Bills] DESC 
+2

टैग 'ADO.NET' शीर्षक में 'एडीओ' शीर्षक में। कृपया सही करें। –

+1

मैं दृढ़ता से आपके स्पोक में गतिशील एसक्यूएल को मिटाने का सुझाव देता हूं, अन्यथा निष्पादन योजना हमेशा कार्य के लिए उप-अनुकूल होगी। एसक्यूएल स्केलर फ़ंक्शंस को निष्पादित करने में अच्छी तरह से योजना नहीं बना सकता है, इस प्रकार गतिशील एसक्यूएल हमेशा आश्चर्यचकित होगा और सिस्टम को इसके निष्पादन को अनुकूलित करने में कठिनाई होगी। –

+1

डार्थ - डायनामिक एसक्यूएल की जगह है। मुझे पता है कि यह इष्टतम नहीं होने वाला है, हालांकि यह वर्तमान मुद्दे का कारण प्रतीत नहीं होता है। एसक्यूएल निकालने और निष्पादन अभी भी इस मुद्दे को पुन: उत्पन्न करता है। – Brosto

उत्तर

0

आप इस अतः थ्रेड को देखा है? SQL Server query runs slower from ADO.NET than in SSMS

स्वीकृत उत्तर में सुझाए गए अनुसार एक्सप्लोर एक्सएमएल इवेंट क्लास, क्या काम कर सकता है?

1

यह उन समस्याओं में से एक था जो मुझे कल रात रखती थी इसलिए मैंने सब कुछ फिर से शुरू करना शुरू कर दिया। आखिरकार मुझे मारा कि एसएसएमएस में, मेरे पास मेरी डिफ़ॉल्ट पंक्ति गणना 1000 पर सेट है। जब मैं एसक्यूएल प्रोफाइलर में ट्रेस चलाता हूं तो मुझे किस प्रकार की बग होती है, यह अन्य एसईटी के साथ दिखाई नहीं देती है। ROWCOUNT को 0 पर सेट करने से मुझे एसएसएमएस में इसे पुन: उत्पन्न करने की इजाजत मिलती है, जिससे मुझे निष्पादन योजना देखने और समस्या को ठीक करने के लिए समस्या को ठीक करने की अनुमति मिलती है।

दिन के अंत में, यह एडीओ मुद्दा नहीं था - यह एक ऐसी सेटिंग थी जिसे मैंने एसएसएमएस में रखा था, जो कि आम तौर पर लौटने वाली पंक्तियों की संख्या को सीमित करने के लिए करता था। चूंकि मेरी क्वेरी का हिस्सा एक बड़े परिणाम सेट की एक अस्थायी तालिका बनाता है, इसलिए अस्थायी तालिका केवल 1000 पंक्तियों के साथ आबादी में थी।

+1

यहां से भविष्य के पाठकों के लिए संबंधित नोट http://msdn.microsoft.com/en-us/library/ms188774.aspx: स्पष्ट रूप से माइक्रोसॉफ्ट एसक्यूएल सर्वर के भावी रिलीज में इसके बारे में कुछ बदलाव कर रहा है: "SET ROWCOUNT का उपयोग प्रभावित नहीं करेगा SQL सर्वर की अगली रिलीज में हटाएं, INSERT, और अद्यतन विवरण। नए विकास कार्य में DELETE, INSERT, और अद्यतन विवरणों के साथ SET ROWCOUNT का उपयोग करने से बचें, और वर्तमान में इसका उपयोग करने वाले अनुप्रयोगों को संशोधित करने की योजना बनाएं। " – Kprof

+0

@Kprof - इसे इंगित करने के लिए धन्यवाद। – Brosto