我的 Oracle 数据库中有一个名为 objectos 的表,其中包含大约 64GB 的数据(或 404 000 000 行数据)。 我正在尝试调整这个 pl/sql 脚本:
declare
cursor c is
select DISTINCT a.object_name, a.object_id, a.dia
from objectos a;
begin
for r in c loop
update objectos
set object_name=r.object_name||object_id, object_id=r.object_id*2
where object_id=r.object_id+3
and dia=r.dia;
end loop;
close c;
end;
/
commit;
由于不同,游标收集了大约 73000 行,并且 select 执行全表扫描,而 update 使用列 object_id 和 dia 的复合索引执行范围扫描(该索引是由于 中的 where 子句而创建的)更新)
在绑定运行脚本时,最重要的等待事件是由更新语句引起的数据库文件顺序读取,从而导致用户 IO 等待时间较长。 目前运行脚本需要很长时间,以至于我一次都没有运行完。
如何减少用户 io 等待时间?还可以做什么来调整这个 Pl/Sql 脚本。
完全跳过 PL/SQL 怎么样?也许合并?
MERGE INTO objectos a
USING (
SELECT DISTINCT object_name, object_id, dia
FROM objectos
) b
ON ( a.object_id = b.object_id + 3
AND a.dia = b.dia)
WHEN MATCHED
THEN
UPDATE SET a.object_name = b.object_name || b.object_id,
a.object_id = b.object_id * 2;