`
dahai639
  • 浏览: 14497 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

SQL 解析过程及效率提升

阅读更多

   一 、 sql 的执行过程

    通常情况下,SQL语句的执行过程如下:

    a.SQL代码的语法(语法的正确性)及语义检查(对象的存在性与权限)

    b.SQL代码的文本进行哈希得到哈希值。

    c.如果共享池中存在相同的哈希值,则对这个命令进一步判断是否进行软解析,否则到e步骤。

    d.对于存在相同哈希值的新命令行,其文本将与已存在的命令行的文本逐个进行比较。这些比较包括大小写,字符串是否一致,空格,注释

        等,如果一致,则对其进行软解析,转到步骤f。否则到d步骤。

    e.硬解析,生成执行计划。

    f.执行SQL代码,返回结果。

二、硬解析,软解析

   不能硬解析的情况:对象大小写不同,值不同。

三、硬解析的弊端

        硬解析即整个SQL语句的执行需要完完全全的解析,生成执行计划。而硬解析,生成执行计划需要耗用CPU资源,以及SGA资源。在此不

    得不提的是对库缓存中闩的使用。闩是锁的细化,可以理解为是一种轻量级的串行化设备。当进程申请到闩后,则这些闩用于保护共享内存

    的数在同一时刻不会被两个以上的进程修改。在硬解析时,需要申请闩的使用,而闩的数量在有限的情况下需要等待。大量的闩的使用由此

    造成需要使用闩的进程排队越频繁,性能则逾低下。

四、硬解析和软解析效率比较

 

1.创建一个测试表

create table efftable
   (
    idd integer
   );

2.创建无参数绑定存储过程

   create or replace procedure pro_notbind as
begin
 for i in 1..1000 loop
 execute immediate 'insert into efftable (idd) values ('
 || i || ')';
 end  loop;
 commit;
 end;

3.创建参数绑定存储过程

create or replace procedure pro_bind as
begin
 for i in 1..1000 loop
 execute immediate 'insert into efftable (idd) values (:x)'
 using i;
 end  loop;
 commit;
 end;

 

4.分别执行pro_notbind ,pro_bind

执行pro_notbind 花费的时间大约为11s

执行pro_bind 花费的时间大约为0.047s

另外也可以sql记录表v$sqlarea中查询sql的执行情况:
第一个在v$sqlarea有1000条记录。

 

五、编码硬解析的改进方法

 1.更改参数cursor_sharing

        参数cursor_sharing决定了何种类型的SQL能够使用相同的SQL area

        CURSOR_SHARING = { SIMILAR | EXACT | FORCE }   

            EXACT      --只有当发布的SQL语句与缓存中的语句完全相同时才用已有的执行计划。

            FORCE      --如果SQL语句是字面量,则迫使Optimizer始终使用已有的执行计划,无论已有的执行计划是不是最佳的。

            SIMILAR    --如果SQL语句是字面量,则只有当已有的执行计划是最佳时才使用它,如果已有执行计划不是最佳则重新对这个SQL

                       --语句进行分析来制定最佳执行计划。

 

        2.使用绑定变量 绑定变量要求变量名称,数据类型以及长度是一致,否则无法使用软解析

六、总结

    1.尽可能的避免硬解析,因为硬解析需要更多的CPU资源,闩等。

 

    2.cursor_sharing参数应权衡利弊,需要考虑使用similarforce带来的影响。

    3.尽可能的使用绑定变量来避免硬解析。

分享到:
评论

相关推荐

    sql优化规则详解(一些小总结)

    sql优化规则详解(一些小总结) 从sql语句的写法来描述如何提高效率

    ORACLE优化SQL语句,提高效率

     Oracle在解析的过程中, 会将‘*’依次转换成任何的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。  (4)减少访问数据库的次数:  Oracle在内部执行了许多工作: 解析SQL语句, 估算索引的...

    SQL查询安全性及性能优化

     优化:【检查SQL语句是否能够使用索引,SQL语句如何执行效率高,制定一个执行计划】  编译:  执行SQL语句:【把编译过的查询要求提交并进行处理】 如何优化SQL 完善开发的管理 完善代码审核、测试机制,...

    ORACLE数据库中SQL优化解析

    本文介绍了SQL的执行过程,ORACLE优化器的基本原理,优化器的选择和应用,以及如何建立 和管理索引来提高程序的执行效率。并以实际工作经验介绍了优化工具以及提出对SQL优化的体会。

    SQL数据库存储过程示例解析

    然而存储过程是一个编译过的代码块,所以执行效率要比T-SQL语句高。 2.一个存储过程在程序在网络中交互时可以替代大堆的T-SQL语句,所以也能降低网络的通信量,提高通信速率。 3.通过存储过程能够使没有权限的用户在...

    Oracle+SQL大全解析

    3.16 通过内部函数提高 SQL 效率............................................................................ 18 3.17 使用表的别名(Alias) ....................................................................

    SQL解析在美团点评中的应用

    数据库作为核心的基础组件,是需要重点保护的对象。任何一个线上的不慎操作,都有可能给数据库带来严重的故障,...如何更多的依赖技术手段,来提高效率,越来越受到重视。业界已有不少基于MySQL源码开发的SQL审核、优

    oracle的sql优化

    oracle的sql优化方法 1.全表扫描和索引扫描  大数据量表尽量要避免全表扫描,全部扫描会按顺序每条记录扫描,对于>100万数据表影响很大。  Oracle中通过RowID访问数据是最快的方式  对字段进行函数转换,或者前...

    存储过程的安全及性能优化

    解析阶段:指某个存储过程首次执行时,查询处理器从sys.sql_modules目录视图中读取该存储过程的文本并且检查该过程引用的对象是否存在的过程。 编译阶段:指分析存储过程和生成存储过程执行计划的过程。执行计划是...

    Oracle提高sql执行效率的心得建议

    被程序语句获得的锁 3.redo log buffer –>把Alias前缀于每个Column上可以减少解析的时间 –>ORACLE解析sql语句时会把小写的字母转换成大写的再执行 –>在索引列上使用NOT会停止使用索引转而执行全表扫描 –>在索引...

    oracle_sql性能优化

    你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此...

    ORACLE SQL性能优化系列

    你可以采用基于ROWID的访问方式情况,提高访问表的效率, , ROWID包含了表中记录的物理位置信息..ORACLE采用索引(INDEX)实现了数据和存放数据的物理位置(ROWID)之间的联系. 通常索引提供了快速访问ROWID的方法,因此...

    【MySQL】SQL优化(九).pdf

    开发者:对于使用MySQL进行应用开发的开发者,本资源包提供了深入的技术解析和最佳实践,帮助开发者优化数据库性能,提升应用质量。 技术爱好者:对于对MySQL技术感兴趣的技术爱好者,本资源包提供了丰富的技术资料...

    【MySQL】SQL性能分析 (七).pdf

    开发者:对于使用MySQL进行应用开发的开发者,本资源包提供了深入的技术解析和最佳实践,帮助开发者优化数据库性能,提升应用质量。 技术爱好者:对于对MySQL技术感兴趣的技术爱好者,本资源包提供了丰富的技术资料...

    深入解析MySQL视图、索引、数据导入导出:优化查询和提高效率

    t_log.sql表里的数据

    【开发者工具箱】 一款轻量级开发者工具,提高开发效率

    Devkits 是一款轻量级桌面端应用,提供了一系列开发者工具,提高开发效率。 离线。类似的在线工具已经不少了,但是大多数都是在线的,网络不好的时候就很难用了。Devkits 提供了离线使用的功能,可以在没有网络的...

    关系型数据库性能体系设计和效率提升.docx

    关系型数据库性能体系,设计和效率提升 1 1 前言 2 1.1目的 2 1.2预期的读者和阅读建议 2 2 数据库模型设计规范 2 2.1 数据库建模原则性规范 2 2.2 实体型之间关系认定规范 2 2.3 范式化1NF的规范 3 2.4 范式化2NF的...

    【MySQL】存储过程(十一).pdf

    开发者:对于使用MySQL进行应用开发的开发者,本资源包提供了深入的技术解析和最佳实践,帮助开发者优化数据库性能,提升应用质量。 技术爱好者:对于对MySQL技术感兴趣的技术爱好者,本资源包提供了丰富的技术资料...

    DataGrip 2023 2 1,国内快速下载

    让您详细了解查询的工作原理与数据库引擎的行为,以此提高查询的效率。 智能代码补全 DataGrip 提供了可以感知上下文的代码补全,有助于您更快速地编写 SQL 代码。 自动补全可以识别表结构、外键,甚至是在所编辑的...

Global site tag (gtag.js) - Google Analytics