sql >> Databáze >  >> RDS >> Oracle

InMemory DUPLICATE Zmatek v Oracle RAC

Většina lidí pravděpodobně zná novou funkci Oracle 12.1.0.2, možnost databáze InMemory. Při použití této možnosti na Oracle RAC může správce dat zadat klauzuli DUPLICATE, aby byl objekt duplikován ve všech instancích úložiště sloupců InMemory. Tato klauzule je pro Oracle Engineered Systems, jako je Exadata. Zdá se však, že v neinženýrských systémech Oracle tuto klauzuli povoluje, ale nefunguje tak, jak by se dalo očekávat. Pro ilustraci následujte tento příklad, který byl spuštěn na dvouuzlové databázi RAC na mém MacBooku Pro s VirtualBoxem...rozhodně to není vyvinutý systém.

Nejprve se vytvoří tabulka a poté se změní na INMEMORY DUPLICATE.

SQL> create table db_objs
 2 as select * From dba_objects;
Table created.
SQL> alter table db_objs inmemory duplicate;
Table altered.

Nemělo by nastavení této klauzule způsobit chybu, protože se nejedná o systém bez návrhu?

Tabulka je ověřena, aby bylo vidět, že je zadán DUPLICATE.

SQL> select inmemory,inmemory_duplicate 
 2 from user_tables where table_name='DB_OBJS';
INMEMORY INMEMORY_DUPL
-------- -------------
ENABLED  DUPLICATE

Na instanci 1 je vydán jednoduchý „select *“ z tabulky. Poté můžeme ověřit, že tabulka je 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

Všimněte si, že výše uvedené výsledky ukazují, že segment je pouze v instanci 1. Stejná tabulka je dotazována v instanci 2, ale dotazování GV$IM_SEGMENTS stále zobrazuje pouze instanci 1.

Z instance 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 |
---------------------------------------------------------------------------------------

Z příkladu 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 |
---------------------------------------------------------------------------------------

Takže v obou případech bylo k tabulce přistupováno INMEMORY. Ale můžeme vidět, že pouze instance 1 má segment InMemory.

Všechny znaky ukazují na klauzuli DUPLICATE jako práci na systému bez inženýrství, což, jak víme, je chyba. Zdá se, že DBA_TABLES naznačuje, že je zde ve hře DUPLICATE. Plán vysvětlení poskytuje souběžnost. Ale GV$IM_SEGMENTS nesouhlasí a ukazuje, že DUPLICATE v tomto systému nefunguje.


  1. PostgreSQL:ERROR:42601:pro funkce vracející záznam je vyžadován seznam definic sloupců

  2. Připojování k Heroku Postgres ze Spring Boot

  3. Je ODP.NET vyžadován pro klienta Oracle 11g?

  4. Převeďte varchar na datetime v SQL Server