ハイブリッド・キャッシュ・グループの動的ロードの指定
ハイブリッド・キャッシュ・グループの場合、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;