भौतिकवादी दृश्य पूर्ण रीफ्रेश या मैनुअल समकक्ष के लिए सीमा फिर से करें


10

एक भौतिक दृश्य (एमवी) लॉग का उपयोग एमवी को तेजी से ताज़ा करने की अनुमति देने के लिए किया जा सकता है जो केवल उस डेटा को संशोधित करता है जो बदल गया है। हालांकि, विभिन्न स्थितियां एमवी को लॉग का उपयोग करने से रोकती हैं और इसलिए पूर्ण रूप से ताज़ा करने की आवश्यकता होती है। ओरेकल ने हर रिकॉर्ड को हटाने और डालने के रूप में एक परमाणु पूर्ण ताज़ा लागू किया। ऐसा तब भी होता है, जब डेटा में कोई बदलाव नहीं होता है।

क्या इस प्रतिकृति को फिर से बनाने के संबंध में बुद्धिमान बनाने का कोई तरीका है ? DELETE के बाद एक MERGE को स्रोत को दो बार क्वेरी करने की आवश्यकता होती है। क्या बल्क मेर और DELETE करने के लिए डेटा एकत्र करना थोक के लिए उचित होगा? क्या कोई बेहतर तरीका है?

अपडेट करें:

मैंने एक मंचन क्षेत्र के रूप में एक वैश्विक अस्थायी तालिका का उपयोग करके पता लगाया। हालाँकि वे आधे से कम रीडो का उपयोग करते हैं, फिर भी वे बहुत उपयोग करते हैं।


क्या आप जीटीटी कोड पोस्ट कर सकते हैं? gtt सीधे redo उत्पन्न नहीं करता है, लेकिन वे पूर्ववत उत्पन्न करते हैं - और पूर्ववत redo उत्पन्न करता है। insertऑप्स से बहुत कम पूर्ववत उत्पन्न deleteया updateऑप्स (लगभग वास्तव में कोई नहीं)। किसी भी महंगे ऑप्स से बचने के लिए कई gtts होने के कारण एक अच्छा दृष्टिकोण हो सकता है
जैक कहते हैं कि topanswers.xyz

@ जेक डगलस psoug.org/reference/gtt.html में GTT Redo Generation Demo है, जो भौतिक तालिका और inserts के लिए GTT के बीच Redo में 60% की कमी दर्शाता है । यह उन परिणामों से निकटता से मेल खाता है जो मैं देख रहा हूं और बेहतर है लेकिन उतना अच्छा नहीं है जितना मैं चाहूंगा।
लीघ रिफ़ेल

वे परीक्षण (पंक्ति-दर-पंक्ति और कोई appendसंकेत) रीडो को कम करने के लिए आदर्श स्थिति नहीं हैं - मैंने जो कुछ दिखाया है उसका मतलब है कि मैंने कुछ परीक्षण चलाए हैं। एक उत्तर के रूप में पोस्ट किया गया क्योंकि वे एक टिप्पणी में फिट नहीं होंगे
जैक कहते हैं कि topanswers.xyz

जवाबों:


5

यह सिर्फ insertपूरे प्रश्न का उत्तर देने के बजाय विभिन्न परिचालनों के पुन: उपयोग को प्रदर्शित करना है । मेरे 10 जी उदाहरण पर परिणाम 100% नियतात्मक नहीं हैं, लेकिन हर बार जब मैं भागता था तो व्यापक चित्र वही रहता था।

ढेर तालिकाओं के लिए, मुझे नहीं पता कि क्यों insert /*+ append */अधिक रेडो उत्पन्न किया।

टेस्टबेड:

create table heap_noappend(id integer, dummy char(500));
create table heap_append(id integer, dummy char(500));
create global temporary table gtt_noappend(id integer, dummy char(500));
create global temporary table gtt_append(id integer, dummy char(500));
create global temporary table gtt_results(stage integer, val integer);

परीक्षा:

insert into gtt_results(stage, val)
select 0, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

insert into heap_noappend(id, dummy)
select level, 'A' from dual connect by level<1000;

insert into gtt_results(stage, val)
select 1, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

insert /*+ append */ into heap_append(id, dummy)
select level, 'A' from dual connect by level<1000;

insert into gtt_results(stage, val)
select 2, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

insert into gtt_noappend(id, dummy)
select level, 'A' from dual connect by level<1000;

insert into gtt_results(stage, val)
select 3, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

insert /*+ append */ into gtt_append(id, dummy)
select level, 'A' from dual connect by level<1000;

insert into gtt_results(stage, val)
select 4, value from v$statname join v$sesstat using(statistic#)
where sid=sys_context('userenv','sid') and name='redo size';

परिणाम:

select * 
from( select decode(stage,1,'heap noappend',
                          2,'heap append',
                          3,'gtt noappend',
                          4,'gtt append') as operation, 
             val-lag(val) over(order by stage) as redo 
      from gtt_results)
where redo is not null;

OPERATION     REDO                   
------------- ---------------------- 
heap noappend 606932                 
heap append   690768                 
gtt noappend  41488                  
gtt append    256                   

आप निश्चित रूप से सही हैं। मुझे उनके परीक्षणों में पकड़ लेना चाहिए था। मै उसे करने की एक कोशिश तो करूंगा।
लेह रिफ़ेल

6

अच्छा प्रश्न। मैंने अपनी स्थिति के लिए इस समस्या को कुछ समय पहले एमवी के और उन पर किसी भी सूचकांक को बनाकर "हल" कर दिया। मेरी स्थिति से इसका कोई वास्ता नहीं था - मैं वैसे भी इस दृश्य को पूरी तरह से ताज़ा कर रहा था, मुझे फिर से क्यों आवश्यकता होगी?


1
आपको ATOMIC_REFRESH = झूठी भी चाहिए (10 ग्राम और अधिक पर)। सुनिश्चित नहीं है कि किसी भी स्टैंडबाय डेटाबेस या संग्रह लॉग के साथ पुनर्प्राप्ति के लिए निहितार्थ क्या हैं?
जैक का कहना है कि topanswers.xyz

मैंने उस डेटाबेस पर एक तार्किक और एक भौतिक स्टैंडबाय चलाया, जिसके साथ मैंने ऐसा किया। वहाँ कोई समस्या नहीं है। मैंने डीबी प्रतियां बनाने के साथ एक मुद्दे में भाग लिया - मेरे नोटों को देखना है लेकिन एक त्रुटि थी जो मुझे कभी-कभी एक टेबलस्पॉट पर पुनर्प्राप्ति प्रदर्शन करने के बारे में प्राप्त होती है जिसमें नॉलिंग टेबल होती है। मैंने टेबल / इंडेक्स के लिए आरक्षित एक टेबलस्पेस बनाने के लिए सिफारिशें पढ़ी हैं जो इस तरह के मुद्दों से बचने के लिए नॉनग्लॉगिंग हैं। मैं यह पता लगाने के लिए कि इसे कैसे हल किया जाए।
DCookie

@ जेक, मेरा मानना ​​है कि मुझे गैर परमाणु ताज़ा का उपयोग करना था।
DCookie

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

इसे परमाणु ताज़ा करने की आवश्यकता क्यों है? जैसा कि मैं इसे समझता हूं, कि झूठे को स्थापित करना केवल एक पूर्ण ताज़ा को प्रभावित करता है। : इस asktom पोस्ट देखें asktom.oracle.com/pls/apex/...
DCookie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.