Oracle SQL小示例系列-引擎

        

        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引擎相关内容。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能的一个重要因素就是sql性能问题。本书是作者十年磨一剑的成果之一,深入分析与解剖oracle sql优化与调优技术,主要内容包括: 第一篇“执行计划”详细介绍各种执行计划的含义与操作,为后面的深入分析打下基础。重点讲解执行计划在sql语句执行的生命周期中所处的位置和作用,sql引擎如何生成执行计划以及如何获取sql语句的执行计划,如何从各种数据源显示和查看已经生成的执行计划。 第二篇“sql优化技术”深入分析oraclesql优化技术,包括逻辑优化技术和物理优化技术。用大量示例详尽分析oracle 中现有的各种查询转换技术,先分析oracle如何收集、统计系统和对象的数据,然后推导各种代价估算公式,给出各种情形下的代价计算演示。 第三篇“sql调优技术”深入剖析oracle提供的各项调优技术。先对语句实际运行的性能统计数据进行了深度分析,介绍各项统计数据是由什么操作导致的以及如何统计。然后介绍如何对sql语句进行优化以获得稳定、高效的性能。最后,依据对sql优化及调优技术的分析,介绍如何快速优化sql的思路。 《oracle 高性能sql引擎剖析:sql优化与调优机制详解》内容丰富且深入,破解了oracle技术的很多秘密,适合oracle数据库管理员、应用开发人员参考。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值