2008-09-02 15 views
9

मैं अकसर (मासिक/त्रैमासिक) माइक्रोसॉफ्ट एसक्यूएल सर्वर 2005 डेटाबेस दृश्यों का उपयोग कर सैकड़ों क्रिस्टल रिपोर्ट रिपोर्ट उत्पन्न करता हूं। क्या उन विचारों के दौरान सीपीयू चक्र और रैम बर्बाद कर रहे हैं जब मैं उनसे नहीं पढ़ रहा हूं? क्या मुझे बदले में संग्रहीत प्रक्रियाओं, अस्थायी तालिकाओं, या अल्पकालिक सामान्य टेबल का उपयोग करना चाहिए क्योंकि मैंने शायद ही कभी मेरे विचारों से पढ़ा है?क्या यह बहुत सारे डेटाबेस विचारों को ठीक है?

मैं डीबीए नहीं हूं इसलिए मुझे नहीं पता कि डेटाबेस सर्वर के अंदर दृश्यों के पीछे क्या चल रहा है।

क्या आपके पास बहुत सारे डेटाबेस दृश्य हैं? सबसे अच्छा अभ्यास क्या माना जाता है?

उत्तर

8

अधिकांश भाग के लिए, इससे कोई फर्क नहीं पड़ता। हां, एसक्यूएल सर्वर में अधिक विकल्प होंगे जब यह तालिका से चयन करें (इसे 'टेबल' के लिए सिस्टम कैटलॉग में देखना होगा) लेकिन इसके लिए यह अत्यधिक अनुकूलित है, और बशर्ते आपके पास पर्याप्त रैम है (आजकल अधिकांश सर्वर) , आपको 0 और 1,000 विचारों के बीच कोई अंतर नहीं दिखाई देगा।

हालांकि, लोगों-परिप्रेक्ष्य से, प्रबंधन करने और यह पता लगाने की कोशिश कर रहा है कि "सैकड़ों" विचार क्या कर रहे हैं, शायद असंभव है, इसलिए आपके पास वहां बहुत अधिक डुप्लिकेट कोड हो सकता है। क्या होता है यदि कुछ व्यवसाय नियम बदलते हैं जो इन अनावश्यक विचारों में एम्बेडेड होते हैं?

विचारों का मुख्य बिंदु व्यापार तर्क को एक छद्म तालिका में समाहित करना है (इसलिए आपके पास एक व्यक्ति तालिका हो सकती है, लेकिन फिर "active_persons" नामक एक दृश्य जो कुछ जादू करता है)। प्रत्येक रिपोर्ट के लिए एक दृश्य बनाना मूर्खतापूर्ण है जब तक कि प्रत्येक रिपोर्ट इतनी अलग और अनूठी न हो कि पुन: उपयोग करने की कोई क्षमता नहीं है।

1

विचार केवल सीपीयू/मेमोरी संसाधनों को लेने के लिए जा रहे हैं जब उन्हें बुलाया जाता है।

किसी भी तरह, सर्वोत्तम अभ्यास को समेकित करने के लिए समेकित किया जाएगा, जिसे हटाया जा सकता है, और यदि यह सचमुच केवल आपकी रिपोर्ट द्वारा उपयोग किया जाता है, तो विचारों के लिए एक सतत नामकरण मानक चुनें ताकि उन्हें आसानी से एक साथ समूहीकृत किया जा सके एक विशेष दृश्य के लिए।

इसके अलावा, जब तक आपको वास्तव में लेनदेन अलगाव की आवश्यकता न हो, तो अपने प्रश्नों में NOLOCK तालिका संकेत का उपयोग करने पर विचार करें।

- केविन फेयरचाइल्ड

+0

