2

問題のこのテーブル スキーマは次のとおりです: Oracle SQL: Selecting a single row with the latest date between multiple columns

500 万を超えるエントリを持つテーブルを使用しています。このテーブルに upsert し、ストアド プロシージャを使用して最後に upserted された行 ID を返す最も速くて正確な方法は何ですか?

私が読んだことのほとんどは、アップサートにマージステートメントを使用することを推奨しています。ただし、me​​rge はへの復帰をサポートしていません。

このテーブルには、期待どおりに更新された CREATE_DATE、CREATE_USER、UPDATE_DATE、および UPDATE_USER フィールドがあります。私の考えは、これらの 2 つの列の間に最新の日付があり、それぞれのユーザー データが現在のユーザー データと等しい行の ID を返すストアド プロシージャを作成することでした。これは、参照質問に答えてくれた人々が私を助けてくれたものです (ありがとう!)。

ただし、結合による実行時間と他の方法の合計時間、およびマージによってシーケンスに作成される大きなギャップが懸念されます。ID を取得するためだけに別のステートメントを呼び出すのも、少し効率が悪いようです。ただし、私が読んだほとんどすべては、マージがマージ前の upsert ステートメントよりもはるかに高速であると述べています。

これらは ac#/asp Web アプリケーションを介して呼び出されていることに注意してください。どんな助けでも大歓迎です:)

編集

以下は、アップサートに使用しているストアド プロシージャの例です。CREATE_DATE 列と UPDATE_DATE 列はトリガーで更新されることに注意してください。

create or replace
PROCEDURE     P_SAVE_EXAMPLE_TABLE_ROW
(
    pID IN OUT EXAMPLE_TABLE.ID%type,
    --Other row params here
    pUSER IN EXAMPLE_TABLE.CREATE_USER%type,

    pPLSQLErrorNumber OUT NUMBER, 
    pPLSQLErrorMessage OUT VARCHAR2
)
AS
BEGIN
MERGE INTO USERS_WORKGROUPS_XREF USING dual ON (ID=pID)
    WHEN NOT MATCHED THEN
        INSERT (--OTHER COLS--, CREATE_USER) VALUES (--OTHER COLS--, pUSER)
    WHEN MATCHED THEN
        UPDATE SET
            --OTHER COLS--
            UPDATE_USER=pUSER
        WHERE ID=pID;
    EXCEPTION
        WHEN OTHERS THEN
        pID := 0;
        pPLSQLErrorNumber := SQLCODE;
        pPLSQLErrorMessage := SUBSTR(SQLERRM, 1, 256);
        RETURN;

    -- STATEMENT TO RETURN LAST AFFECTED ID INTO pID GOES HERE
END;
4

1 に答える 1

1

テーブルでシーケンスによって生成された PK の最大値を返そうとしている場合は、その直後に「Select max(id) ..」を実行します。他のセッションもテーブルを変更している場合は、シーケンスの currval を読み取る方がよいでしょう。

于 2013-06-06T15:37:14.097 に答える