2013-03-07 4 views
5

मेरे पास एक प्रश्न है जो पूर्ण जॉइन के साथ 2.5 सेकंड लेता है, और INNER, दाएं या बाएं जॉइन के साथ 40 सेकंड लेता है।एक पूर्ण नौकरी से INNER/दाएं/बाएं जॉइन 14x धीमी गति से कैसे हो सकता है?

यहां प्रश्न है। सबक्वायरी (दो बार किया गया) केवल अपने आप 1.3 सेकंड लेता है। दिनांक समय से बाहर एम.एम. स्ट्रिंग:

SELECT T1.[time], T1.Total, T1.rn, T2.[time], T2.Total, T2.rn 
FROM 
(
select [time], MAX(ComputedValue) as Total, row_number() over (order by [time]) as rn 
FROM 
(
    select SUBSTRING(CONVERT(CHAR(10), IntervalStartTime, 108), 0, 6) as [time], ComputedValue 
    from LoadTestTransactionSample 
    where LoadTestRunId=285 
    and CounterName='Total Transactions' 
    and TransactionName='Export' 
) foo 
group by [time] 
) T1 
_____ JOIN 
(
select [time], MAX(ComputedValue) as Total, row_number() over (order by [time]) as rn 
FROM 
(
    select SUBSTRING(CONVERT(CHAR(10), IntervalStartTime, 108), 0, 6) as [time], ComputedValue 
    from LoadTestTransactionSample 
    where LoadTestRunId=285 
    and CounterName='Total Transactions' 
    and TransactionName='Export' 
) foo 
group by [time] 
) T2 
ON T1.rn = T2.rn - 1 

select SUBSTRING बिट सिर्फ एक एचएच हो रही है। LoadTestTransactionSample वास्तव में एक दृश्य है जो 8 टेबल में शामिल हो जाता है। (एफवाईआई डेटाबेस एक विजुअल स्टूडियो लोड टेस्ट परिणाम स्टोर है)। यहाँ अपने (प्रासंगिक) स्तंभ हैं:

LoadTestRunId INT NOT NULL 
CounterName NVARCHAR(255) NOT NULL 
TransactionName NVARCHAR(64) NOT NULL 
IntervalStartTime DATETIME NOT NULL 
IntervalEndTime DATETIME NOT NULL 
ComputedValue REAL 

एक पूर्ण शामिल हों रिटर्न एक अतिरिक्त अवांछित पंक्ति, तो मैं सही जवाब पाने के लिए एक सही क्या करना चाहिए में शामिल हों।

मैं वास्तव में एक समाधान के लिए नहीं देख रहा हूँ (मैं एक है: प्री-फ़ेच एक मेज चर उपयोग एसक्यूएल सर्वर में 2012 विश्लेषणात्मक समारोह 'अंतराल', धन्यवाद @ a1ex07 सबक्वेरी), बस कुछ के रूप में समझ पर इन प्रकारों के प्रकार के बीच प्रदर्शन में चरम अंतर का कारण बन सकता है।


संपादित करें: यहाँ slow right join query plan और fast full join query plan है। स्क्रीनशॉट पोस्ट करने के लिए वे बहुत बड़े हैं।

संपादित करें 2: असल में क्वेरी योजनाओं का अधिकार है 45% में शामिल हों और पूर्ण 55% है, जो पूरी तरह से पता चला है गलत हो पर JOIN (वास्तविकता में यह भी बदतर 99%/1% समाप्त होता है)। मुझे लगता है कि इसका मतलब है कि मुझे वास्तविक निष्पादन आंकड़ों पर भरोसा करना है।

संपादित करें 3: धीमी गति से सही के लिए सांख्यिकी शामिल हों:

(40 row(s) affected) 
Table 'LoadTestPerformanceCounterCategory'. Scan count 0, logical reads 37556, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounter'. Scan count 0, logical reads 176464, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestScenario'. Scan count 0, logical reads 176464, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestCase'. Scan count 0, logical reads 176464, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'WebLoadTestTransaction'. Scan count 0, logical reads 13411100, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterInstance'. Scan count 0, logical reads 36563718, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterSample'. Scan count 19721, logical reads 269657, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestRunInterval'. Scan count 41, logical reads 205, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 36754 ms, elapsed time = 36763 ms. 

