2009-06-18 5 views
7

के साथ उपयोग करने के लिए किसी भी नुकसान (तथ्य और आयाम स्टार मॉडल में - कोई देर पहुंचने तथ्यों पंक्तियों या स्तंभों, कोई स्तंभ के रूप में समाप्त होने को छोड़कर आयामों में बदल रहा है प्रकार 2 का हिस्सा धीरे-धीरे बदलते आयाम) पंक्तियों को सम्मिलित करने और अपडेट करने के लिए भारी दैनिक प्रसंस्करण (नई तिथियों पर) और मासिक और दैनिक रिपोर्टिंग प्रक्रियाओं के साथ। तथ्यों की तालिका पुराने डेटा के आसान रोलऑफ के लिए तारीखों द्वारा विभाजित होती है।एक डाटा गोदाम परिदृश्य में है वहाँ मैं एक Kimball शैली DW है (NOLOCK)

मैं समझता हूं कि WITH(NOLOCK) असामान्य डेटा को पढ़ा जा सकता है, हालांकि, मैं भी ऐसे ताले बनाने की इच्छा नहीं करता जो ईटीएल प्रक्रियाओं को विफल या अवरुद्ध कर दे।

सभी मामलों में, जब हम डीडब्ल्यू से पढ़ रहे हैं, हम एक तारीख के लिए तथ्य सारणी से पढ़ रहे हैं जो नहीं बदलेगा (तथ्य तालिकाएं तिथि से विभाजित हैं) और आयाम सारणी जिनमें तथ्यों के लिए गुण नहीं बदलेंगे वे जुड़े हुए हैं।

तो क्या कोई नुकसान है? - शायद निष्पादन योजनाओं में या ऐसे SELECT के संचालन में - केवल एक ही सारणी के समानांतर में चलने वाली क्वेरी।

+0

संबंधित। http://stackoverflow.com/questions/20047/diagnosing-deadlocks-in-sql-server-2005 –

उत्तर

2

जब तक यह सभी अद्यतन डेटा नहीं है, तब तक कोई नुकसान नहीं होता है, लेकिन अगर मुझे बहुत लाभ होता है तो मुझे आश्चर्य होगा। मैं कहूंगा कि यह एक कोशिश के लायक है। सबसे बुरा यह होगा कि यदि आप बैच डालने के बीच में हैं, तो आप अपूर्ण और/या असंगत डेटा प्राप्त करेंगे, लेकिन आप यह तय कर सकते हैं कि यह कुछ भी उपयोगी है या नहीं।

+0

तथ्य पंक्तियां जो हम पढ़ रहे हैं वे नहीं बदलेगी और आयाम पंक्तियां हमेशा वैध होंगी, लेकिन उनका समय समाप्त हो जाएगा और एक नया नए तथ्यों के लिए आयाम आयाम। –

+0

पूरी तरह से मेरे लिए सीधे लगता है। मेरे पास केवल दो प्रश्न हैं। 1. क्या इस बदलाव के बिना चलने के तरीके में कोई समस्या है (यानी यह संभवतः एक समयपूर्व अनुकूलन है)। 2. ये सभी केवल पढ़ने के लिए प्रश्न हैं और आप उनके अलगाव स्तर को आराम दे रहे हैं। क्या बुरी चीज (रिज्यूट की स्पष्ट क्रोध के अलावा, जो आप स्पष्ट रूप से परिशिष्ट और तथ्य संस्करण पर अपने जोर से कमजोर हो रहे हैं) क्या आप कल्पना कर रहे हैं? – dkretz

+0

मैं ईटीएल के नियंत्रण में नहीं हूं, लेकिन मैं सभी रिपोर्टिंग के लिए ज़िम्मेदार हूं। मुझे sp_who तक पहुंच नहीं दी गई है, इसलिए मुझे सक्रिय रूप से यह सुनिश्चित करना होगा कि मेरी सभी (महत्वपूर्ण) प्रोसेसिंग डीबीए शिकायत करने से पहले दैनिक और मासिक भार में हस्तक्षेप नहीं करती है, मैं शिकायत करता हूं कि मैं उन्हें अवरुद्ध कर रहा हूं। –

1

हां। आपका एसक्यूएल बहुत कम पठनीय होगा। आप अनिवार्य रूप से कुछ NOLOCK संकेतों को याद करेंगे क्योंकि NOLOCK रणनीति का उपयोग कर SQL SELECT आदेशों को इसे सभी जगहों पर रखना होगा।

You can get the same thing by setting the isolation level

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

अंत में आप एक 10% प्रदर्शन को बढ़ावा देने (खेद मैं भी भी इसके लिए लेख को देखने के आलसी हूँ, लेकिन यह वहाँ बाहर है)

मैं मिल डी कहते हैं कि 10% लाभ पठनीयता को कम करने लायक नहीं है।

