Oracle数据库中使用的引擎众多,此篇文章主要是讲解ORACLE数据库中的主要引擎:SQL引擎和PLSQL引擎,PL/SQL 引擎把DML 语句发送给SQL 引擎,然后由SQL 引擎执行,执行完毕后,SQL 引擎把结果集在发送给PL/SQL 引擎,则会涉及SQL引擎和PLSQL引擎的转换,在频繁的切换会降低效率,影响性能。

SQL引擎与PLSQL引擎转换:

Oracle SQL小示例系列-引擎

        sql引擎是标准sql处理引擎,而plsql引擎主要是用于处理序列、函数、过程、包等。当SQL语句中嵌套了函数,则PLSQL引擎会将DML语句发送给SQL引擎,有SQL引擎执行,等结果发送给PLSQL引擎,实现了PLSQL引擎与SQL引擎的切换。

简单示例:

此处示例来源于公司的一个Oracle数据专家提供,目的给我们了解在没有引擎转换和引擎转换的场景中的耗时性。

举一个简单的例子,在过程中,我们把函数结果赋值给一个变量有两种方式:

1、直接赋值:

变量名:=函数名(参数);

 

2、通过伪表dual查询赋值:

select 函数名(参数) into 变量名 from dual;

无引擎转换代码:

DECLARE

  V_BEGIN        NUMBER(10);

  V_END          NUMBER(10);

 

  V_I            NUMBER(10);

 

  V_CURRTIME     NUMBER(12,2);

  V_USETIME      NUMBER(12,2);

 

  V_DATE         DATE;

BEGIN

  SELECT VALUE INTO V_BEGIN FROM V$SESS_TIME_MODEL WHERE SID=SYS_CONTEXT('USERENV','SID') AND STAT_NAME='DB CPU';

  V_CURRTIME:=DBMS_UTILITY.GET_TIME;

 

  FOR V_I IN 1..100000

    LOOP

      V_DATE:=SYSDATE;

--      SELECT SYSDATE INTO V_DATE FROM DUAL;

    END LOOP;

  V_USETIME:=(DBMS_UTILITY.GET_TIME-V_CURRTIME)/100;

 

  DBMS_LOCK.SLEEP(15);

  SELECT VALUE INTO V_END FROM V$SESS_TIME_MODEL WHERE SID=SYS_CONTEXT('USERENV','SID') AND STAT_NAME='DB CPU';

  DBMS_OUTPUT.PUT_LINE('无引擎转换耗时:'||TO_CHAR(V_USETIME,'990.00')||'秒,CPU消耗次数:'||TO_CHAR(V_END-V_BEGIN));

END;

有引擎转换代码:

DECLARE

  V_BEGIN        NUMBER(10);

  V_END          NUMBER(10);

 

  V_I            NUMBER(10);

 

  V_CURRTIME     NUMBER(12,2);

  V_USETIME      NUMBER(12,2);

 

  V_DATE         DATE;

BEGIN

  SELECT VALUE INTO V_BEGIN FROM V$SESS_TIME_MODEL WHERE SID=SYS_CONTEXT('USERENV','SID') AND STAT_NAME='DB CPU';

  V_CURRTIME:=DBMS_UTILITY.GET_TIME;

 

  FOR V_I IN 1..100000

    LOOP

--      V_DATE:=SYSDATE;

      SELECT SYSDATE INTO V_DATE FROM DUAL;

    END LOOP;

  V_USETIME:=(DBMS_UTILITY.GET_TIME-V_CURRTIME)/100;

 

  DBMS_LOCK.SLEEP(15);

  SELECT VALUE INTO V_END FROM V$SESS_TIME_MODEL WHERE SID=SYS_CONTEXT('USERENV','SID') AND STAT_NAME='DB CPU';

  DBMS_OUTPUT.PUT_LINE('有引擎转换耗时:'||TO_CHAR(V_USETIME,'990.00')||'秒,CPU消耗次数:'||TO_CHAR(V_END-V_BEGIN));

END;


运行结果分别如下:

无引擎转换耗时:   0.07秒,CPU消耗次数:78125

有引擎转换耗时:   1.94秒,CPU消耗次数:1953125


从上述Oracle数据库中引擎切换是很消耗性能的,大家可以尝试理解Oracle数据库中的SQL引擎相关内容。


Oracle SQL小示例系列-引擎

相关文章:

  • 2022-12-23
  • 2021-09-24
  • 2021-11-30
  • 2022-12-23
  • 2021-04-23
  • 2021-12-06
  • 2021-08-31
  • 2021-07-10
猜你喜欢
  • 2021-05-29
  • 2021-09-27
  • 2022-12-23
  • 2021-08-12
  • 2021-06-07
  • 2021-07-26
  • 2021-12-18
相关资源
相似解决方案