Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Sql 使用大量DML操作提高过程块的性能_Sql_Oracle_Plsql_Transactions - Fatal编程技术网

Sql 使用大量DML操作提高过程块的性能

Sql 使用大量DML操作提高过程块的性能,sql,oracle,plsql,transactions,Sql,Oracle,Plsql,Transactions,编辑-让我重新构造问题。 在最近一次PLSQL开发者职位的面试中,我被问到这样一个问题: 有一个存储过程可以在短时间内跨多个节点同时执行。这会导致表上发生大量事务(DML操作-插入、更新和删除) 例如: CREATE OR REPLACE PROCEDURE high_vol_sp() AS BEGIN DML OPERATIONS COMMIT; END high_vol_sp; 我应该创建一个PLSQL存储过程或修改现有过程,以提高大量DML操作的性能 如何提高程序块的性能? 你将如何

编辑-让我重新构造问题。 在最近一次PLSQL开发者职位的面试中,我被问到这样一个问题:

有一个存储过程可以在短时间内跨多个节点同时执行。这会导致表上发生大量事务(DML操作-插入、更新和删除)

例如:

CREATE OR REPLACE PROCEDURE high_vol_sp() AS

BEGIN

DML OPERATIONS
COMMIT;
END high_vol_sp;
我应该创建一个PLSQL存储过程或修改现有过程,以提高大量DML操作的性能

如何提高程序块的性能? 你将如何处理这个问题? 您将使用哪种类型的SQL语句来解决此问题

客户要求编写SQL查询来处理这种情况。 没有提供其他文件

其与交易/核心银行领域相关。 谁能为这个问题提供解决办法

我考虑使用集合数组和FORALL来执行大容量插入。
但是想不出更新或删除的解决方案。

我可能会先对代码进行一些分析。除非你知道什么东西特别慢,否则试图提高性能是没有意义的。在面试中,这将给你机会谈论AWR、ADDR和ASH报告、10046痕迹等

一旦你知道DML的质量实际上是慢的,你就可以开始调整了

  • 简单地开始——一些DML是否因为缺少索引而变慢?如果是这样的话,这是一个快速而简单的解决方法
  • 根据您从分析中看到的情况,单线程性能是否存在问题?或者是不同线程相互干扰的问题(例如,存在某种锁争用)?如果您试图调试锁争用,则需要查看锁定行的顺序以及调用过程的方式,以查看是否可以重新组织调用方以最小化争用—例如,如果您有多个调用线程,您希望它们处理不同的帐户,而不是让所有调用线程处理同一帐户的不同事务
  • 代码是否进行了大量逐行处理?如果是这样,将其重构为基于集合的处理可能是一个显著的优势。这可以包括将集合传递给过程这样就不必在循环中调用它们
  • 如果你做了很多不能合理重构的逐行处理,请考虑使用带有代码的集合>批量收集< /COD>和<代码> FALL/<代码> .
  • 程序正在做的事情是否严格来说不需要同步完成?如果是这样的话,您可以通过将它们分解成单独的作业来获得显著的改进。发送电子邮件之类的事情相对容易考虑,但通常还有其他代码片段可以排队,并由不同的进程异步完成

这些项目中的任何一项都(可能)会影响所有不同类型的DML——它们都不是特定于
select
语句与
insert
update
delete
语句的。我担心这没有任何意义。什么问题需要解决?@AndrewSayer我的错。道歉。我现在修改了这个问题。我相信这应该是有道理的。在“dml运营”云中可能隐藏着很多机会。我们也不知道单次执行的性能是否需要改进,或者问题是否存在于多个并发执行之间的冲突中。“在短时间内同时跨越多个节点”可能是矛盾的。“同时”就是这个意思。“在短时间内”可以在3秒内执行10次,但实际上没有一个是同步的。在股票市场中,经纪人的交易应用程序可以为股票的买卖下数以百万计的订单。大部分事务在几秒钟内跨系统发生,特别是在开始的那一分钟。比如说,一个更新查询正在减慢这个过程。我可以采取哪些步骤来提高查询的性能?不管是股票市场、银行还是本地硬件商店。如果您需要缩短完成交易的时间,原则是相同的。贾斯汀概括了一些好的观点。但是,如果您的任务是重新编写一个特定的过程,那么您必须从代码开始,而我们没有。因此,甚至不可能针对代码本身做出一般性的评论。它可能涉及到许多需要纠正的不良行为。非常感谢你的回答,贾斯汀。这对我很有帮助。