ハイブリッド・キャッシュ・グループの動的ロードの指定

ハイブリッド・キャッシュ・グループの場合、SELECT文のFROM句内に導出表を指定するか、同じハイブリッド・キャッシュ・グループの複数の表を同じ問合せに含めることができます。

動的ロードは、「動的ロードのガイドライン」で指定されたルールを評価した後に実行されます。

導出表の使用

ハイブリッド・キャッシュ・グループの場合、SELECT文のFROM句内に導出表を指定できます。問合せで導出表を含む複数の表が指定されている場合、動的ロード条件を持つ導出表のマテリアライズされた結果は親表として扱われます(ただし、導出表でハイブリッド・キャッシュ・グループの最初の子表が1つ指定されている場合のみ)。

『Oracle TimesTen In-Memory Database SQLリファレンス』「DerivedTable」を参照してください。

例4-1 導出表の使用

次の問合せは、SELECT文のFROM句内で導出表を使用します。導出表のマテリアライズされた結果は、問合せが動的ロードの対象かどうかを判別する際に親表の順序として扱われます。次の問合せは、SELECT文のFROM句内で導出表を使用します。導出表のマテリアライズされた結果は、問合せが動的ロードの対象かどうかを判別する際に親表の順序として扱われます。

SELECT * FROM 
 (SELECT customer_id FROM orders WHERE customer_id=? AND ROWNUM <= 5);

複数の表の組込み

同じハイブリッド・キャッシュ・グループの複数の表を同じ問合せに含めることができます。

  • 同じハイブリッド・キャッシュ・グループの1つ以上の第1レベルの子表を問合せに含めることができます(第1レベルの子表を含む導出表のオプションを含む)。
    • 他の最初の子表または導出表と同じ外部キーを指定します。

    • 外部キーと他の最初の子表または導出表の外部キーが同じである結合条件を含めます。

  • 含まれている同じハイブリッド・キャッシュ・グループの孫表は、次のとおりである必要があります。

    • 導出表または同じハイブリッド・キャッシュ・グループの第1レベルの子表で外部キー結合条件が含まれています。

    • 外部表とその親表との結合には含まれていません。

次の例では、ハイブリッド・キャッシュ・グループの動的ロードをトリガーする条件とトリガーしない条件を示します。これらの例はすべて、「ハイブリッド・キャッシュ・グループの作成」で定義されたcustomer_ordersハイブリッド・キャッシュ・グループの例に基づいています。

例4-2 複数の第1レベルの子表を使用した動的ロード条件

次の問合せは、2つの第1レベルの子表(ordersおよびlocations)が同じ動的ロード条件を指定するため、動的ロードをトリガーします。

SELECT * FROM orders, locations
 WHERE orders.customer_id=:id and locations.customer_id=:id;

また、次の問合せは、locations表の外部キーがorders表の外部キーと同じであるため、動的ロードをトリガーします。

SELECT * FROM orders, locations
 WHERE orders.customer_id=:id and locations.customer_id=:id;

例4-3 第1レベルの子表および導出表を使用した動的ロード条件

次の問合せは、2つの第1レベルの子表(ordersおよびlocations)が同じ動的ロード条件を指定するため、動的ロードをトリガーします。locations表は、外部キーがorders表から動的にロードされた外部キーと同じです。

導出表の名前は、導出表指定の直後に指定されるため、一時的にcustという名前が付けられます。

SELECT * FROM 
  (SELECT customer_id,order_id FROM orders 
          WHERE customer_id=:id and ROWNUM <= 5) cust, invoices, locations  
 WHERE 
    invoices.order_id = cust.order_id and locations.customer_id=cust.customer_id; 

例4-4 第1レベルの子表および孫表を使用した動的ロード条件

次の問合せ例では、動的ロード条件がorders表(customer_ordersハイブリッド・キャッシュ・グループの第1レベルの子表)を含む導出表にあるため、動的ロードをトリガーします。また、導出表custを持つ外部キー結合条件に含まれる孫表invoicesも含まれます。

一時的に、導出表名はordersとなり、親表として扱われます。

SELECT * FROM 
  (SELECT customer_id,order_id FROM orders 
          WHERE customer_id=? and ROWNUM <= 5) cust, invoices 
 WHERE invoices.order_id = cust.order_id;

例4-5 導出表と結合された孫表を使用した動的ロード

次の問合せでは、(孫表としての)invoices表が外部キー結合を介して導出表custと結合されるため、動的ロードをトリガーします。

SELECT * FROM 
  (SELECT customer_id,order_id FROM orders 
          WHERE customer_id=? and ROWNUM <= 5) cust, invoices   
 WHERE invoices.order_id = cust.order_id; 

例4-6 第1レベルの子表を使用した動的ロードがない例

次の問合せでは、第1レベルの子locations表で導出表(cust)のロード条件と異なる動的ロード条件が指定されているため、動的ロードはトリガーされません。

SELECT * FROM 
  (SELECT customer_id,order_id FROM orders 
          WHERE customer_id=:id and ROWNUM <= 5) cust, invoices, locations  
 WHERE invoices.order_id = cust.order_id and locations.customer_id=:id2; 

例4-7 孫表を使用した動的ロードがない例

次の問合せでは、invoices孫表が親であるorders表との外部キー結合を介して結合されていないため、動的ロードはトリガーされません。

SELECT * FROM 
  (SELECT customer_id,order_id FROM orders 
          WHERE customer_id=? and ROWNUM <= 5) cust, invoices   
 WHERE invoices.invoice_id=?; 

例4-8 孫表を使用した動的ロードがない2つ目の例

次の問合せでは、invoices孫表が、その親であるorders表との結合の外部表に含まれているため、動的ロードをトリガーしません。

SELECT * FROM invoices LEFT JOIN
  (SELECT customer_id,order_id FROM orders 
          WHERE customer_id=? and ROWNUM <= 5) cust 
 ON invoices.order_id = cust.order_id;