+0

+1 लेकिन "नोलॉक के साथ" कुछ भी नहीं है। यह 10% चीज नहीं है जितना इसे चलाएगा या नहीं। –

+0

मैं इसे मानता हूं। कनेक्शन पर अन्य ऑपरेशन हैं (यानी मेरी प्रक्रिया कॉन्फ़िगरेशन और स्थिति डेटा, तथ्य/मंद सितारा-मॉडल डेटा नहीं) जो मैं जरूरी नहीं कि वह इस तरह से व्यवहार करना चाहें। इस बिंदु पर मेरे पास उपयोग किए गए विचारों में केंद्रीकृत (NOLOCK) है जो डीडब्ल्यू डेटाबेस में स्टार मॉडल को लपेटता है और फ़्लैट करता है। –

1

हैं बनाने पूरे डेटाबेस केवल पढ़ने के लिए possbile है, तो यह एक बेहतर विकल्प है। आपको अपने सभी कोड को संशोधित किए बिना पढ़ा-रहित प्रदर्शन प्राप्त होगा।

ALTER DATABASE adventureworks SET read_only 
+0

डीडब्ल्यू डेटाबेस पहले से ही मेरे उपयोगकर्ता को पढ़ा गया है, लेकिन तथ्यों में नए डेटा को लोड करने वाली ईटीएल प्रक्रियाओं के लिए लिखने योग्य होना चाहिए (और आवश्यकतानुसार आयाम)। मेरा डेटाबेस मेरी प्रक्रिया प्रक्रियाओं और विन्यास रखता है। –

+0

मुझे लगता है कि यह केवल तभी काम करता है जब डीबी केवल उपयोगकर्ता को पढ़ा न जाए। शायद ईटीएल –

+0

के हिस्से के रूप में डेटाबेस को बाहर और read_only में बदलने पर विचार करें शायद एक पठन-केवल फ़ाइल समूह? –

5

यह वही है तो आप शायद जरूरत है:

`ALTER डेटाबेस AdventureWorks सेट READ_COMMITTED_SNAPSHOT पर;

वैकल्पिक डाटाबेस साहसिक कार्य SET ALLOW_SNAPSHOT_ISOLATION ON; `

फिर आगे जाना है और

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

आपके प्रश्नों में

का उपयोग करें। बोल के अनुसार:

कटिबद्ध पढ़ें के व्यवहार READ_COMMITTED_SNAPSHOT डेटाबेस विकल्प की सेटिंग पर निर्भर:

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

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

इस सहायता की आशा करें। राज

+0

मैं इसे मानता हूं। कनेक्शन पर अन्य ऑपरेशन हैं (यानी मेरी प्रक्रिया कॉन्फ़िगरेशन और स्थिति डेटा, तथ्य/मंद सितारा-मॉडल डेटा नहीं) जो मैं जरूरी नहीं कि वह इस तरह से व्यवहार करना चाहें। –

2

क्या आपने अपने डीडब्ल्यू के DATABASE SNAPSHOT बनाने और अपनी रिपोर्ट को चलाने के लिए विचार किया है?

+0

नहीं, यह वास्तव में संभव नहीं है, क्योंकि हम डेटा के कई टीबी के बारे में बात कर रहे हैं। डीडब्ल्यू इस उद्देश्य के लिए डिज़ाइन किया गया है, यही कारण है कि तथ्यों की तालिका तिथि से विभाजित होती है। –

+0

लेकिन डेटाबेस स्नैपशॉट एक स्पैस फ़ाइल है जिसमें कॉपी-ऑन-राइट सेमेन्टिक्स हैं। आपको बस डिस्क पर स्थान आरक्षित होने की जगह है, वास्तविक I/O संचालन केवल तभी होगा जब मूल डेटाबेस पर कोई लेखन होता है। –

0

NOLOCK एक 'गंदे पढ़ने' का प्रदर्शन करता है (अनिवार्य रूप से पढ़ा गया UncomMITTED नोलोक के समान ही करता है)। यदि आपके द्वारा पढ़े जाने पर डेटाबेस अपडेट किया जा रहा है तो वहां एक खतरा है कि आपको असंगत डेटा वापस मिल जाएगा। एकमात्र विकल्प या तो लॉकिंग स्वीकार करना है और इसलिए अवरुद्ध करना है, या SQL 2005 के बाद discussed here में दिए गए दो नए अलगाव स्तरों में से एक को चुनना है।

+0

डेटा के लिए कोई इन्सर्ट या अपडेट नहीं हैं। केवल बदलाव ही भविष्य की तिथियों के लिए होंगे जो हम तब तक नहीं पढ़ते जब तक कि प्रसंस्करण पूरा नहीं हो जाता। –

+0

फिर NOLOCK सही समाधान है। –

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