Kebanyakan orang mungkin mengetahui fitur Oracle 12.1.0.2 yang baru, opsi database InMemory. Saat menggunakan opsi ini di Oracle RAC, DBA dapat menentukan klausa DUPLICATE agar objek diduplikasi di antara penyimpanan kolom InMemory di semua instance. Klausul ini untuk Sistem Rekayasa Oracle seperti Exadata. Namun, dalam sistem non-Rekayasa, Oracle tampaknya mengizinkan klausa ini tetapi tidak berfungsi seperti yang diharapkan. Sebagai ilustrasi, ikuti contoh ini, yang dijalankan pada database RAC dua simpul di MacBook Pro saya dengan VirtualBox… jelas bukan sistem yang Direkayasa.
Pertama, sebuah tabel dibuat dan kemudian diubah untuk INMEMORY DUPLICATE.
SQL> create table db_objs 2 as select * From dba_objects;
Table created.
SQL> alter table db_objs inmemory duplicate;
Table altered.
Bukankah pengaturan klausa ini akan menimbulkan kesalahan karena ini adalah sistem yang tidak direkayasa?
Tabel diverifikasi untuk menunjukkan bahwa DUPLICATE telah ditentukan.
SQL> select inmemory,inmemory_duplicate 2 from user_tables where table_name='DB_OBJS';
INMEMORY INMEMORY_DUPL -------- ------------- ENABLED DUPLICATE
Formulir "pilih *" sederhana dari tabel dikeluarkan pada instance 1. Kami kemudian dapat memverifikasi bahwa tabel tersebut adalah 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
Perhatikan bahwa hasil di atas menunjukkan bahwa segmen hanya pada instance 1. Tabel yang sama dikueri pada instance 2, tetapi kueri GV$IM_SEGMENTS masih hanya menampilkan instance 1.
Dari contoh 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 |
---------------------------------------------------------------------------------------
Dari contoh 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 |
---------------------------------------------------------------------------------------
Jadi dari salah satu contoh, tabel diakses INMEMORY. Tetapi kita dapat melihat bahwa hanya instance 1 yang memiliki segmen InMemory.
Semua tanda menunjuk ke klausa DUPLICATE sebagai bekerja pada sistem non-Rekayasa, yang kita tahu adalah kesalahan. DBA_TABLES tampaknya menunjukkan bahwa DUPLICATE sedang dimainkan di sini. The Explain Plan memberikan persetujuan. Namun GV$IM_SEGMENTS tidak setuju dan menunjukkan bahwa DUPLICATE tidak berfungsi di sistem ini.