`
dahai639
  • 浏览: 15009 次
  • 性别: 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.尽可能的使用绑定变量来避免硬解析。

分享到:
评论

相关推荐

    java的sql解析器jsqlparser

    Java的SQL解析器JSQLPaser是一个强大的开源库,专门设计用于处理SQL语句的解析工作。这个库允许开发者分析SQL语句的结构,提取出其中的关键元素,如列名、表名、别名以及查询条件,从而在Java应用程序中实现对SQL的...

    基于gsp的sql解析工具

    这个工具在数据库管理和数据分析领域具有广泛的应用价值,对于理解和优化复杂的数据库结构,以及提升数据处理效率具有重要意义。 【描述】"基于gsp的SQL解析工具"的核心在于GSP,这是一个强大的开源SQL解析库,它...

    c++解析sql,存储过程

    在IT行业中,C++是一种强大的编程语言,常用于构建高性能的应用程序,包括数据库接口和解析器。...通过解析存储过程,可以自动化一些元数据的提取工作,提高开发效率,并有助于理解和优化数据库设计。

    sql解析代码

    文章链接中提到的博客详细介绍了SQL解析的过程,它可能涉及使用如ANTLR或JavaCC等解析器生成器来创建自定义的SQL解析器。这些工具可以生成符合特定SQL语法规则的解析代码,使得开发人员能够根据需求定制解析逻辑。 ...

    基于gudusoft的sql解析项目

    总的来说,基于Gudusoft的SQL解析项目为开发者提供了强大的SQL处理能力,帮助他们更好地理解和操作数据库,提升开发效率。通过深入理解和利用这个工具,可以解决许多数据库相关的复杂问题,推动项目的成功实施。

    sql解析器

    SQL解析器是数据库管理系统中的一个重要组成部分,它负责将用户输入的SQL语句转换为可执行的内部表示,以便系统能够理解和执行查询。本篇文章将深入探讨SQL解析器的工作原理、重要性以及开源工具`jsqlparser`的相关...

    基于antlr4 解析器,支持spark sql, tidb sql, flink sql, Sparkflink运行命令解析器

    ANTLR4(ANother Tool for Language Recognition)是一款强大的解析器生成器,广泛...对于想要深入理解SQL解析、Spark和Flink的工作原理,以及如何构建跨平台的SQL解析工具的开发者来说,这是一个非常有价值的资源。

    SQL存储过程实例.doc

    SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被命名并保存,然后在需要的时候调用,极大地提高了SQL代码的重用性和执行效率。在这个实例中,我们看到一个名为`Sum_wage`的存储过程,它的...

    HW_SQL_TOOL.rar_SQL 解析_python sql_sql解析_sql语句 python_tool

    SQL解析是将用户输入的SQL语句转换为解析树的过程,这是一个数据结构,表示了SQL语句的语法结构。这个过程通常由数据库管理系统(DBMS)内部的解析器完成,但它也可以通过编程方式实现,比如使用Python。Python有...

    通过解析sql语句获取表血缘关系项目

    它帮助确保数据的准确性和一致性,减少错误,提高数据治理的效率。 6. **文件名"getStmtTables"**:根据提供的文件名,这可能是解析SQL语句以获取所涉及表格列表的代码或工具的一部分。这可能是一个函数或脚本,...

    SQL 解析XML数据示例

    SQL Server 2005及更高版本引入了XML数据类型,它允许直接在数据库中存储XML文档,并提供了内置函数和方法来解析和操作XML数据。`a.xml`文件可能包含如下结构的XML数据: ```xml <name>John Doe <position>...

    SqlParser C++实现的SQL语法解释器

    优化阶段可能包括查询重写,以提高查询效率,例如通过添加索引、消除冗余子查询等。错误处理则涉及到检测和报告SQL语句中的语法错误,帮助用户快速定位和修复问题。 在实际应用中,SqlParser的使用场景广泛,例如在...

    使用antlrv3实现sql的解析

    ANTLR(ANother Tool for Language Recognition)是一个强大的解析工具,常用于构建语法分析器,它可以将源代码转换成抽象语法树(AST...这些工具可以自动化处理SQL语句,提高开发效率,并确保SQL代码的质量和兼容性。

    antlr解析sql

    SQL解析的过程通常分为以下几个步骤: 1. **词法分析**:ANTLR的词法分析器(Lexer)将输入的SQL字符串拆分成一系列的标记(Token),每个标记代表一个词汇单元,如关键字、标识符、数字、字符串等。 2. **语法...

    SQL 提升SQL执行效率诀窍

    按照标准的SQL解析顺序,它依次为: 1. FROM子句:此阶段将从各个数据源(如表或视图)中组合数据,生成初步的结果集。 2. WHERE子句:在此阶段,根据指定的条件过滤结果集中的记录。 3. GROUP BY子句:用于将数据...

    sql执行效率提高

    以下是一些针对提高 SQL 执行效率的重要知识点: 1. **选择最有效的表名顺序**:在 FROM 子句中,Oracle 从右到左处理表,所以应该先处理记录数最少的表,以减少扫描的数据量。对于多表联接,基础表(被其他表引用...

    spark框架SQL部分解析过程

    Spark 框架 SQL 部分解析过程 SparkSQL 是 Spark 技术体系中较有影响力的应用(Killer application),也是 SQL-on-Hadoop 解决方案中举足轻重的产品。本书由 11 章构成,从源码层面深入介绍 Spark SQL 内部实现...

    基于SQL 语法解释器JSqlParser实现的SQL解析工具

    《基于SQL语法解释器JSqlParser的SQL解析工具详解》 在信息技术领域,数据库操作是不可或缺的一部分,而SQL(Structured Query Language)作为数据库查询和管理的主要语言,其正确理解和高效处理至关重要。为了帮助...

    oracle SQL疑难解析 书中SQL

    10. **存储过程与函数**:存储过程和用户自定义函数是预编译的SQL语句集合,可以封装复杂的业务逻辑,提高代码重用性和安全性。 11. **游标**:游标允许逐行处理查询结果,这对于循环处理数据或执行动态SQL非常有用...

    SQL文的管理和解析源文件

    在IT行业中,数据库管理和查询是核心任务...理解并掌握这些知识点,对于提升数据库操作的效率和安全性具有重要意义。在实际开发中,灵活运用Spring提供的工具和机制,可以大大提高SQL文管理的便捷性和项目的可维护性。

Global site tag (gtag.js) - Google Analytics