2013-05-14 12 views
6

मेरे पास डेटा है जो पूर्णांक मानों का एक मैट्रिक्स है जो एक बैंडेड वितरण वक्र इंगित करता है। मैं INSERT प्रदर्शन पर SELECT प्रदर्शन के लिए अनुकूलित कर रहा हूं। अधिकतम 100 बैंड हैं। मैं मुख्य रूप से इस डेटा को समय-समय पर बैंड को संक्षेप में या औसत से पूछताछ कर रहा हूं।कॉलम को पंक्तियों को denormalizing SQL सर्वर में प्रदर्शन को बढ़ाने के लिए करता है?

मेरा प्रश्न है कि मैं बेहतर प्रदर्शन प्राप्त कर सकता हूं, इस डेटा को प्रत्येक बैंड के लिए 1 कॉलम के साथ एक तालिका में फ़्लैट करके, या बैंड मान का प्रतिनिधित्व करने वाले एकल कॉलम का उपयोग करके?

चपटे डेटा

UserId ActivityId DateValue Band1 Band2 Band3....Band100 
10001 10002  1/1/2013 1  5  100  200 

या सामान्यीकृत

UserId ActivityId DateValue Band BandValue 
10001 10002  1/1/2013 1 1 
10001 10002  1/1/2013 2 5 
10001 10002  1/1/2013 3 100 

नमूना क्वेरी

SELECT AVG(Band1), AVG(Band2), AVG(Band3)...AVG(Band100) 
FROM ActivityBands 
GROUP BY UserId 
WHERE DateValue > '1/1/2012' AND DateValue < '1/1/2013' 

उत्तर

8

सामान्यीकृत प्रारूप में डेटा स्टोर करें।

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

1

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

2

यदि आप प्रत्येक पंक्ति में बैंड के सभी (या अधिक) तक पहुंच रहे हैं, तो denormalized रूप बेहतर है। मेरे अनुभव में बहुत बेहतर है।

कारण सरल है। पृष्ठों में डेटा का आकार बहुत छोटा है, इसलिए क्वेरी को संतुष्ट करने के लिए बहुत कम पृष्ठों को पढ़ने की आवश्यकता है। प्रति बैंड एक बैंड को स्टोर करने के लिए ओवरहेड लगभग 4 पूर्णांक या 32 बाइट्स है। तो, 100 बैंड लगभग 3200 बाइट्स हैं। एक रिकॉर्ड के भीतर, रिकॉर्ड आकार 100 * 4 + 8 या लगभग 408 बाइट्स है। यदि आपकी क्वेरी रिकॉर्ड की एक बड़ी संख्या पढ़ रही है, तो यह महत्वपूर्ण रूप से I/O आवश्यकताओं को कम कर देती है।

एक चेतावनी है। यदि आप केवल एक रिकॉर्ड लायक पढ़ रहे हैं, तो 100 रिकॉर्ड एसक्यूएल में एक पेज पर फिट होते हैं और एक रिकॉर्ड एक पेज पर फिट बैठता है। एक पृष्ठ पढ़ने के लिए I/O दो मामलों में समान हो सकता है। लाभ उठता है क्या आप अधिक से अधिक डेटा पढ़ते हैं।

आपकी नमूना क्वेरी सैकड़ों या हजारों पंक्तियों को पढ़ रही है, इसलिए denormalization ऐसी क्वेरी को लाभान्वित होना चाहिए।

4

denormalization (लगभग सभी) की कीमत पर, डेटा तक पहुंचने के बिल्कुल एक साधन को अनुकूलित करता है।

यदि आपके पास केवल एक एक्सेस विधि है जो प्रदर्शन महत्वपूर्ण है, तो denormalization की मदद करने की संभावना है; हालांकि उचित सूचकांक चयन अधिक लाभ का है। हालांकि, यदि आपके पास डेटा पर कई प्रदर्शन महत्वपूर्ण पहुंच पथ हैं, तो आप अन्य अनुकूलन की तलाश करना बेहतर हैं।

उचित क्लस्टर सूचकांक का निर्माण; एसएसडी पर अपने गैर-क्लस्टर्ड इंडेक्स डालें। आपके सर्वर पर स्मृति बढ़ाना; ऐसी सभी तकनीकें हैं जो सभी * के उपयोग के लिए प्रदर्शन को बेहतर बनाती हैं, विभिन्न पहुंचों के बीच व्यापार के बजाय।

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