sql >> Databasteknik >  >> RDS >> Oracle

InMemory DUBLIKAT Förvirring i Oracle RAC

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.


  1. Finns det en funktion i Oracle som beräknar skillnaden mellan två datum?

  2. Hur loggar/spår jag Oracles lagrade proceduranrop med parametervärden?

  3. Hur LPAD()-funktionen fungerar i MySQL

  4. ClusterControl - Advanced Backup Management - mariabackup del II