1

我有一张旧桌子和一张新桌子。在旧表中,有一VARCHAR2列名为number,其值类似于11-38D40234211-38D402342/43。还有一些糟糕的数据,但永远不会为空。

在新表中,有两VARCHAR2number_leftnumber_right。这两个是从旧表的数字列中填充的:

number_left  = nvl(substr(number,1,instr(number,'/',1)-1),number)
number_right = substr(number,1,instr(rtrim(number,'/'),'/',1)-length(substr(number,instr(number,'/'))))||substr(number,decode(instr(number,'/'),0,null,instr(number,'/')+1))

经过其他一些决定,我们现在只需要一列。为了确保正确设置复制的数字,我决定使用旧表的数字和使用的转换来识别匹配的行。

我有一个映射但不能使用它,因为 number_left 和 number_right 可以由应用程序复制到新行中,并且也必须获取旧号码。因此,可以将许多旧表复制到新表中的多行中。

我尝试使用此代码:

declare
    left_num varchar2(255 char) := '';
    right_num varchar2(255 char) := '';
    pos number := 0;
    CURSOR c_number is
        select number from old_table;
begin
    for cur in c_number loop
        left_num := nvl(substr(cur.number,1,instr(cur.number,'/',1)-1),cur.number);
        if instr(cur.number,'/') = 0 then
          pos := null;
        else
          pos := instr(cur.number,'/')+1;
        end if;
        right_num := substr(cur.number,1,instr(rtrim(cur.number,'/'),'/',1)-length(substr(cur.number,instr(cur.number,'/'))))||substr(cur.number, pos);

        update new_table n
            set n.number = cur.snummer
            where n.number_left = left_num
            and (
              n.number_right = right_num
              or (
                n.number_right is null
                and right_num is null
              )
            );
    end loop;
end;

在旧表中,我有 170.000 行,而在新表中,我有 180.000 行,因为还有一些新数据。花生。

但奇怪的部分来了:一切似乎都运行良好,但在前 14.000 行之后,它变得非常慢,可能在一秒钟内 3 行。而且我认为它变得越来越慢。

任何想法?

4

1 回答 1

0

您应该学习如何跟踪数据库中 SQL 的性能,而不是让一堆随机的猜测者猜测。有几种不同的方法可以让您深入了解语句的性能,但您将需要某种级别的 DBA 类型的访问权限。

这是官方文档中涵盖的领域,但我建议您从 Tim Hall 的出色概述开始。 在这里找到它

于 2012-10-16T07:50:38.657 回答