当Client与Server Process建立了连接,构成一次会话session之后。客户端就可以输入SQL语句,对数据库数据进行操作了。
2、解析SQL,执行操作
SQL语句是描述性语句。我们使用SQL的时候,只是去描述我们需要数据的特征,而不是确定数据获取的执行方法。
任何一条SQL语句执行,都是通过解析、执行和获取三个主要步骤,若干个子步骤组成。
解析parse
任何SQL语句,在Oracle环境下都是处理为游标cursor。对SQL语句的处理,实际上就是对cursor的处理。
Oracle处理SQL语句,首先要检查SGA区中的shared pool子区,看里面是否存在相同SQL的父游标子游标。查询的依据,就是SQL语句本身(以及其hash值)。
每一个在Oracle中执行的SQL语句,都需要在shared pool中建立一个父游标和子游标的对。父游标对应的是所有相同SQL语句的游标,都可以共享该父游标。在同一个父游标下,允许有多个子游标,他们表示SQL语句在不同执行用户、不同优化器模式和环境等因素下,对应的不同的执行计划。
SQL在Share Pool中寻找的共享Cursor,就是寻找相同的子游标项,目的是为了共用执行计划。
在Oracle中,可以通过v$sqlarea和V$sql两个视图,分别查看shared pool中的父子游标。
//命令行中先执行该语句
SQL> select * from t;
//查看父游标
SQL> select sql_text from v$sqlarea where sql_text like 'select * from t%';
SQL_TEXT
-----------------------------
select * from t
//查看子游标
SQL> select sql_text from v$sql where sql_text like 'select * from t%';
SQL_TEXT
-------------------------------
select * from t
一个父游标下,是可以对应多条子游标记录的。v$sqlarea视图中,有一列version_count表示该父游标有多少子游标对应共享记录。v$sql中也有对应标志执行版本的列。
一条SQL语句,通过语法检查后。如果可以在shared pool中寻找到可共享的子游标对象,就可以实现执行计划的共享。这个过程,我们称为软解析。
如果没有在shared pool中寻找到相同可共享的游标记录。那么,首先向实例申请,要求SGA中分配空间和资源,进行SQL语句的分析解析工作。这部分通常需要分配内存空间,以装载生成的父子游标记录。我们称这个过程为硬解析。
相对于软解析,硬解析需要消耗更多的系统资源。更重要的是,在进行硬解析的过程中,对SQL涉及到的数据库对象,可能都有锁或者latch的操作。这样是不利于实现多用户并发的数据库系统的。所以,一般我们都尽量避免硬解析,尽可能实现游标共享。
当然,软解析也不是绝对完美的选择。在一些高并发、高处理量的系统中,绝对的游标共享也是可能引起性能瓶颈的。所以,一些时候还要人为避免软解析的发生。
实现游标共享的最常用技术就是绑定变量,通过绑定变量,可以实现类似业务操作SQL的共享。也就是一种软解析技术。但是,绑定变量最大的问题也就是peeking,在实际系统中,也是要仔细区别斟酌的。
对SQL语句的解析后,Oracle要使用优化器生成对应的执行计划。目前,最常用的就是CBO(基于成本的优化器)。优化器的原理比较复杂,是Oracle核心技术之一。简单的说,Oracle会用不同的方法(自动收集、作业脚本),收集数据表、索引的统计信息,作为CBO工作的依据。之后,对一个SQL,Oracle会制定出多种执行路径方法,分别计算每个路径方法的执行成本(估算),最后确定成本最低的执行计划作为实际执行计划。
一旦一条SQL的执行计划确定之后,shared pool里的游标记录就和这个执行计划连接起来。下次再有相同子游标的SQL,则直接使用这个执行计划。
执行计划
----------------------------------------------------------
Plan hash value: 47235625
---------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 4 | 3 (34)| 00:00:01 |
| 1 | HASH GROUP BY | | 1 | 4 | 3 (34)| 00:00:01 |
| 2 | TABLE ACCESS FULL| T | 2 | 8 | 2 (0)| 00:00:01 |
---------------------------------------------------------------------------
上面是一段SQL语句的执行计划。可以看出,执行计划就是一系列的步骤,告诉Oracle执行引擎如何一步步的将结果集合返回。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/17203031/viewspace-683198/ ,如需转载,请注明出处,否则将追究法律责任。