2013-05-10 11 views
7

मैं मूल कारण (खंड, ब्लॉक, ताले के इंजन यांत्रिकी के मैकेनिक्स) को जानना चाहता हूं क्यों थोक डालने (प्रत्यक्ष पथ के साथ) पूरे टेबल को ताला लगा देता है, इसलिए यदि मैं सम्मिलित करता हूं एक विभाजन में, मैं किसी अन्य विभाजन को छोटा नहीं कर सकता जो सम्मिलित (स्पष्ट रूप से) प्रभावित नहीं होता है।विभाजित तालिका और तालिका स्तर लॉक में थोक डालने

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

यह ilustrate करने के लिए।

CREATE TABLE FG_TEST 
    (COL NUMBER) 
    PARTITION BY RANGE (COL) 
(PARTITION "P1" VALUES LESS THAN (1000), 
    PARTITION "P2" VALUES LESS THAN (2000)); 

Insert into table fg_test values (1); 
insert into table fg_test values (1000); 
commit; 

सत्र 1::

आज्ञा देना एक मेज हो

insert into table fg_test select * from fg_test where col >=1000; 
--1 rows inserted; 

सत्र 2:

alter table fg_test truncate partition p1; 
--table truncated 

सत्र 1:

rollback; 
insert /*+append */ into table fg_test select * from fg_test where col >=1000; 
--1 rows inserted; 
,210

सत्र 2:

alter table fg_test truncate partition p1; 
--this throws ORA-00054: resource busy and acquire with NOWAIT specified 
--or timeout expired 

Doc on Diret-Path Insert इस विषय पर बहुत अचानक है और सिर्फ कहते हैं:

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

How Direct-Path INSERT Works यह नहीं बताता कि सभी विभाजनों के लिए लॉक की आवश्यकता क्यों है। और क्यों पारंपरिक सम्मिलन गैर-प्रभावित विभाजन को लॉक नहीं करता है? (मेरे अंतर्ज्ञान है कि ताला ब्लॉक स्तर पर किया जाता है)

+1

पंक्ति स्तर पर परंपरागत सम्मिलित ताले, तालिका परिभाषा को इसे साझा किए जाने से रोकने के लिए साझा लॉक द्वारा भी संरक्षित किया जाता है। ओरेकल में कोई ब्लॉक-स्तरीय ताले नहीं हैं, यह सभी पंक्ति, (उप) विभाजन या तालिका स्तर है। –

उत्तर

5

आपका आधार थोड़ा गलत है। यदि आप विभाजन एक्सटेंशन खंड का उपयोग करते हैं तो एक प्रत्यक्ष-पथ सम्मिलन संपूर्ण तालिका को लॉक नहीं करता है।

सत्र 1:

insert /*+append */ into fg_test partition (p2) 
select * from fg_test where col >=1000; 

सत्र 2:

alter table fg_test truncate partition p1; 
--table truncated 

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


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

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

+0

+1 इस व्यवहार को जानने के लिए अच्छा है (विभाजन खंड प्रभाव) –

+0

@ जोनहेलर तो, यदि मैं विभाजन विस्तार का उपयोग कर तालिका में प्रत्यक्ष पथ डालने का उपयोग करता हूं, तो वह विभाजन तब तक उस सत्र में लॉक हो जाएगा जब तक कि 'COMMIT' जारी नहीं किया जाता है। क्या वो सही है? मुझे यह भी यकीन नहीं है कि "विभाजन लॉकिंग" भी एक चीज है, मेरी अज्ञानता को क्षमा करें। – Annjawn

3

मैं asktom.oracle.com पर follwing जवाब मिला:

Ask Tom: Inserts with APPEND Hint

टॉम अंदरूनी कामकाज के कई बताते हैं, लेकिन कारण क्यों ओरेकल पूरी तालिका को ताला लगाता है और न केवल प्रभावित विभाजन अभी भी स्पष्ट नहीं है।

हो सकता है कि यह सिर्फ एक डिजाइन निर्णय (जैसे बड़ा भारी प्रत्यक्ष लोड करने के लिए संभावित रूप से एक छोटा सा uncommited लेन-देन से अवरुद्ध हो नहीं चाहते और इसलिए सभी विभाजनों ताला लगा ...)

+0

आपके उत्तर के लिए धन्यवाद। –

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