1

SQL クエリの記述に問題があります。パッケージ関数内で、クエリの結果を他の 2 つのクエリで再利用しようとしています。方法は次のとおりです。

私のスキーマはリクエストを保存します。各リクエストは複数の宛先に関係します。また、各リクエストは別のテーブル (Request_Detail) に詳述されています。さらに、リクエストは ID によって識別されます。

なので、主に3つのテーブルを使用しています。1 つはリクエスト用、もう 1 つは宛先用、最後の 1 つは詳細用です。これらのテーブルのそれぞれは、Request_Id 列によって索引付けされます。

私が最適化したいクエリは、ユーザーがすべてのリクエストに加えて、2 つの日付の間に送信された宛先とコマンドを検索したい場合です。

すべての Request_id を取得するために、最初に Request_Table を照会したいと考えています。次に、この Request_Ids リストを使用して、Command テーブルと Destination テーブルをクエリします。

その方法が見つかりませんでした... refカーソルは2回フェッチできないため使用できません... Request_Idsを格納するために配列または列のような変数が必要なだけで、これを使用します変数が 2 回以上...

最適化したい元のクエリは次のとおりです。

    FUNCTION EXTRACT_REQUEST_WITH_DATE (ze_from_date DATE, ze_to_date DATE, x_request_list OUT cursor_type, x_destination_list OUT cursor_type,
                                        x_command_list OUT cursor_type) RETURN VARCHAR2 AS

        my_function_id  VARCHAR2(80) := PACKAGE_ID || '.EXTRACT_REQUEST_WITH_DATE';
        my_return_code  VARCHAR2(2);
    BEGIN


        OPEN x_request_list FOR
        SELECT NAME,DESTINATION_TYPE, 
        SUCCESS_CNT, STATUS, STATUS_DESCRIPTION,
        REQUEST_ID, PARENT_REQUEST_ID, DEDUPLICATION_ID, SUBMIT_DATE, LAST_UPDATE_DATE
        FROM APP_DB.REQUEST_TABLE
        WHERE SUBMIT_DATE >= ze_from_date
            AND SUBMIT_DATE < ze_to_date
        ORDER BY REQUEST_ID;

        OPEN x_destination_list FOR
        SELECT REQUEST_ID, DESTINATION_ID
        FROM APP_DB.DESTINATION_TABLE
        WHERE SUBMIT_DATE >= ze_from_date
            AND SUBMIT_DATE < ze_to_date
        ORDER BY REQUEST_ID;


        OPEN x_command_list FOR
        SELECT SEQUENCE_NUMBER, NAME, PARAMS, DESTINATION_ID 
        SEND_DATE, LAST_UPDATE_DATE,PROCESS_CNT, STATUS, STATUS_DESCRIPTION,
        VALIDITY_PERIOD, TO_ABORT_FLAG 
        FROM APP_DB.REQUEST_DETAILS_TABLE
        WHERE SUBMIT_DATE >= ze_from_date
            AND SUBMIT_DATE < ze_to_date
        ORDER BY REQUEST_ID, DESTINATION_ID, SEQUENCE_NUMBER;

        return RETURN_OK;

    END EXTRACT_REQUEST_WITH_DATE;

ご覧のとおり、3 つのクエリすべてに同じ述語 (SUBMIT_DATE 条件) を使用しています。REQUEST_ID を取得して残りのクエリで使用することで、最適化する方法があると思います。

聞いてくれてありがとう!

4

2 に答える 2

0

だから...私は十分に効率的であると思われるこの方法を見つけました:

まず、配列として使用するグローバル型を定義します。コードは次のとおりです。

Object(Record)タイプ:

create or replace 
TYPE "GENERIC_ID" IS OBJECT(ID VARCHAR2(64));

GENERIC_IDの可変サイズ配列

create or replace 
TYPE "GENERIC_ID_ARRAY" IS TABLE OF "GENERIC_ID";

次に、FOR LOOPのextend()を介してデータの入力が行われます。結果の配列は、以下を使用してSQLリクエストのテーブルとして使用できます。

TABLE(CAST(my_array_of_ids AS GENERIC_ID_ARRAY)

ありがとう、

于 2013-03-13T15:29:54.520 に答える
0

あなたが投稿したクエリに基づいて、SUBMIT_DATEインデックスをREQUEST_TABLEに追加し、SQL をそのままにDESTINATION_TABLEREQUEST_DETAILS_TABLEておきます。3 つのクエリはすべて最適化され、値のテーブルに対する照合と同じくらい高速に実行されREQUEST_IDます。

于 2013-03-01T18:54:02.587 に答える