Oracle中DDL语句(数据定义语言关键字:CREATE,DROP,ALTER,TRUNCATE),他们是从来不会共享使用的,也就是每次执行都需要进行硬解析,
DML语句(数据操纵语言:INSERT,UPDATE,DELETE,SELECT),这些会在执行的时候视情况,选择如何去解析。
看过一些资料,SQL的解析如下:
Oracle对此SQL将进行几个步骤的处理过程:
1、语法检查(syntax check): 检查sql的是否有拼写语法错误。
判断一条SQL语句的语法是否符合SQL的规范,比如执行:
SQL> selet * form emp;
我们就可以看出由于Select关键字少了一个“c”,from单词错误,这条语句就无法通过语法检验的步骤了。
2、语义检查(semantic check): 检查sql语句中的访问对象是否存在及该用户是否具备相应操作的权限。
ORA-00942: table or view does not exist
或许这个表存在,但没有权限,或者就是不存在这个对象。
3、对sql语句进行解析(prase): 利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。
Parse主要分为三种:
一、Hard Parse (硬解析)(以下所有的步骤都要一步一步来)
1:语法分析
2:权限与对象检查
3:在共享池中检查是否有完全相同的之前完全解析好的. 如果存在,直接跳过4和5,运行Sql, 此时算soft parse.
4:选择执行计划
5:产生执行计划
二、Soft Parse (软解析)
就如果是在Shared Pool中找到了与之完全相同的Sql解析好的结果后会跳过Hard Parse中的后面的两个步骤。
三、Soft Soft Parse
当设置了session_cursor_cache这个参数之后,Cursor被直接Cache在当前Session的PGA中的,在解析的时候只需要对其语法分析、权限对象分析之后就可以转到PGA中查找了,如果发现完全相同的Cursor,就可以直接去取结果了
4、执行sql,返回结果(execute and return)
实现SQL共享(以下写的很详细借来转载):
1) 验证SQL语句是否完全一致。
在这个步骤中,Oracle将会对传递进来的SQL语句使用HASH函数运算得出HASH值,再与共享池中现有语句的HASH值进行比较看是否一一对应。现有数据库中SQL语句的HASH值我们可以通过访问v$sql、v$sqlarea、v$sqltext等数据字典中的HASH_VALUE列查询得出。
如果SQL语句的HASH值一致,那么ORACLE事实上还需要对SQL语句的语义进行再次检测,以决定是否一致。那么为什么Oracle需要再次对语句文本进行检测呢?不是SQL语句的HASH值已经对应上了?事实上就算是SQL语句的HASH值已经对应上了,并不能说明这两条SQL语句就已经可以共享了。
例如:假如用户SYS有自己的一张表EMP,他要执行查询语句:select * from emp; 用户SYSTEM也有一张EMP表,同样要查询select * from emp;这样他们两条语句在文本上是一模一样的,他们的HASH值也会一样,但是由于涉及到查询的相关表不一样,他们事实上是无法共享的.
SQL> conn / as sysdba
已连接。
SQL> show user
USER 为 "SYS"
SQL> create table emp ( x int ) ;
表已创建。
SQL> select * from emp;
未选定行
SQL> conn system/admin;
已连接。
SQL> create table emp ( x int );
表已创建。
SQL> select * from emp;
未选定行
SQL> select address,hash_value, executions, sql_text from v$sql where upper(sql_text) like 'SELECT * FROM EMP%';
ADDRESS HASH_VALUE EXECUTIONS SQL_TEXT ----------------------- ---------------------------------------------------------
2769AE64 1745700775 1 select * from emp
2769AE64 1745700775 1 select * from emp
2 rows selected.
从结果可以看到这2个查询的语句文本和HASH值都是一样的,但是由于查询的对象不同,是无法共享的,不同情况的语句还是需要硬解析的。
因此在检查共享池共同SQL语句的时候,是需要根据具体情况而定的。
可以进一步查询v$sql_shared_cursor以得知SQL为何不能共享的原因:
SQL>select address,auth_check_mismatch,translation_mismatch,optimizer_mismatch
from v$sql_shared_cursor where address in (
select address from v$sql where upper(sql_text) like 'SELECT * FROM EMP%' )
ADDRESS A T O
---------------- ----- -- --
2769AE64 N N N
2769AE64 Y Y N
有几种不同的地方:
TRANSLATION_MISMATCH 表示SQL游标涉及到的数据对象是不同的;
AUTH_CHECK_MISMATCH 表示对同样一条SQL语句转换是不匹配的。
optimizer_mismatch 表示会话的优化器环境是不同的。
2) 验证SQL语句执行环境是否相同,如被指定了执行计划
比如同样一条SQL语句,一个查询会话加了/*+ first_rows */的HINT,另外一个用户加/*+ all_rows */的HINT,他们就会产生不同的执行计划,尽管他们是查询同样的数据。
通过如上检查以后,如果SQL语句是一致的,那么就会重用原有SQL语句的执行计划和优化方案,也就是我们通常所说的软解析。如果SQL语句没有找到同样的副本,那么就需要进行硬解析了。
Oracle根据提交的SQL语句再查询相应的数据对象是否有统计信息。如果有统计信息的话,那么CBO将会使用这些统计信息产生所有可能的执行计划(可能多达成千上万个)和相应的Cost,最终选择Cost最低的那个执行计划。如果查询的数据对象无统计信息,则按RBO的默认规则选择相应的执行计划。这个步骤也是解析中最耗费资源的,因此我们应该极力避免硬解析的产生。至此,解析的步骤已经全部完成,Oracle将会根据解析产生的执行计划执行SQL语句和提取相应的数据。
三. 绑定变量
使用了Bind Var能提高性能主要是因为这样做可以尽量避免不必要的硬分析(Hard Parse)而节约了时间,同时节约了大量的CPU资源。
当一个Client提交一条Sql给Oracle后,Oracle 首先会对其进行解析(Parse),然后将解析结果提交给优化器(Optimiser)来进行优化而取得Oracle认为的最优的Query Plan,然后再按照这个最优的Plan来执行这个Sql语句(当然在这之中如果只需要软解析的话会少部分步骤)。
但是,当Oracle接到 Client提交的Sql后会首先在共享池(Shared Pool)里面去查找是否有之前已经解析好的与刚接到的这一个Sql完全相同的Sql(注意这里说的是完全相同,既要求语句上的字符级别的完全相同,又要求涉及的对象也必须完全相同)。当发现有相同的以后解析器就不再对新的Sql在此解析而直接用之前解析好的结果了。这里就节约了解析时间以及解析时候消耗的CPU资源。尤其是在OLTP中运行着的大量的短小Sql,效果就会比较明显了。因为一条两条Sql的时间可能不会有多少感觉,但是当量大了以后就会有比较明显的感觉了。
分享到:
相关推荐
Oracle Sql语句转换成Mysql Sql语句java 源码,非常简单,只要给定源oracle sql语句地址,和生成目标文件地址运行即可。
在数据库中硬解析是万恶之源,为大家提供一个查找并且定位oracle硬解析问题SQL语句脚本
该文档详细介绍了一条sql从应用端提交开始,在数据库中的执行过程,sql的执行原理等,能够更有效的帮助你oracle数据库以及更有效的提高sql优化的能力。
Oracle sql语句大全. sql语句的优化资料
oracle Sql语句二 oracle Sql语句二
对ORACLE-SQL进行一些布局优化,更新它的格式
sqlserver自动生成sql语句工具sqlserver转oracle
Oracle 常用 sql 语句 实用性
Oracle SQL Profiler,自己设计算法写的一款非常好用的抓取Oracle数据库SQL语句的工具,可以再没有源码的情况下监控ORACLE数据库服务器的v$sqlarea视图抓取出从点击开始按钮到点击结束按钮期间执行过的SQL语句。...
SQL Server 存储过程及Oracle SQL语句分页
oracle常用SQL语句下载 oracle常用SQL语句下载 oracle常用SQL语句下载
Oracle学习,常用sql语句汇总,适合新手使用。
Oracle SQL语句性能优化
oracle sql语句oracle sql语句oracle sql语句oracle sql语句oracle sql语句oracle sql语句oracle sql语句oracle sql语句oracle sql语句oracle sql语句
Oracle常用SQL查询语句,Oracle常用SQL查询语句,Oracle常用SQL查询语句
oracle、sql语句基础
Oracle中SQL语句执行效率的查找与解决..
Oracle常用sql语句整理 Oracle常用sql语句整理 Oracle常用sql语句整理 Oracle常用sql语句整理 Oracle常用sql语句整理 Oracle常用sql语句整理
一些常见的Oracle数据库的sql语句的总结,便于快速的复习Oracle语句。
Oracle——sql语句优化