1

以下の SQL を最適化するにはどうすればよいですか (複雑なクエリの簡略図)。理想的には、最初の SQL 結果 (注文 ID) をキャッシュし、2 番目のクエリで OrderLine テーブルに何らかの射影を行うことができるはずです。

どんなポインタも役に立ちます。

制限 - 一時テーブル、カーソル、またはプロシージャ/関数を作成できません。Oracle 10g に接続しています。

SELECT 'Object_id', id, mod_id FROM
(
    (Select 'Order_id', order_id, mod_id FROM Orders)
    UNION
    (select 'Order_line_id', order_line_id, mod_id FROM OrderLine 
        WHERE order_id IN (Select order_id FROM Orders)
    )
) 
4

6 に答える 6

2

オプティマイザーは、クエリを最適化する責任があります。リラックスして、それをやらせてください。

明示的なキャッシュを試みる場合は、一時テーブル(除外したもの)などが含まれるため、CTE(共通テーブル式、別名WITH句)を使用して共通に名前を付けることによってのみ、共通クエリをより明示的にすることができます。サブクエリ。ただし、オプティマイザは、関係なく同じ方法で処理する可能性があります。

IN句をJOINに置き換えることができます。それはおそらくより速くなるでしょう。繰り返しますが、オプティマイザはとにかくそれを行う可能性があります。ただし、これはキャッシュ操作ではありません。これは標準のクエリ書き換えです。

于 2012-06-25T15:59:25.790 に答える
1

次の例に基づいてクエリを設計できます。

WITH CTE AS
(
    Select 'Order_id' Descr, order_id, mod_id FROM Orders
)
, CTE2 AS
(
    SELECT * FROM CTE
    UNION
    SELECT 'Order_line_id' Descr, order_line_id, mod_id FROM OrderLine ol
    WHERE EXISTS (Select order_id FROM CTE WHERE order_id = ol.order_id)
)
SELECT * FROM CTE2;
于 2012-06-25T16:01:23.033 に答える
0
with myOrders as (
  select order_id,
         mod_id
  from   Orders
)
select 'order_id' obj_type,
       order_id,
       mod_id
from   myOrders

union all

select 'order_line_id' obj_type,
       order_line_id,
       mod_id
from   OrderLine
join   myOrders
on     OrderLine.order_id = myOrders.order_id;
于 2012-06-25T16:05:02.730 に答える
0

次のようなものを試すことができます...

SELECT DISTINCT 'Object_id', id, mod_id
FROM
(
    SELECT
        CASE
            WHEN CROSSNUM = 1 THEN 'Order_ID'
            ELSE 'Order_Line_ID'
        END AS Object_ID,
        CASE
            WHEN CROSSNUM = 1 THEN order_id
            ELSE order_line_id
        END AS id,
        CASE
            WHEN CROSSNUM = 1 THEN Orders.mod_id
            ELSE OrderLine.mod_id
        END AS mod_id
    FROM
        (Select 'Order_id', order_id, mod_id FROM Orders) Orders
    LEFT JOIN (select 'Order_line_id', order_line_id, mod_id FROM OrderLine) OrderLine
        ON Orders.Order_id = OrderLine.Order_Id
    CROSS JOIN
    (
        SELECT 1 AS CROSSNUM FROM DUAL
        UNION ALL
        SELECT 2 AS CROSSNUM FROM DUAL
    ) X
WHERE
    NOT (CROSSNUM = 2 AND order_line_id IS NULL)
)
于 2012-06-25T16:22:56.847 に答える
0

注文から order_id、mod_id を選択 o.order_id = ol.order_line_id の o 内部結合 orderline ol

于 2012-06-25T16:01:47.017 に答える
0

この行を削除できる場合があります。

 WHERE order_id IN (Select order_id FROM Orders)

データベースに整合性がある場合、孤立は許可されず、この行は何もフィルタリングしません。

于 2012-06-25T16:02:45.097 に答える