避免在oracle过程中多次使用同一视图

问题描述

我在oracle过程“ TEST PROC”中使用名为V_ENT_MSG的视图,如下所示。在过程内部的多个位置使用同一视图,并且过程执行时间非常长。该视图每次返回超过500万条记录。如何改善程序执行时间。 [请注意,我无法更改视图V_ENT_MSG]。

override func viewDidLoad() {
   super.viewDidLoad()
   self.textfield.isEnabled = false
   //e.g
   self.design.isEnabled = false
}

解决方法

您可以将其重写为多表插入。为此,您需要:

  • (外部)将视图连接到每个表
  • insert all此查询的结果
  • 使用when子句控制哪些行进入哪些表

看起来像这样:

insert all

  when ps.source is not null then
    into outbound1 ( delivery_event_id,message_id )
    values ( delivery_event_id,message_id )

  when ps2.source is not null then
    into outbound2 ( delivery_event_id,message_body )
    values ( delivery_event_id,message_body )

  when ps3.source is not null then
    into outbound3 ( delivery_event_id,subject )
    values ( delivery_event_id,subject )

select v.delivery_event_id,ps3.subject     
from   v_ent_msg v
left join r_source ps     
on     v.primary_source = ps.source
left join r_source2 ps2     
on     v.primary_source = ps2.source
left join r_source3 ps3     
on     v.primary_source = ps3.source;

这假设每个primary_source都连接到r_sourceX中的最多一行。如果它是1:M,并且primary_source的每个值都可以连接到其他每个表中不同数量的行,则会变得棘手。

您需要为每个row_number表中的每个源值分配一个r_sourceX,并仅在其中一个插入那些行。

,

此外,无论您是否按照@Littlefoot的建议选择了GTT,您仍然可以使用此方法。

如何利用INSERT ALLWITH子句来实现相同的目的,

INSERT ALL  
  /* inserting to OUTBOUND1 based on table_name = R_SOURCE defined during union */ 
  WHEN table_name = 'R_SOURCE' THEN
    INTO outbound1(delivery_event_id,message_id) 
    VALUES(delivery_event_id,message_type) 
  /* inserting to OUTBOUND2 based on table_name = R_SOURCE2 defined during union */ 
  WHEN table_name = 'R_SOURCE2' THEN 
    INTO outbound2(delivery_event_id,message_body) 
    VALUES (delivery_event_id,message_type) 
  /* inserting to OUTBOUND3 based on table_name = R_SOURC3 defined during union */ 
  WHEN table_name = 'R_SOURCE3' THEN 
    INTO outbound3(delivery_event_id,subject) 
    VALUES (delivery_event_id,message_type)
WITH ent_msg
AS
(SELECT v2.delivery_event_id,v2.primary_source
    FROM v_ent_msg v2),src_data 
AS 
( SELECT v2.delivery_event_id delivery_event_id,ps.message_id message_type,'R_SOURCE' table_name
    FROM r_source ps
    JOIN ent_msg v2
      ON v2.primary_source = ps.source
  UNION ALL
  SELECT v2.delivery_event_id,ps2.message_body,'R_SOURCE2' table_name
    FROM r_source2 ps2
    JOIN ent_msg v2
      ON v2.primary_source = ps2.source
  UNION ALL
  SELECT v2.delivery_event_id,ps3.subject,'R_SOURCE3' table_name
    FROM r_source3 ps3 
    JOIN ent_msg v2
      ON v2.primary_source = ps3.source
)
SELECT delivery_event_id,message_type,table_name
  FROM src_data

由于缺少表,我无法验证SQL。

在性能问题的情况下,还有其他方法可以将BULK COLLECTLIMIT一起使用。我不知道您要处理的数据集。

希望这可以指导您继续提出问题。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...