2011-10-03 10 views
9

मैं सोच रहा था कि एसक्यूएल-सर्वर डेटाबेस में किसी तालिका पर पंक्तिवर्ती कॉलम जोड़ने का प्रदर्शन प्रभाव था या नहीं?रोवर्सन और प्रदर्शन

+3

क्या तुलना में? यदि आपको एक पंक्तिवर्ती की आवश्यकता है, तो आपको एक पंक्तिवृत्ति की आवश्यकता है .... –

+2

मैं मिच से सहमत हूं। यदि आपको इसकी आवश्यकता है, तो इसे बदलने के लिए आप किस कामकाज का उपयोग करेंगे? – gbn

+0

संभावित डुप्लिकेट [क्या पंक्तिवर्ती/टाइमस्टैम्प प्रदर्शन को महत्वपूर्ण रूप से प्रभावित करता है?] (Http://stackoverflow.com/questions/7217062/does-rowversion-timestamp-affects-performance-ignificantly) –

उत्तर

14

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

SELECT * 
FROM MyTable 
WHERE rowVersion > @rowVersion 

कौन सा आम तरीका है कि पिछले @rowVersion के बाद से अपडेट किए गए आइटम की सूची प्राप्त करने के लिए इस्तेमाल किया जा सकता है: अपने प्रदर्शन जब आप इस तरह के रूप में इस डेटा के आधार पर प्रश्नों करने की कोशिश भी बहुत कुछ भुगतना होगा। यह ठीक दिखता है और 10,000 पंक्तियों के साथ एक टेबल के लिए सही काम करेगा। लेकिन जब आप 1 एम पंक्तियों तक पहुंच जाते हैं तो आप जल्दी से पता लगाएंगे कि यह हमेशा एक टेबलकेन कर रहा है और आपका प्रदर्शन हिट है क्योंकि आपकी तालिका अब पूरी तरह से सर्वर की रैम के भीतर फिट बैठती है।

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

संपादित करें: यदि आप अद्यतन आइटम की जांच के लिए rowVersion फ़ील्ड का उपयोग नहीं कर रहे हैं और इसके बजाय आप यह सुनिश्चित करने के लिए स्थिरता के लिए इसका उपयोग करने जा रहे हैं कि रिकॉर्ड को अंतिम बार पढ़ने के बाद अपडेट नहीं किया गया है, तो यह जा रहा है पूरी तरह से स्वीकार्य उपयोग होने के लिए और प्रभावित नहीं होगा।

UPDATE MyTable SET MyField = ' @myField 
WHERE Key = @key AND rowVersion = @rowVersion 
संबंधित मुद्दे