अधिकांश लोग शायद नई Oracle 12.1.0.2 सुविधा, InMemory डेटाबेस विकल्प के बारे में जानते हैं। Oracle RAC पर इस विकल्प का उपयोग करते समय, DBA DUPLICATE क्लॉज को निर्दिष्ट कर सकता है कि किसी ऑब्जेक्ट को सभी उदाहरणों में InMemory कॉलम स्टोर के बीच डुप्लिकेट किया जाए। यह खंड Oracle के इंजीनियर सिस्टम जैसे Exadata के लिए है। हालाँकि, गैर-इंजीनियर सिस्टम में, Oracle इस खंड की अनुमति देता है, लेकिन यह काम नहीं करता है जैसा कि कोई उम्मीद कर सकता है। उदाहरण के लिए, इस उदाहरण का अनुसरण करें, जो वर्चुअलबॉक्स के साथ मेरे मैकबुक प्रो पर दो-नोड आरएसी डेटाबेस पर चलाया गया था...निश्चित रूप से एक इंजीनियर सिस्टम नहीं है।
सबसे पहले, एक टेबल बनाई जाती है और फिर INMEMORY DUPLICATE के लिए बदल दी जाती है।
SQL> create table db_objs 2 as select * From dba_objects;
Table created.
SQL> alter table db_objs inmemory duplicate;
Table altered.
क्या इस क्लॉज को सेट करने से कोई त्रुटि नहीं उत्पन्न होनी चाहिए क्योंकि यह एक गैर-इंजीनियर प्रणाली है?
तालिका यह दिखाने के लिए सत्यापित है कि DUPLICATE निर्दिष्ट है।
SQL> select inmemory,inmemory_duplicate 2 from user_tables where table_name='DB_OBJS';
INMEMORY INMEMORY_DUPL -------- ------------- ENABLED DUPLICATE
उदाहरण 1 पर एक साधारण "सेलेक्ट *" फॉर्म टेबल जारी किया जाता है। फिर हम यह सत्यापित कर सकते हैं कि टेबल इनमेमोरी है।
SQL> select inst_id,owner,segment_name,populate_status,inmemory_duplicate 2 from gv$im_segments;
INST_ID OWNER SEGMENT_NA POPULATE_ INMEMORY_DUPL ---------- ---------- ---------- --------- ------------- 1 SCOTT DB_OBJS COMPLETED DUPLICATE
ध्यान दें कि ऊपर दिए गए परिणाम दिखाते हैं कि खंड केवल उदाहरण 1 में है। उदाहरण 2 में समान तालिका की पूछताछ की जाती है, लेकिन GV$IM_SEGMENTS को क्वेरी करने पर अभी भी केवल उदाहरण 1 दिखाई देता है।
उदाहरण 1 से:
SQL> select avg(object_id) from db_objs;
AVG(OBJECT_ID) -------------- 11095.2049
Elapsed: 00:00:00.01
Execution Plan ---------------------------------------------------------- Plan hash value: 1349857420
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 10 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
| 2 | TABLE ACCESS INMEMORY FULL| DB_OBJS | 21319 | 104K| 10 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
उदाहरण 2 से:
SQL> select avg(object_id) from db_objs;
AVG(OBJECT_ID) -------------- 11095.2049
Elapsed: 00:00:00.03
Execution Plan ---------------------------------------------------------- Plan hash value: 1349857420
---------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 5 | 4 (0)| 00:00:01 |
| 1 | SORT AGGREGATE | | 1 | 5 | | |
| 2 | TABLE ACCESS INMEMORY FULL| DB_OBJS | 21319 | 104K| 4 (0)| 00:00:01 |
---------------------------------------------------------------------------------------
तो किसी भी उदाहरण से, तालिका को INMEMORY एक्सेस किया गया था। लेकिन हम देख सकते हैं कि केवल इंस्टेंस 1 में सेगमेंट इनमेमोरी है।
सभी संकेत एक गैर-इंजीनियर प्रणाली पर काम करने के रूप में DUPLICATE क्लॉज की ओर इशारा करते हैं, जिसे हम जानते हैं कि यह एक त्रुटि है। DBA_TABLES इंगित करता है कि DUPLICATE यहां चल रहा है। व्याख्या योजना सहमति प्रदान करती है। लेकिन GV$IM_SEGMENTS असहमत है और दिखाता है कि इस सिस्टम में DUPLICATE काम नहीं कर रहा है।