キャッシュ・グループおよびキャッシュ表

TimesTenデータベースにキャッシュするOracle Databaseデータは、キャッシュ・グループによって定義されます。キャッシュ・グループを作成すると、キャッシュされたOracle Database表に対応するキャッシュ表がTimesTenデータベースに作成されます。

キャッシュ・グループ定義には、キャッシュされるOracle Database表ごとに個別の表定義を指定する必要があります。TimesTenキャッシュ表の所有者、表名およびキャッシュされる列の名前は、対応するキャッシュされたOracle Database表のスキーマ所有者、表名および列名と一致している必要があります。キャッシュ表に、キャッシュされたOracle Database表のすべての行と列または行と列のサブセットを格納できます。各TimesTenキャッシュ表には主キーが必要です。

Oracle Database表は、同じTimesTenデータベースにある複数のキャッシュ・グループにキャッシュすることはできません。ただし、異なるTimesTenデータベースにある別々のキャッシュ・グループにキャッシュすることは可能です。

別々のAWTキャッシュ・グループに表がキャッシュされており、同じキャッシュ・インスタンスが複数のTimesTenデータベースで同時に更新された場合、キャッシュされたOracle Database表にこの更新が伝播される順序は保証されません。この場合、TimesTenデータベース間で、更新されたキャッシュ表の内容に一貫性がなくなることがあります。

キャッシュ・グループ表を定義する前に、キャッシュされるOracle Database表を作成します。各表は次のいずれかである必要があります。

  • NULLを指定できない列に主キーがあるOracle Database表。TimesTenキャッシュ表の主キーは、全Oracle Database表の主キーで定義する必要があります。たとえば、キャッシュされたOracle Database表の列c1c2およびc3に複合主キーがある場合、TimesTenキャッシュ表の列c1c2およびc3にも複合主キーが必要です。

    次の例では、複合主キーがあるOracle Database表からキャッシュ・グループを作成する方法を示します。次のjob_history表が、複合キーを使用してOracle データベースに作成されました:

    CREATE TABLE job_history
        (employee_id NUMBER(6) NOT NULL,
        start_date DATE NOT NULL,
        end_date DATE NOT NULL,
        job_id VARCHAR2(10) NOT NULL,
        department_id NUMBER(4),
        PRIMARY KEY(employee_id, start_date)); 
    Table created.

    TimesTenデータベースに、複合主キーの列をすべて持つキャッシュ・グループを作成します。

    CREATE WRITETHROUGH CACHE GROUP job_hist_cg
            FROM sales.job_history
            (employee_id NUMBER(6) NOT NULL,
            start_date DATE NOT NULL,
            end_date DATE NOT NULL,
            job_id VARCHAR2(10) NOT NULL,
            department_id NUMBER(4),
            PRIMARY KEY(employee_id, start_date));
  • NULLを指定できない列を持つOracle Database表。この表内の1つ以上のNULLを指定できない列に一意索引が指定されています。TimesTenキャッシュ表の主キーは、一意索引のすべての列に定義されている必要があります。たとえば、Oracle Database表の一意索引が複数の列c1c2およびc3で構成されている場合、TimesTenキャッシュ表の列c1c2およびc3には複合主キーが必要です。

    次の例では、NULLを指定できない列を持つ表にOracle Database一意索引を定義する方法を示します。

    SQL> CREATE TABLE regions(
          region_id NUMBER NOT NULL, 
          region_name VARCHAR2(25));
    Table created.
    SQL> CREATE UNIQUE INDEX region_idx 
          ON regions(region_id);
    Index created.
    
    SQL> CREATE TABLE products(
          prod_id INT NOT NULL, 
          cust_id INT NOT NULL,
          quantity_sold INT NOT NULL,
          time_id DATE NOT NULL);
    Table created.
    SQL> CREATE UNIQUE INDEX products_index ON products(prod_id, cust_id);
    Index created.

    これらのOracle Database表と一意索引に基づいて、次に示すように一意索引列を主キー定義として使用することにより、これらの表についてTimesTenデータベースにキャッシュ・グループを作成できます:

    Command> CREATE WRITETHROUGH CACHE GROUP region_cg
      FROM sales.regions
      (region_id NUMBER NOT NULL PRIMARY KEY, 
       region_name VARCHAR2(25));
    
    Command> CREATE WRITETHROUGH CACHE GROUP products_cg
      FROM sales.products 
      (prod_id INT NOT NULL, cust_id INT NOT NULL, 
       quantity_sold INT NOT NULL, time_id DATE NOT NULL, 
       PRIMARY KEY(prod_id, cust_id));

TimesTenデータベースには、複数のキャッシュ・グループを含めることができます。キャッシュ・グループには、1つ以上のキャッシュ表を含めることができます。

TimesTenのキャッシュ表に索引を作成すると、TimesTenの通常の表の場合と同様に、表に対して発行された特定の問合せを高速化できます。TimesTenキャッシュ表に対して非一意索引を作成できます。キャッシュ表には、キャッシュされたOracle Database表の一意索引と一致しない一意索引を作成しないでください。このような一意索引を作成すると、キャッシュされたOracle Database表では発生しない一意制約による障害がキャッシュ表で発生する可能性があり、その結果、自動リフレッシュ処理が実行されたときに、2つのデータベース内でこれらの表が互いに同期化されなくなります。