問題のこのテーブル スキーマは次のとおりです: Oracle SQL: Selecting a single row with the latest date between multiple columns
500 万を超えるエントリを持つテーブルを使用しています。このテーブルに upsert し、ストアド プロシージャを使用して最後に upserted された行 ID を返す最も速くて正確な方法は何ですか?
私が読んだことのほとんどは、アップサートにマージステートメントを使用することを推奨しています。ただし、merge はへの復帰をサポートしていません。
このテーブルには、期待どおりに更新された 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;