带有顶部等待事件的 PL/SQL 脚本:DB_File_Sequential_Read

问题描述 投票:0回答:1

我的 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 脚本。

oracle performance plsql query-optimization
1个回答
0
投票

完全跳过 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;
© www.soinside.com 2019 - 2024. All rights reserved.