Oracle:对于大型数据集,最快的UPSERT方法并返回最后受影响的行ID

本文关键字:最后 返回 影响 ID 方法 UPSERT 数据集 于大型 Oracle | 更新日期: 2023-09-27 18:17:19

所讨论的表模式如下:Oracle SQL:在多列中选择具有最新日期的单行

我正在处理一个有超过500万个条目的表。什么是最快和最准确的方式来倒换这个表,并返回最后一次倒换行id使用存储过程?

我读过的大多数文章都建议对upserts使用merge语句。但是,merge不支持返回到。

在我们的表中,我们有按预期更新的CREATE_DATE、CREATE_USER、UPDATE_DATE和UPDATE_USER字段。我的想法是创建一个存储过程,该过程返回在这两列之间具有最新日期的行id,并且各自的用户数据等于当前用户数据。这是回答参考问题的人帮助我的(谢谢!)。

然而,我担心合并的执行时间与其他方法相比,以及由于合并而在序列中产生的巨大差距。仅仅为了获取id而调用单独的语句似乎也有点低效。然而,几乎我读到的所有东西都说merge比pre-merge upsert语句要快得多。

注意,这些都是通过c#/asp web应用程序调用的。任何帮助都是感激的:)

编辑

下面是我用于Upsert的存储过程的示例。请注意,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;

Oracle:对于大型数据集,最快的UPSERT方法并返回最后受影响的行ID

如果您试图返回表上序列生成的PK的最大值,那么我只需在之后直接运行"Select max(id) .."。如果其他会话也在修改表,那么读取序列的曲线可能会更好。