游标中更新的奇怪运行时行为

时间:2012-10-16 07:14:29

标签: sql oracle cursor oracle11g

我有一张旧桌子和一张新桌子。在旧表格中,有一个名为VARCHAR2的{​​{1}}列,其值为number11-38D402342。还有一些糟糕的数据,但永远不会为空。

在新表格中,有两个11-38D402342/43VARCHAR2number_left。这两个是从旧表的数字栏填写的:

number_right

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

我有一个映射但不能使用它,因为number_left和number_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))

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

但是这里有一个奇怪的部分: 一切似乎工作正常,但在第一个14.000行后,它变得非常慢,可能在一秒钟内有3行。我认为它变得越来越慢。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

不要让一群随机的星形人员猜测你应该学习如何跟踪数据库中SQL的性能。您可以通过几种不同的方式深入了解语句的性能,但是您将获得某种级别的DBA类型访问权限。

the official documentation这是一个涵盖的领域,但我建议你从Tim Hall的精彩概述开始。 Find it here