我有一个从光标中选取记录的作业,然后它调用一个存储过程来处理从光标中拾取的记录。
存储过程有多个查询来处理记录。总之,过程大约需要0.3秒来处理光标拾取的单个记录,但由于光标包含超过100k的记录,因此完成作业需要数小时。
存储过程中的查询都已优化
我正在考虑使用java和其他编程语言以多线程方式运行该过程。 可以在oracle中完成吗?还是有其他方法可以缩短我的工作时间。
答案 0 :(得分:0)
我同意有关循环中处理游标的注释。正如Tom Kyte经常说的那样,#Row一次[处理]一时很慢&#34 ;; Oracle在基于集合的操作中表现最佳,一次一行的操作通常具有可伸缩性问题(即,当数据库上的内容发生变化时,例如CPU容量,工作负载,需要处理的记录数量,大小变化时,性能很差基础表,...)。
您可能已经知道Oracle自8i以来内置了一个内置于数据库引擎的Java VM,因此您可以将Java代码包含为PL / SQL,但这不适合胆小的人[不是说那个你就是这样说的。
在重新编写应用程序之前,我建议使用以下调整方法,因为它可能会产生一些可操作的调整[假设诊断和调优包许可证;不会消除可扩展性问题但可能会减少它们的影响]:
在oracle 11g及以上版本中:
查找gv $ active_session_history和dba_hist_active_sess_history中记录的顶级sql id以调用PL / SQL过程。
检查top_level_sql_id下sql_id的等待事件。 (他们告诉你SQL正在等待什么)。
在sql_id&#39>上运行调优顾问程序,并检查是否有任何调整建议。有时,如果SQL已经亚秒级,那么在多次调用时,从百分之一秒到千分之一秒可以产生很大的影响。
运行过程运行期间的ADDM报告。通常你会发现繁重的PL / SQL进程需要增加PGA。此外,ADDM可能会建议其他相关操作(例如,增加SGA,会话缓存游标,db编写器进程,日志缓冲区,运行段调整顾问,......)