2011-01-20 22 views
6

क्या कोई मुझे निम्नलिखित प्रश्नों के लिए SQL सर्वर निष्पादन योजना को समझने में सहायता कर सकता है?एसक्यूएल सर्वर स्केलर फ़ंक्शन बनाम सबक्वायरी निष्पादन योजना विश्लेषण

मुझे उम्मीद है कि सबक्वायरी संस्करण (क्वेरी 2) तेजी से निष्पादित करने के लिए, क्योंकि यह सेट-आधारित है। मामूली - - यह जब प्रश्नों स्वतंत्र रूप से चलाने का मामला प्रतीत होता है लेकिन कार्य योजना लागू करके 85% क्रमश: 15% बनाम के रूप में क्वेरी लागतों को दिखाता है:

//-- Query 1 (15%) - Scalar Function 
SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    dbo.GetGalleryImageVotesByGalleryImageId(gi.GalleryImageId) AS Votes 
FROM 
    GalleryImage gi 

//-- Query 2 (85%) - Subquery 
SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    (SELECT COUNT(*) FROM GalleryImageVote WHERE GalleryImageId = gi.GalleryImageId) 
FROM 
    GalleryImage gi 

मैं यहाँ क्या याद आ रही है; क्या फ़ंक्शन की लागत पर निष्पादन योजना छोड़ती है? इसके अलावा, उपरोक्त में से कोई भी सीटीई या ओवर/पार्टिशन क्वेरी के साथ बेहतर तरीके से सेवा के लिए कोई सुझाव देगा?

अग्रिम धन्यवाद!

+0

क्या आपके पास दोनों एक ही क्वेरी संपादक विंडो में थे? चूंकि क्वेरी विश्लेषक उनकी तुलना करेगा और विंडो में जो कुछ है (15%/85%) के लिए प्रत्येक सापेक्ष मूल्य असाइन करेगा। – JNK

+0

हां, यही वह जगह है जहां से% मान आया :) – Robarondaz

+0

क्वेरी निष्पादन समय हमेशा लागत के बराबर नहीं होता है। एसक्यूएल सर्वर वजन घटता प्रतीत होता है और एचडीडी से अधिक रैम उपयोग पढ़ता है। – jahu

उत्तर

6

निष्पादन योजना पर भरोसा न करें। यह एक बहुत ही आप देखते हैं कि क्या योजना हो जाएगा जाने के लिए उपयोगी है, लेकिन आप असली मैट्रिक्स चाहते हैं, हमेशा आँकड़े

set statistics io on 
set statistics time on 

..और वास्तविक फांसी तुलना पर बारी। आंकड़े कह सकते हैं कि उम्मीद 15%/85% है, लेकिन वास्तविकता आपको दिखाएगी कि वास्तव में इसका क्या अनुवाद है।

प्रदर्शन ट्यूनिंग के लिए कोई चांदी की बुलेट नहीं है। यहां तक ​​कि "सर्वोत्तम" प्रश्न समय के साथ बदल सकते हैं क्योंकि आपके डेटा के आकार या वितरण में परिवर्तन होता है।

सीटीई बहुत अलग नहीं होगा, और मुझे यकीन नहीं है कि आप इस पर पार्टिशन क्वेरी कैसे करने की योजना बना रहे हैं, लेकिन आप left join फ़ॉर्म को आजमा सकते हैं।

SELECT 
    gi.GalleryImageId, 
    gi.FbUserId, 
    count(v.GalleryImageId) AS Votes 
FROM 
    GalleryImage gi 
    LEFT JOIN GalleryImageVote v ON v.GalleryImageId = gi.GalleryImageId 
GROUP BY 
    gi.GalleryImageId, gi.FbUserId 
+0

चीयर्स, मुझे आंकड़ों के बारे में पता नहीं था। वास्तविक निष्पादन समय 265ms (क्वेरी 1) बनाम 2ms (क्वेरी 2) था; मूल रूप से अपेक्षित चीज़ों के मुकाबले बहुत कुछ! – Robarondaz

4

अनुकूलक फ़ंक्शन की लागत को नहीं जानता है।

आप सीपीयू देख सकते हैं और पढ़ता है और प्रोफाइलर हालांकि

कुछ संबंधित जवाब इसी तरह के सवाल से के माध्यम से अवधि कर सकते हैं। OneTwo

  • इनलाइन तालिका कार्यों मुख्य क्वेरी में विस्तार
  • अदिश (एक) और बहु ​​बयान तालिका कार्यों नहीं करते हैं और "बाहरी" क्वेरी के लिए ब्लैक बॉक्स हैं (वे विचारों की तरह मैक्रो नहीं है)
+0

आपकी मदद के लिए धन्यवाद! – Robarondaz

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