सांख्यिकी के लिए तेजी से पूर्ण शामिल हों:

(41 row(s) affected) 
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterCategory'. Scan count 0, logical reads 1832, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounter'. Scan count 0, logical reads 8608, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestScenario'. Scan count 0, logical reads 8608, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestCase'. Scan count 0, logical reads 8608, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'WebLoadTestTransaction'. Scan count 0, logical reads 654200, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterInstance'. Scan count 0, logical reads 1783596, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestPerformanceCounterSample'. Scan count 962, logical reads 13154, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 
Table 'LoadTestRunInterval'. Scan count 2, logical reads 10, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 1950 ms, elapsed time = 1944 ms. 

अधिकार में शामिल होने के बड़े पैमाने पर अधिक पढ़ता है और अधिक से अधिक स्कैन कर रहा है एक स्पष्ट रूप से समान प्रश्न योजना के बावजूद पूर्ण जॉइन।

कार्यबल (पूर्ण जॉइन में) एक संकेत है? क्या यह एक अस्थायी मेज है?

क्या ऐसा लगता है कि क्वेरी ऑप्टिमाइज़र टूटा हुआ है?

+1

पर आपकी क्वेरी योजना/आंकड़े दिखाते हैं निर्धारित करें और देखें [शर्म से सिर छुपाता है]। डीडीएल स्क्रिप्ट को आपकी स्कीमा और डेटा को दोहराने में सक्षम होने के बिना, कोई भी जवाब मूल रूप से एक अनुमान है। साथ ही, क्या ये प्रदर्शन आंकड़े बाद के प्रश्नों के अनुसार पहली क्वेरी पर अलग हैं? यह एक संकेत है कि आपका कैश शामिल हो रहा है। – Heather

+1

मुझे लगता है कि हीदर का मतलब है कि आप उन्हें 1-2-3-4 और फिर 4-3-2-1 चलाने के लिए कहें और –

+1

की तुलना करें, इसके अलावा, क्वेरी का प्रत्येक संस्करण कैश में अपनी क्वेरी योजना उत्पन्न करता है, और ये आवश्यक नहीं हैं एक ही समय में ताज़ा किया। यह कभी-कभी प्रदर्शन conundrums का कारण बन सकता है। –

उत्तर

2

ठीक है, यह पता चला है कि उत्तर है: खराब डीबी आंकड़े। बहुत बुरा। जैसा कि, अद्यतन नहीं किया गया था।

exec sp_updatestats; एफटीडब्ल्यू।

1

यह समान प्रश्नों के लिए निष्पादन योजना है। टेबल्स बहुत छोटे हैं।

Execution Plan

क्वेरी 1:

  • INNER JOIN उपयोग करता है।
  • निष्पादन योजना छोटी दिखती है।
  • हालांकि, कुल समय का 62% लगता है।

क्वेरी 2:

  • FULL JOIN उपयोग करता है।
  • निष्पादन योजना बड़ी दिखती है।
  • हालांकि, कुल समय का 38% लगता है।

कारण: अंदरूनी मेरे मामले में शामिल हों HASH मैच उपयोग कर रहा है। और पूर्ण जॉइन नेस्टेड लूप का उपयोग कर रहा है। यह एसक्यूएल ऑप्टिमाइज़र द्वारा तय किया जाता है कि कौन सा भौतिक शामिल होना चाहिए (हालांकि हम इसके लिए अन्य भौतिक शामिलियों का उपयोग कर सकते हैं)। अपनी निष्पादन योजना की जांच करें, इससे मदद मिलेगी।

+1

किया गया है आप उन तालिकाओं पर कुछ अनुक्रमणिका से लाभान्वित होंगे। – DaveShaw

+0

@ डेवशॉ: हाँ यह सही है। –

+0

@RaviSingh: आश्चर्यजनक रूप से, ऐसा लगता है कि क्वेरी योजना निष्पादन से मेल नहीं खाती है! मेरे संपादन देखें - योजना सही जॉइन बनाम पूर्ण जॉइन के लिए 45%/55% अनुपात की अपेक्षा करती है, लेकिन निष्पादन 99%/1% में हुआ। – agentnega

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