【问题标题】:PLSQL: Alternative to Stored Procedure for optimal performancePLSQL:存储过程的替代方案以获得最佳性能
【发布时间】:2016-03-10 02:13:17
【问题描述】:

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

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

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

我请您建议这种方法是否适用于这些批量数据,或者我们仍然可以以更好的最佳 Oracle 概念执行此任务。在此之前我曾研究过 TSQL,而 PLSQL 对我来说是新的,因此任何建议都会非常有帮助。谢谢

【问题讨论】:

  • “业务逻辑”步骤是否过于复杂而无法使用简单的 SQL insert ... select 语句,没有任何 PL/SQL 或 GTT?
  • 没有@AlexPoole,其实业务逻辑并不复杂,我只是对大容量数据感到好奇。 GTT 能否高效处理 2500 万条数据??
  • 你需要考虑 GTT 或收集方法的内存开销;只要逻辑不适用于多行,带有限制的集合(如托尼所示)就可以避免这是一个问题。普通 SQL 可能仍然更有效,但与很多事情一样,它取决于...

标签: oracle11g


【解决方案1】:

在 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

【讨论】:

  • 感谢@TonyAndrews 的建议,我将在我的代码中尝试这个。一个查询,使用游标需要循环,这被认为是耗时的。游标数组概念将适合 2500 万条记录。请提出建议。
  • 如果不详细了解您的要求,很难说。如果业务逻辑足够简单,可以在 SQL 中执行,则使用 insert...select 并完全避免使用游标。但是,如果您需要为每一行执行一些程序,而不能在 select 语句本身中完成,那么我展示的方法被认为是最好的方法。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多