2009-07-07 8 views
8

मेरे पास एक दिलचस्प अंतर है। मेरे पास एक बहुत ही महंगी क्वेरी है जिसमें कई पूर्ण टेबल स्कैन और महंगे जुड़ने के साथ-साथ स्केलर यूडीएफ को कॉल करना शामिल है जो कुछ भू-स्थानिक डेटा की गणना करता है।SQLServer में कैश तालिका का उपयोग करके, क्या मैं पागल हूं?

अंतिम परिणाम एक परिणाम है जिसमें उपयोगकर्ता को प्रस्तुत किया गया डेटा होता है। हालांकि, मैं सबकुछ वापस नहीं कर सकता जिसे मैं उपयोगकर्ता को एक कॉल में दिखाना चाहता हूं, क्योंकि मैं मूल परिणाम को पृष्ठों में विभाजित करता हूं और केवल एक निर्दिष्ट पृष्ठ लौटाता हूं, और मुझे मूल संपूर्ण डेटासेट लेने की आवश्यकता होती है, और समूह द्वारा लागू होता है और जुड़ता है संबंधित कुल डेटा की गणना करने के लिए आदि।

लंबी कहानी छोटी, मुझे यूआई को आवश्यक सभी डेटा को बांधने के लिए, इस महंगी क्वेरी को लगभग 5-6 बार बुलाया जाना चाहिए।

तो, मैंने इस बारे में सोचना शुरू किया कि मैं एक बार इस महंगी क्वेरी की गणना कैसे कर सकता हूं, और फिर प्रत्येक बाद की कॉल कैश किए गए परिणाम सेट के खिलाफ किसी भी तरह खींच सकती है।

मैंने क्वेरी को संग्रहीत प्रक्रिया में सारणीबद्ध करने के विचार पर हिट किया जो कैशिड (ग्विड) को एक शून्य पैरामीटर के रूप में ले जाएगा।

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

यह स्पॉक्स को अनुमति देता है जिसे पिछले परिणाम से कैशआईड में पास करने के लिए इस परिणाम पर काम करने की आवश्यकता होती है और डेटा को पुनर्प्राप्त करने के लिए यह एक सरल चयन कथन है (कैशआईड पर एक WHERE क्लॉज के साथ)।

फिर, एक आवधिक SQL नौकरी का उपयोग करके, कैश तालिका को फ़्लश करें।

यह बहुत अच्छा काम करता है, और वास्तव में शून्य लोड परीक्षण पर चीजों को गति देता है। हालांकि, मुझे चिंता है कि इस तकनीक में कैश टेबल के खिलाफ बड़ी मात्रा में पढ़ने और लिखने के साथ लोड के तहत समस्या हो सकती है।

तो, लंबी कहानी छोटी, क्या मैं पागल हूँ? या यह एक अच्छा विचार है।

जाहिर है मुझे लॉक विवाद, और सूचकांक विखंडन के बारे में चिंतित होने की आवश्यकता है, लेकिन किसी और चीज के बारे में चिंतित होना चाहिए?

उत्तर

3

मैंने पहले ऐसा किया है, खासकर जब मेरे पास एप्लिकेशन को संपादित करने के लिए लक्जरी नहीं था। मुझे लगता है कि यह कभी-कभी एक वैध दृष्टिकोण है, लेकिन आम तौर पर एप्लिकेशन में कैश/वितरित कैश होने पर प्राथमिकता दी जाती है, क्योंकि इससे डीबी पर लोड कम हो जाता है और बेहतर पैमाने पर स्केल होता है।

बेवकूफ "बस इसे एप्लिकेशन में करें" समाधान के साथ मुश्किल बात यह है कि कई बार आपके पास डीबी के साथ कई अनुप्रयोगों का सहभागिता होता है जो आपको बाध्य कर सकता है यदि आपके पास कोई एप्लिकेशन मैसेजिंग बस नहीं है (या कुछ ऐसा है memcached), क्योंकि प्रति आवेदन एक कैश रखने के लिए महंगा हो सकता है।

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

+0

फिर मुझे ऐप पर हजारों परिणाम पाइप करना होगा? – FlySwat

+0

विस्तृत करने के लिए, मैं इस डेटा पर बहुत से SQL संचालन करता हूं, और केवल ऐप को परिणाम भेजता हूं। तो ऐप में कैशिंग प्रतिकूल होगा। – FlySwat

+0

@FlySwat, मुझे लगता है कि इसके लिए मध्यस्थता शुरू करने पर विचार करने लायक हो सकता है, जब भी आप लंबी दौड़ वाली रिपोर्ट निष्पादित करते हैं, तो आप अपनी डीबी को फिट में नहीं भेजना चाहते हैं, मध्य में सेवा करने से आपको क्षमता मिल जाएगी थ्रॉटल और डीबी –

1

आपका tempdb लोड के नीचे पागल की तरह गुब्बारा सकता है, इसलिए मैं इसे देखता। प्रत्येक उपयोगकर्ता के लिए तालिका को कैश करने की कोशिश करने से महंगा दृश्यों को देखने और दृश्य को इंडेक्स करना आसान हो सकता है।

+0

परिणाम बहुत मनमानी हैं और बहुत सारे इनपुट पैरामीटर पर आधारित हैं, इसलिए दृश्य बहुत बड़ा होगा। यह मेरा पहला विचार भी था, लेकिन मुझे एहसास हुआ कि ऐसा करने के लिए दृश्य को लाखों पंक्तियों की आवश्यकता होगी। – FlySwat

+1

@ फ्लाईवे, पंक्तियों में से लाखों की आवश्यकता यह नहीं है कि खराब है। विशेष रूप से यदि दिन के अंत में आप डीबी पर लोड को बेहतर तरीके से वितरित कर रहे हैं और समग्र रूप से इसे कम कर रहे हैं। –

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