De flesta känner förmodligen till den nya Oracle 12.1.0.2-funktionen, databasalternativet InMemory. När du använder det här alternativet på Oracle RAC kan DBA ange DUPLICATE-satsen så att ett objekt ska dupliceras bland InMemory-kolumnarkivet i alla instanser. Den här klausulen är för Oracles Engineered Systems som Exadata. Men i icke-konstruerade system verkar Oracle tillåta denna klausul men det fungerar inte som man kan förvänta sig. För att illustrera, följ det här exemplet, som kördes på en RAC-databas med två noder på min MacBook Pro med VirtualBox...definitivt inte ett konstruerat system.
Först skapas en tabell och ändras sedan för INMEMORY DUPLICATE.
SQL> create table db_objs 2 as select * From dba_objects;
Table created.
SQL> alter table db_objs inmemory duplicate;
Table altered.
Borde inte inställningen av denna klausul leda till ett fel eftersom detta är ett icke-konstruerat system?
Tabellen verifieras för att visa att DUPLICATE är specificerad.
SQL> select inmemory,inmemory_duplicate 2 from user_tables where table_name='DB_OBJS';
INMEMORY INMEMORY_DUPL -------- ------------- ENABLED DUPLICATE
En enkel "select *" från tabellen utfärdas på instans 1. Vi kan sedan verifiera att tabellen är InMemory.
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
Lägg märke till att resultaten ovan visar att segmentet endast finns i instans 1. Samma tabell frågas i instans 2, men efterfrågan på GV$IM_SEGMENTS visar fortfarande bara instans 1.
Från instans 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 |
---------------------------------------------------------------------------------------
Från instans 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 |
---------------------------------------------------------------------------------------
Så från båda instanserna fick man tillgång till tabellen INMEMORY. Men vi kan se att endast instans 1 har segmentet InMemory.
Alla tecken pekar på att DUPLICATE-satsen fungerar på ett icke-konstruerat system, vilket vi vet är ett fel. DBA_TABLES verkar indikera att DUPLICATE är i spel här. Förklaringsplanen ger överensstämmelse. Men GV$IM_SEGMENTS håller inte med och visar att DUPLICATE inte fungerar i det här systemet.