sql >> データベース >  >> RDS >> Oracle

OracleRACでのInMemoryDUPLICATEの混乱

    ほとんどの人は、Oracle12.1.0.2の新機能であるInMemoryデータベースオプションを知っているでしょう。 Oracle RACでこのオプションを使用する場合、DBAはDUPLICATE句を指定して、すべてのインスタンスのInMemory列ストア間でオブジェクトを複製することができます。この句は、ExadataなどのOracleのエンジニアドシステムを対象としています。ただし、エンジニアリングされていないシステムでは、Oracleはこの句を許可しているように見えますが、期待どおりに機能しません。説明のために、VirtualBoxを搭載したMacBook Proの2ノードRACデータベースで実行されたこの例に従ってください…間違いなく、エンジニアドシステムではありません。

    最初にテーブルが作成され、次にINMEMORYDUPLICATE用に変更されます。

    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で、テーブルからの単純な「select *」フォームが発行されます。次に、テーブルが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

    上記の結果は、セグメントがインスタンス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のみがセグメントInMemoryを持っていることがわかります。

    すべての兆候は、DUPLICATE句が非エンジニアリングシステムで動作していることを示していますが、これはエラーであることがわかっています。 DBA_TABLESは、ここでDUPLICATEが機能していることを示しているようです。 ExplainPlanは同意を提供します。しかし、GV $ IM_SEGMENTSは同意せず、DUPLICATEがこのシステムで機能していないことを示しています。


    1. 非正規化:いつ、なぜ、どのように

    2. データベーススキーマオブジェクトチェックの自動化

    3. SQLサーバーでID列の値が突然1001にジャンプします

    4. PostgreSQLを使用する1つのエンティティ用の複数のHibernateシーケンスジェネレータ