Plsql 如何优化此PL/SQL块?
我需要将名为Plsql 如何优化此PL/SQL块?,plsql,Plsql,我需要将名为table\u的表中名为text的列更新为\u update。字段text是另一个名为other\u table的表中3个字符串的浓缩。脚本按预期工作,但问题是执行时间较长(>20小时),因为表表\u to\u update中大约有2000万个数据集需要更新 有什么办法可以改进这个脚本的性能吗 DECLARE v_field1 VARCHAR(20); v_field2 VARCHAR(20); v_field3 VARCHAR(20); v_text VARCHAR(100
table\u的表中名为text
的列更新为\u update
。字段text
是另一个名为other\u table
的表中3个字符串的浓缩。脚本按预期工作,但问题是执行时间较长(>20小时),因为表表\u to\u update
中大约有2000万个数据集需要更新
有什么办法可以改进这个脚本的性能吗
DECLARE
v_field1 VARCHAR(20);
v_field2 VARCHAR(20);
v_field3 VARCHAR(20);
v_text VARCHAR(100);
BEGIN
FOR rec IN (select t_pk from table_to_update where state = 'STATE_1' and text is null order by t_pk desc) -- 20 millions data sets
LOOP
v_text := null;
FOR other_record IN (select distinct field1, field1, field3 from other_table where t_fk = rec.t_pk)
LOOP
v_field1 := other_record.field1;
v_field2 := other_record.field2;
v_field3 := other_record.field3;
v_text := v_text || v_field2 || ';' || v_field1 || ': '|| v_field3 || ' ';
END LOOP;
update table_to_update set text = v_text where t_pk = rec.t_pk;
END LOOP;
COMMIT;
END;
一般来说,优化PL/SQL块的最佳方法是尽量减少上下文切换的数量(即从过程代码切换到SQL并返回的频率)。在这种情况下,您可以将该块简化为一条语句(假设您使用的是11g或更高版本):
是一个聚合函数,用于连接获得的值 从不同的行。它是在11g中引入的LISTAGG
- 您也可以将其作为
,但我更喜欢更新
合并
MERGE
语句的注释。:)问题是他显然在更新2000万条记录。通过1条更新声明处理所有这些问题,他将看到显著的性能提升。感谢您快速的回答。我会尝试一下,很快会回答你。
MERGE INTO table_to_update t2u
USING (SELECT t_fk,
LISTAGG (field2 || ';' || field1 || ': ' || field3, ' ')
WITHIN GROUP (ORDER BY field2)
AS agg_field
FROM other_table
GROUP BY t_fk) ot
ON (ot.t_fk = t2u.t_pk)
WHEN MATCHED THEN
UPDATE SET
t2u.text = ot.agg_field
WHERE t2u.state = 'STATE_1' AND t2u.text IS NULL