问题描述
我在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 ALL
和WITH
子句来实现相同的目的,
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 COLLECT
与LIMIT
一起使用。我不知道您要处理的数据集。
希望这可以指导您继续提出问题。