मैं उत्तर से सहमत हूं, लेकिन NOLOCK सुझाव के साथ नहीं। मैं बहुत सारे लोगों को सिर्फ हर जगह NOLOCK डाल रहा हूं और फिर सोच रहा हूं कि वे स्थिरता के मुद्दों क्यों हैं। इस तरह के खंड में इसका उपयोग होता है, लेकिन अधिकांश समय से इसका दुरुपयोग होता है, मैं इसे "बस इतना" उपयोग करने की अनुशंसा नहीं करता। लॉकिंग से बचने के लिए READ_COMMITTED_SNAPSHOT का उपयोग करना एक बेहतर विकल्प होगा। – Diego

+0

@ डिएगो, * कुछ भी * का दुरुपयोग किया जा सकता है;) लेकिन सरल प्रश्नों के लिए, विशेष रूप से जब आप पूरी तरह से गंदे पढ़ने की परवाह नहीं करते हैं, तो यह वास्तव में उतना बुरा नहीं है जितना लोग इसे बाहर करते हैं। बिल्ली, StackOverflow भी इसके कई प्रश्नों पर इसका उपयोग करता है। यह भी देखें: http://www.codinghorror.com/blog/2008/08/deadlocked.html और http://stackoverflow.com/a/1453087/3743 दिन के अंत में, हालांकि, यह एक निर्णय कॉल है। .. और आपके डेटा पर आधारित होना चाहिए और आप कौन से संभावित व्यापार-बंद करना चाहते हैं। –

+0

यह सच है, इस तरह से बहुत से लोग नोलोक को पवित्र अंगूर के रूप में देखते हैं जो उनके द्वारा लिखे गए खराब प्रश्नों को काम करता है। कई डेवलपर्स को पता नहीं है, एसक्यूएल में बस पसंद नहीं है या बस cr.p हैं और वे इससे स्पष्ट करने की कोशिश करते हैं; कोड समीक्षा और भारी रिफैक्टरिंग की तुलना में NOLOCK एक आसान बचने का मार्ग लगता है। मुझे पूरी तरह से नोलोक पर निर्मित एक प्रणाली को बनाए रखना था, एक को हटाने से यह दुर्घटनाग्रस्त हो जाएगा। यह इतना बुरा था कि मैंने डेवलपर्स के साथ दैनिक आधार पर भारी तर्क दिया, इसलिए वे "नोलोक के उपासक" थे। मैं कहता हूं "संदेह के मामले में, इसका उपयोग न करें। अगर आप निश्चित हैं, तो इसका इस्तेमाल न करें"। :) – Diego

1

एक दृश्य एक प्रश्न है कि आप पूर्व निर्धारित मापदंडों के साथ अक्सर चलाया जाता है। यदि आप जानते हैं कि आप आसानी से उपयोग के लिए और डेटा बाध्यकारी के लिए एक दृश्य बना सकते हैं, तो आप उसी डेटा को देख रहे होंगे।

कहा जा रहा है कि, जब आप किसी व्यू से चयन करते हैं तो दृश्य परिभाषित क्वेरी आपके द्वारा चलाए जा रहे क्वेरी के साथ चलती है।

उदाहरण के लिए, यदि vwCustomersWhoHavePaid है:

Select * from vwCustomersWhoHavePaid where datepaid > '08/01/08' 

क्वेरी आप वास्तव में कर रहे हैं:

Select * from customers where paid = 1 

और क्वेरी आप रिटर्न चल रहे हैं ग्राहकों को जो अगस्त के बाद भुगतान कर दिया है पहले इस तरह स्वरूपित है चल रहा है:

Select * from (Select * from customers where paid = 1) where datepaid > '08/01/08' 

यह कुछ है जो आपको रखना चाहिए विचार बनाते समय दिमाग, वे डेटा को संग्रहीत करने का एक तरीका हैं जिसे आप अक्सर देखते हैं। यह डेटा व्यवस्थित करने का एक तरीका है, इसलिए इसे एक्सेस करना आसान है।

1

आप पूछते हैं: दृश्यों के पीछे क्या चल रहा है?

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

आपको अपने प्रश्नों की निष्पादन योजनाओं को देखना चाहिए! वहां सीखने के लिए बहुत कुछ है।

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

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