PLSQL:替代存储过程以获得最佳性能

时间:2016-03-09 17:33:50

标签: oracle11g

我被要求提供执行以下任务的最佳方法,

我们有一个从多个表中提取数据的视图,我们必须对这些提取的数据执行一些业务逻辑,然后将处理后的数据插入另一个表中。这里的问题是View非常复杂,并且在执行时会提取40百万条记录,这些记录本身会花费大量时间执行。但是在这些记录中,我们必须在大约2500万条记录上执行逻辑。

为此,我建议了一种方法,在全局临时表中插入这些24百万条记录,并在该临时表上执行所有业务逻辑,然后将处理后的数据插入到最终表中。

我请求您建议这种方法对于这种批量数据是否合适,或者我们仍然可以在更好的Oracle概念中执行此任务。我之前在TSQL上工作过,PLSQL对我来说是新手,因此任何建议都会非常有用。感谢

1 个答案:

答案 0 :(得分:2)

在Oracle中,您通常不需要使用全局临时表来进行此类操作,而是可以对数组使用批量处理:

declare
   cursor c is
      select col1, col2 from my_view;
   type t is table of c%rowtype;
   array t;
begin
   open c;

   loop
      fetch c bulk collect into array limit 1000;
      exit when array.count = 0;

      for i in 1..array.count loop
         null; -- Perform business logic on array(i) here
      end loop;

      forall i in 1..array.count
         insert into final_table (col1, col2)
            values (array(i).col1, array(i).col2);

   end loop;

   close c;
end;

这只是一个最小的例子 - 有关更多详情,请参阅this article