试图理解Oracle确定性函数速度测试结果

时间:2014-02-20 18:15:33

标签: sql performance oracle plsql

这个问题是从这个问题中衍生出来的:Adding Many (UDFs) Validation Functions to Oracle - Which Method Run Fastest

我正在讨论将我的应用程序中的所有地方都使用的低级函数放在一个对象中作为CONSTRUCTOR FUNCTION,因此它使用它返回的类型进行封装,或者仅仅创建函数STAND-ALONE 。我知道大多数情况下这些测试结果都是无关紧要的,因为循环计数太高了。但在我们的应用程序中,此函数可用于检查每个大循环迭代中的多个列。因此,我们真的不难在一个过程中达到300万次检查。这一切都报告回网页,因此用户正在等待这些结果,因此每msec都很重要。

所以我正在运行一些结果,这就是我找到的......

/*****
isValid is a CONSTRUCTOR FUNCTION of an OBJECT
and it is deterministic

passing in:
'blah'    -> 12 seconds
x         -> 464 msecs
changing x to varchar2(7)
x         -> 2 seconds (this is how we would use it in most cases within loops)
*****/
declare
x number;
--x varchar2(7);
begin
    for i in 1 .. 3000000 loop
        x := x + 1;
        if (isValid(x,'number').result = 1) then
            null;
        end if;
    end loop;
end;
/

/*****
isValid2 is a STAND-ALONE FUNCTION
and it is deterministic

passing in:
'blah'    -> 407 msecs
x         -> 4 seconds
changing x to varchar2(7)
x         -> 4 seconds (this is how we would use it in most cases within loops)
*****/
declare
x number;
--x varchar2(7);
begin
    for i in 1 .. 3000000 loop
        x := x + 1;
        if (isValid2(x,'number').result = 1) then
            null;
        end if;
    end loop;
end;
/

根据这些结果,我认为我将采用CONSTRUCTOR FUNCTION of an OBJECT方法。

所以我的问题是:为什么'blah'x之间的结果在两种不同的方法之间完全颠倒了?

Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production
PL/SQL Release 11.2.0.2.0 - Production
CORE    11.2.0.2.0  Production
TNS for 64-bit Windows: Version 11.2.0.2.0 - Production
NLSRTL Version 11.2.0.2.0 - Production

PLSQL_OPTIMIZE_LEVEL = 2 (I've never read up on this, this is a test box, I'm not sure what it *should* be set to yet but I will read up on it)

PLSQL_CODE_TYPE = INTERPRETED (I know NATIVE is faster but they won't change it.)

这是独立的功能......

create or replace type valObj as object (
    result     number(1),
    resulttext varchar2(32000) );
/

create or replace function isValid2(v in varchar2, f in varchar2)
return valObj
deterministic
is
  test PLS_INTEGER;
begin
    if f = 'number' then
        begin
            test := to_number(v);
            return valObj(1,null);
            exception when VALUE_ERROR then return valObj(0,'Invalid number. Valid formats are: 12345, 12345.67, -12345, etc...');
        end;
    elsif f = 'phone' then
        null; --TO DO
    elsif f = 'integer' then
        null; --TO DO
    elsif f = 'email' then
        null; --TO DO
    elsif f = 'IPv4' then
        null; --TO DO
    elsif f = 'IPv6' then
        null; --TO DO
    end if;
    --dozens of others to follow....
end;
/

这是对象/功能......

create or replace type isValid as object (
    result     number(1),
    resulttext varchar2(32000),
    constructor function isValid(v varchar, f varchar) return self as result deterministic );
/

create or replace type body isValid as
    constructor function isValid(v varchar, f varchar) return self as result deterministic is
        test PLS_INTEGER;
    begin
        if f = 'number' then
            begin
                test := to_number(v);
                self.result := 1;
                self.resulttext := null;
                return;
                exception when VALUE_ERROR then
                    self.result := 0;
                    self.resulttext := 'Invalid number. Valid formats are: 12345, 12345.67, -12345, etc...';
                    return;
            end;
        elsif f = 'phone' then
            null; --TO DO
        elsif f = 'integer' then
            null; --TO DO
        elsif f = 'email' then
            null; --TO DO
        elsif f = 'IPv4' then
            null; --TO DO
        elsif f = 'IPv6' then
            null; --TO DO
        end if;
        --dozens of others to follow....
    end;
end;
/

0 个答案:

没有答案