Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Oracle中的条件插入或更新_Performance_Oracle_Stored Procedures_Insert - Fatal编程技术网

Performance Oracle中的条件插入或更新

Performance Oracle中的条件插入或更新,performance,oracle,stored-procedures,insert,Performance,Oracle,Stored Procedures,Insert,我在oracle中有一个表,其中数据是从第三方插入的。我想从该表填充主表。那么,在性能方面使用集合的最佳方式是什么呢 例如,假设从第三方填充数据的表格为“EMP_TMP” 现在我想通过从EMP_TMP表填充的过程填充“EMPLOYEE”主表 这里还有一个条件,比如如果相同的EMPID这不是主键,那么我们必须更新包含相同EMPID的完整表,否则我们必须插入新记录 [注意:这里EMPID是VARCHAR2,EMPNO将是主键,我们将使用SEQUENCE] 我认为这里merge不会有更好的性能,因为我

我在oracle中有一个表,其中数据是从第三方插入的。我想从该表填充主表。那么,在性能方面使用集合的最佳方式是什么呢

例如,假设从第三方填充数据的表格为“EMP_TMP”

现在我想通过从EMP_TMP表填充的过程填充“EMPLOYEE”主表

这里还有一个条件,比如如果相同的EMPID这不是主键,那么我们必须更新包含相同EMPID的完整表,否则我们必须插入新记录

[注意:这里EMPID是VARCHAR2,EMPNO将是主键,我们将使用SEQUENCE]


我认为这里merge不会有更好的性能,因为我们不能在merge语句中使用collection

好吧,如果性能是您主要考虑的因素,而您不喜欢合并,那么这个以脚本形式运行的单事务如何:

delete from EMPLOYEE where emp_id IN (
select emp_id from EMP_TMP);

insert into EMPLOYEE
select * from EMP_TMP;

commit;

显然不是最安全的方法,正如所写的那样,假设表定义完全相同,并且您有回滚功能,但是应该很快,您也可能会在vs EXISTS等中遇到麻烦。如果emp_id或emp_no是这两个表中的公用键,我无法完全理解您的帖子,但是,在您的情况下使用任何有意义的方法。

创建一个过程,您需要使用PL/SQL。 首先执行更新,然后测试sql%rowcount。 如果为0,则在完成的位置没有更新,您必须执行插入

我认为这是相当有效的

伪码

Update table;
if sql%rowcount = 0 then
   //get new sequence number
   insert into table;
END IF;
COMMIT;

Harv

您需要更好地解释为什么合并不起作用。它是为这种上插式场景而设计的。另一种方法是回到旧式的预合并,它是两条语句,一条用于更新的内部连接和一条用于插入的左反连接。我知道合并会起作用。如果它能提供比批量收集更好的性能,对我来说就可以了。这里的数据也将是10万字节。@user1017936-一条SQL语句,无论是插入、更新、删除还是合并,都比编写模拟相同操作的循环代码更有效。使用BULK COLLECT可以提高循环代码的效率,但不会比SQL更有效。即使是在几十万行的情况下,这也是一个很小的数据集-两者之间的性能应该不会有很大的差异。除非您已经显示出性能问题,否则您是在预先优化-做可维护的事情并遵守您的标准-像这样从一个小型ETL中拖出一到两秒钟的性能不太可能保证这一点。我不限制只使用SQL。我也可以使用过程,如果有人能给我看基于批量收集的脚本会更好。我不能使用delete,因为这里emp_id是序列生成的主键,以后它还会有子记录。作为参考,empid将类似于1,2,emp_no将类似于VARCHAR2的'ABC','DEF'@user1017936-您在评论中所说的与您在问题中所说的完全相反。请拿定主意。不管怎么说,只要你有一个激活键,激活键是什么并不重要。删除目标表中某个键与源表中某个键匹配的记录,然后将临时记录插入目标表,这与执行UPDATE FULL table完全相同,多亏了大家的解决方案。你们能澄清最后一件事吗。现在,哪个更新运行得更快。无论是通过合并还是使用伪代码?我很确定合并会运行得更快,但我不能确定这一点。这需要多久运行一次?每次运行时将处理多少条记录?这将在夜间计划的作业中运行。记录的数量不会太大,因为这里的数据是用于主表的