ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 从连接到数据(二)

从连接到数据(二)

原创 Linux操作系统 作者:realkid4 时间:2011-01-03 22:47:48 0 删除 编辑

当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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
求道~

注册时间:2010-11-30

  • 博文量
    545
  • 访问量
    8041220