Sql 使用大量DML操作提高过程块的性能
编辑-让我重新构造问题。 在最近一次PLSQL开发者职位的面试中,我被问到这样一个问题: 有一个存储过程可以在短时间内跨多个节点同时执行。这会导致表上发生大量事务(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操作的性能 如何提高程序块的性能? 你将如何
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是否因为缺少索引而变慢?如果是这样的话,这是一个快速而简单的解决方法
- 根据您从分析中看到的情况,单线程性能是否存在问题?或者是不同线程相互干扰的问题(例如,存在某种锁争用)?如果您试图调试锁争用,则需要查看锁定行的顺序以及调用过程的方式,以查看是否可以重新组织调用方以最小化争用—例如,如果您有多个调用线程,您希望它们处理不同的帐户,而不是让所有调用线程处理同一帐户的不同事务
- 代码是否进行了大量逐行处理?如果是这样,将其重构为基于集合的处理可能是一个显著的优势。这可以包括将集合传递给过程这样就不必在循环中调用它们
- 程序正在做的事情是否严格来说不需要同步完成?如果是这样的话,您可以通过将它们分解成单独的作业来获得显著的改进。发送电子邮件之类的事情相对容易考虑,但通常还有其他代码片段可以排队,并由不同的进程异步完成
这些项目中的任何一项都(可能)会影响所有不同类型的DML——它们都不是特定于
select
语句与insert
、update
和delete
语句的。我担心这没有任何意义。什么问题需要解决?@AndrewSayer我的错。道歉。我现在修改了这个问题。我相信这应该是有道理的。在“dml运营”云中可能隐藏着很多机会。我们也不知道单次执行的性能是否需要改进,或者问题是否存在于多个并发执行之间的冲突中。“在短时间内同时跨越多个节点”可能是矛盾的。“同时”就是这个意思。“在短时间内”可以在3秒内执行10次,但实际上没有一个是同步的。在股票市场中,经纪人的交易应用程序可以为股票的买卖下数以百万计的订单。大部分事务在几秒钟内跨系统发生,特别是在开始的那一分钟。比如说,一个更新查询正在减慢这个过程。我可以采取哪些步骤来提高查询的性能?不管是股票市场、银行还是本地硬件商店。如果您需要缩短完成交易的时间,原则是相同的。贾斯汀概括了一些好的观点。但是,如果您的任务是重新编写一个特定的过程,那么您必须从代码开始,而我们没有。因此,甚至不可能针对代码本身做出一般性的评论。它可能涉及到许多需要纠正的不良行为。非常感谢你的回答,贾斯汀。这对我很有帮助。