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