甲骨文学习之性能优化(二)游标

  

,游标是光标的中文翻译,那么到底什么是光标呢?甲骨文概念中是这样描述的:

,当应用程序发出一个SQL语句,解析调用应用程序   数据库准备语句的执行。<>强解析调用打开或创建一个游标<强> 强,这是一个处理的那些<强>私人SQL面积强解析   SQL语句和其他处理信息。SQL游标和私人区域   PGA。

如果上述很多的专业术语把你搞晕了,那你可以简单的理解成,一个sql语句就会对应到一个游标。

游标分类:

<李>

会话cursor 其实就是指跟这个会议相对应的服务器进程的PGA里(准确的说是佐治亚大学)的一块内存区域(或者说内存结构),它的目的是为了处理且一次只处理一条sql语句。

<李>

共享cursor 缓存在librarycache (SGA下的共享池)里的一种库缓存对象,说白了就是指缓存在库缓存里的sql和匿名pl/sql。

如下图描述

,, 凹坠俏难爸阅苡呕?二)游标"

还记得我们在http://lqding.blog.51cto.com/9123978/1685341这篇文章中描述的硬解析,软解析吗?

硬解析,上图中的第4种情况,需要重新构造一个游标。

软解析,上图中的第3种情况,可以在共享池中查询到可以被重用的游标信息。

<强>软软解析强:如上图,不单共享池中有光标的详细信息,佐治亚大学中也会记录光标的状态。当一个sql,发出后,如果能在佐治亚大学中找到已经打开的相同游标,那么直接共用该游标。无需再进行共享池检,查。如果佐治亚大学中光标的已经关闭,那么直接打开游标即可。也可以直接共用游标。这两种情况都无,需进行共享池的检查,这种解析称之为软软解析。


会话光标

,使用v $ open_cursor视图查询,一个会话最多可以打开的游标数由参数判断定义。

,会话光标又分为三种:分别是隐式游标,显式游标和ref光标只

共享游标分类:

<李>

父游标

文本相同的子游标的代表。所有文本相同的SQL都共享父游标。

父游标没有执行计划,只有一些管理性的信息,包含了SQL文本和相关的散列值等。

v $ sqlarea中的每一行代表了一个父游标,地址字段表示其内存地址。

<李>

子游标

SQL文本相同,但是因执行环境等不同,会生成多个执行计划。

包含了SQL的元数据,即使得这个SQL可以执行的所有相关信息,如对象和权限,优化器设置,执行计划等.v SQL中美元的每一行表示了一个孩子光标,根据散列值和地址与父游标关联.child游标有自己的地址,即v SQL.CHILD_ADDRESS美元。

,

,

案例:

1。创建一个用户

完成,conn /as  sysdba   连接。   完成,create  user  ding  identified  by 丁;      User 创建。      完成,grant 资源,connect 用丁;      Grant 成功。

2。生成数据

完成,create  table  ding.emp  as  select  *,得到scott.emp;      Table 创建。

将数据库重启

3。分别登录斯科特和丁用户,执行如下查询

完成,select  *,得到电磁脉冲;

4。查看父游标

完成COL  SQL_TEXT  FOR 故事本来   完成,COL  SQL_ID  FOR 样子   完成SET  LINESIZE  200   完成,SELECT  sql_text,   ,,,,,,sql_id,   ,,,,,,执行,   ,,,,,,,   ,,,,,VERSION_COUNT   得到才能v sqlarea美元   ,WHERE  sql_text  LIKE “% emp”;   sql_text,,,,,,, sql_id,,,,执行,,,LOADS  VERSION_COUNT   - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - -,- - - - - - - - - - -,- - - - - - - - - - -,- - - - - - - - - - - - -   得到emp获select  *,,,,,,,, a2dk8bdn0ujx7,,,,, 2 - 2,,,,,, 2

两次查询共享了一个父游标,该父游标被负载2次,表示被硬解析了两次.VERSION_COUNT表示子游标的个数。

5。查看子游标

完成,,SELECT  sql_id, sql_text,负载,child_number parse_calls   得到才能v $ sql   ,WHERE  sql_text  LIKE “% emp”;      sql_id,,,,, sql_text LOADS  CHILD_NUMBER  PARSE_CALLS   - - - - - - - - - - - - - - - - - - - - - -,- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -,- - - - - - - - - - -,- - - - - - - - - - - -,- - - - - - - - - - - -   a2dk8bdn0ujx7,,,,, select  *,得到emp,,,,, 1,, 0,,,,,, 1   a2dk8bdn0ujx7,,,,, select  *,得到emp,,,,, 1,, 1,,,,,, 1

甲骨文学习之性能优化(二)游标