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