मुझे प्रदर्शन में सुधार करने के लिए काम किया गया है (और यह मेरा पहला वास्तविक-दुनिया प्रदर्शन ट्यूनिंग है) एक एसएसआरएस फ्रंट-एंड द्वारा संग्रहीत रिपोर्टिंग प्रक्रिया के लिए और संग्रहीत प्रक्रिया में वर्तमान में लगभग 30 सेकंड लगते हैं डेटा की सबसे बड़ी मात्रा (रिपोर्ट फ्रंटेंड से सेट फ़िल्टर के आधार पर) पर चलाएं।संग्रहीत प्रक्रिया निष्पादन समय की रिपोर्टिंग में सुधार - अस्थायी तालिकाओं को ट्यून करना?
इस संग्रहीत प्रक्रिया में 1 9 प्रश्नों का निष्पादन टूट गया है, जिनमें से अधिकांश बेस टेबल के अंदर से प्रारंभिक (विरासत) प्रारूप से डेटा को व्यावसायिक साइड में प्रदर्शित होने के लिए एक सार्थक डेटासेट में बदल रहे हैं।
मैंने कुछ डीएमवी के आधार पर एक क्वेरी बनाई है ताकि यह पता चल सके कि संग्रहीत प्रक्रिया (नीचे छोटे स्निपेट) से सबसे अधिक संसाधन लेने वाले प्रश्न कौन से हैं और मुझे एक क्वेरी मिली है जिसमें लगभग 10 सेकंड लगते हैं औसत, पूरा करने के लिए।
select
object_name(st.objectid) [Procedure Name]
, dense_rank() over (partition by st.objectid order by qs.last_elapsed_time desc) [rank-execution time]
, dense_rank() over (partition by st.objectid order by qs.last_logical_reads desc) [rank-logical reads]
, dense_rank() over (partition by st.objectid order by qs.last_worker_time desc) [rank-worker (CPU) time]
, dense_rank() over (partition by st.objectid order by qs.last_logical_writes desc) [rank-logical write]
...
from sys.dm_exec_query_stats as qs
cross apply sys.dm_exec_sql_text (qs.sql_handle) as st
cross apply sys.dm_exec_text_query_plan (qs.plan_handle, qs.statement_start_offset, qs.statement_end_offset) as qp
where st.objectid in (object_id('SuperDooperReportingProcedure'))
, [rank-execution time]
, [rank-logical reads]
, [rank-worker (CPU) time]
, [rank-logical write] desc
अब, यह क्वेरी कार्य योजना लागू करके पता चलता है कि पता चलता है कि काम (~ 80%) के थोक किया जाता है जब जब नहीं स्थानीय अस्थायी तालिका में डेटा डालने और अर्थ में थोड़ा अजीब है उन अन्य तालिकाओं से पूछताछ करें जिनसे स्रोत डेटा लिया जाता है और फिर छेड़छाड़ की जाती है। अर्थ में (नीचे स्क्रीनशॉट एसक्यूएल संतरी योजना एक्सप्लोरर से है)
इसके अलावा, पंक्ति अनुमान के मामले में, कार्य योजना लागू करके इस के लिए जिस तरह से बंद अनुमान है, केवल 4218 स्थानीय में डाला पंक्तियों देखते हैं कि अस्थायी तालिका ~ 248k पंक्तियों के विपरीत है कि निष्पादन योजना स्थानीय अस्थायी तालिका में जाने के बारे में सोचती है। तो, इसके कारण, मैं "आंकड़े" सोच रहा हूं, लेकिन फिर भी उन लोगों को भी कोई फर्क नहीं पड़ता कि काम का 80% वास्तविक तालिका में डालने वाला है?
मेरी पहली सिफारिशों में से एक पूरी प्रक्रिया और संग्रहीत प्रक्रिया को दोबारा लिखना था ताकि डेटा की चलती प्रक्रिया को रिपोर्टिंग प्रक्रिया में बदलना और बदलना शामिल न हो और डेटा को कुछ स्थिर तालिकाओं में रात में बदलने के लिए (रीयल-टाइम डेटा की आवश्यकता नहीं है, केवल पिछले दिन के अंत तक प्रासंगिक डेटा)। लेकिन व्यावसायिक पक्ष समय और संसाधनों को फिर से डिजाइन करने के लिए निवेश नहीं करना चाहता है और इसके बजाय "सुझाव देता है" मैं यह जानने के अर्थ में प्रदर्शन ट्यूनिंग करता हूं कि मैं इसे और कहां जोड़ सकता हूं।
मुझे विश्वास नहीं है कि बेस टेबल पर इंडेक्स जोड़ने से रिपोर्ट के प्रदर्शन में सुधार होगा क्योंकि क्वेरी चलाने के लिए आवश्यक अधिकांश समय डेटा को एक अस्थायी तालिका में सहेज रहा है (जो मेरे ज्ञान से यह tempdb को हिट करेगा, जिसका अर्थ है कि उन्हें डिस्क पर लिखा जाएगा -> I/O विलंबता के कारण बढ़ी हुई समय)।
लेकिन, जैसा कि मैंने उल्लेख किया है, यह मेरा पहला प्रदर्शन ट्यूनिंग कार्य है और मैंने पिछले कुछ दिनों में जितना संभव हो सके इसे पढ़ने की कोशिश की है और ये मेरे निष्कर्ष अब तक हैं, लेकिन मैं व्यापक दर्शकों से सलाह मांगना चाहता हूं और आशा करता हूं कि इस प्रक्रिया को बेहतर बनाने के लिए मैं कुछ और अंतर्दृष्टि और समझ प्राप्त कर सकता हूं।
में कुछ स्पष्ट सवाल है, तो जवाब हो सकता है मैं इसकी सराहना करेंगे के रूप में कर रहे हैं:
- क्या क्या मैं ऊपर कहा है में गलत (db या मेरे मान्यताओं की मेरी समझ में) है?
- क्या यह सच है कि एक अस्थायी तालिका में एक इंडेक्स जोड़ने से वास्तव में निष्पादन का समय बढ़ जाएगा, क्योंकि तालिका (और इसके संबंधित इंडेक्स (एसएस) को प्रत्येक निष्पादन पर पुनर्निर्मित किया जा रहा है)?
- क्या इस परिदृश्य में प्रक्रिया/प्रश्नों को दोबारा लिखने के बिना और कुछ भी किया जा सकता है और केवल इंडेक्स या अन्य ट्यूनिंग विधियों के माध्यम से किया जा सकता है? (मैंने कुछ लेख शीर्षकों को पढ़ा है कि आप "tempdb को भी ट्यून कर सकते हैं", लेकिन मुझे अभी तक उन विवरणों में शामिल नहीं किया गया है)।
किसी भी मदद की बहुत सराहना की जाती है और यदि आपको अधिक जानकारी चाहिए तो मुझे पोस्ट करने में खुशी होगी।
अद्यतन (2 अगस्त 2016):
प्रश्न में क्वेरी (आंशिक रूप से) नीचे है।
select
b.ProgramName
,b.Region
,case when b.AM IS null and b.ProgramName IS not null
then 'Unassigned'
else b.AM
end as AM
,rtrim(ltrim(b.Store)) Store
,trd.Store_ID
,b.appliesToPeriod
,isnull(trd.countLeadActual,0) as Actual
,isnull(sum(case when b.budgetType = 0 and b.budgetMonth between @start_date and @end_date then b.budgetValue else 0 end),0) as Budget
,isnull(sum(case when b.budgetType = 0 and b.budgetMonth between @start_date and @end_date and (trd.considerMe = -1 or b.StoreID < 0) then b.budgetValue else 0 end),0) as CleanBudget
...
into #SalvesVsBudgets
from #StoresBudgets b
left join #temp_report_data trd on trd.store_ID = b.StoreID and trd.newSourceID = b.ProgramID
where (b.StoreDivision is not null or (b.StoreDivision is null and b.ProgramName = 'NewProgram'))
group by
b.ProgramName
,b.Region
,case when b.AM IS null and b.ProgramName IS not null
then 'Unassigned'
else b.AM
end
,rtrim(ltrim(b.Store))
,trd.Store_ID
,b.appliesToPeriod
,isnull(trd.countLeadActual,0)
मुझे यकीन है कि अगर यह वास्तव में उपयोगी है नहीं कर रहा हूँ, लेकिन जब से @kcung यह अनुरोध किया है, मैं जानकारी कहा: क्या याद आ रही है कुछ और कुल कॉलम और GROUP BY
अनुभाग में उनकी संगत लाइनें हैं।
इसके अलावा, कुछ उसके सवालों का जवाब करने के लिए:
- अस्थायी तालिकाओं उन पर कोई अनुक्रमणिका है
- रैम का आकार: 32 जीबी
अद्यतन (3 अगस्त 2016):
मैंने कुल-उत्पन्न क्वेरी और दुर्भाग्य से CASE
कथन को स्थानांतरित करने के लिए @ kcung के सुझावों का प्रयास किया है कुल मिलाकर, कुल मिलाकर, प्रक्रिया समय में सुधार नहीं हुआ है, ध्यान में, क्योंकि यह अभी भी ± 0.25 से ± 1.0 सेकंड की सीमा में उतार-चढ़ाव करता है (हां, संग्रहित प्रक्रिया के मूल संस्करण की तुलना में निचला और उच्च समय दोनों - लेकिन मैं इसका अनुमान लगा रहा हूं मेरी मशीन पर परिवर्तनीय वर्कलोड के कारण है)।
समान क्वेरी के लिये कार्य योजना है, लेकिन केवल SUM
समुच्चय छोड़ने CASE
की स्थिति को दूर करने के लिए संशोधित, अब है:
1. अधिक जानकारी के साथ प्रश्नों को अपडेट किया गया। –
2. अस्थायी तालिकाओं पर कोई अनुक्रमणिका नहीं। –
4. क्या आप यहां पृष्ठ विखंडन के बारे में सोच रहे हैं? –