iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析
  • 201
分享到

如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析

2024-04-02 19:04:59 201人浏览 薄情痞子
摘要

如何进行oracle数据库硬解析、软解析、软软解析联系与区别的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Oracle数据库硬解析和

如何进行oracle数据库硬解析、软解析、软软解析联系与区别的分析,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

Oracle数据库硬解析和软解析有相同的一步,而软软解析与硬解析、软解析完全不一样。

一、sql解析

这里我们先简单sql语句执行步骤:

  • 语法检查(syntax check)

  • 语义检查(symantic check): 对象是否存在,是否有权限。

  • sql解析(parse): 利用内部算法对sql进行解析,生成解析树及执行计划。

  • 执行sql,返回结果(execute and return)

首先了解一下sql解析时用到的内存结构——shared pool。

shared pool是一块内存池,里边又被分成了很多小的区块,每个块有他们的作用:

  • free (空闲)

  • library cache (库缓存,缓存sql语句以及sql所对应的执行计划)

  • row cache  (字典缓存——库里有多少表,多少用户,多少个列,列的名字,列的数据类型,每个表多大等等都属于数据库自身信息。)

一个sql 语句,进入到数据库后,server process 会拿着sql语句到shared pool中的library cache  里边去找,看sql语句以前是否有执行过。也就是在library cache  里面看有没有这条sql语句以及sql语句所对应的执行计划。(此过程是通过对传递进来的SQL语句使用HASH函数运算得出HASH值,与共享池中现有语句的HASH值进行比较看是否一一对应。现有数据库中SQL语句的HASH值我们可以通过访问vsql、vsql、vsqlarea、v$sqltext等数据字典中的HASH_VALUE列查询得出。)

二、涉及解析的概念

1. 硬解析

硬解析(Hard Parse)是指Oracle在执行目标SQL时,在库缓存(Library  Cache)中找不到可以重用的解析树和执行计划,而不得不从头开始解析目标SQL并生成相应的父游标(Parent Cursor)和子游标(Child  Cursor)的过程。

硬解析实际上有两种类型:一种是在库缓存中找不到匹配的父游标(Parent  Cursor),此时Oracle会从头开始解析目标SQL,新生成一个父游标和一个子游标,并把它们挂在对应的HashBucket中;另外一种是找到了匹配的父游标但未找到匹配的子游标,此时Oracle也会从头开始解析该目标SQL,新生成一个子游标,并把这个子游标挂在对应的父游标下。

硬解析过程:

  • 语法、语义及权限检查;

  • 查询转换(通过应用各种不同的转换技巧,会生成语义上等同的新的SQL语句,如count(1)会转为count(*));

  • 根据统计信息生成执行计划(找出成本最低的路径,这一步比较耗时);

  • 将游标信息(执行计划)保存到库缓存。

2. 软解析

软解析(Soft Parse)是指Oracle在执行目标SQL时,在Library Cache中找到了匹配的父游标(Parent  Cursor)和子游标(Child Cursor),并将存储在子游标中的解析树和执行计划直接拿过来重用而无须从头开始解析的过程。

软解析过程:

  • 语法、语义及权限检查;

  • 将整条SQL hash后从库缓存中执行计划。

软解析对比硬解析省了三个步骤。

3. 软软解析

软软解析(Soft Soft  Parse)是指若参数SESSioN_CACHED_CURSORS的值大于0,并且该会话游标所对应的目标SQL解析和执行的次数超过3次,则此时该会话游标会被直接缓存在当前会话的PGA中的。若该SQL再次执行的时候,则只需要对其进行语法分析、权限对象分析之后就可以直接从当前会话的PGA中将之前缓存的匹配会话游标直接拿过来用就可以了,这就是软软解析。

软软解析过程:

要完全理解软软解析先要理解游标的概念,当执行SQL时,首先要打开游标,执行完成后,要关闭游标,游标可以理解为SQL语句的一个句柄。

在执行软软解析之前,首先要进行软解析,MOS上说执行3次的SQL语句会把游标缓存到PGA,这个游标一直开着,当再有相同的SQL执行时,则跳过解析的所有过程直接去取执行计划。

三、实验:

1. 环境准备:

drop table test purge; alter system flush shared_pool; create table test as select * from dba_objects where 1<>1; exec dbms_stats.gather_table_stats(ownname => 'sys',tabname => 'test');

如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析

2. 硬解析

select * from test where object_id=20; select * from test where object_id=30; select * from test where object_id=40; select * from test where object_id=50;

如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析

3. 软解析

var oid number; exec :oid:=20; select * from test where object_id=:oid; exec :oid:=30; select * from test where object_id=:oid; exec :oid:=40; select * from test where object_id=:oid; exec :oid:=50; select * from test where object_id=:oid;

如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析

4. 软软解析

begin  for i in 1..4   loop  execute immediate 'select * from test where object_id=:i' using i;  end loop;  end; /

如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析

5. 统计

select sql_text,s.PARSE_CALLS,loads,executions from v$sql s where sql_text like 'select * from test where object_id%' order by 1,2,3,4;

如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析

可以看到软解析与软软解析相比,软软解析只是解析一次。

字段解释:

  • PARSE_CALLS 解析的次数

  • LOADS 硬解析的次数

  • EXECUTIONS 执行的次数

关于如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注编程网数据库频道了解更多相关知识。

您可能感兴趣的文档:

--结束END--

本文标题: 如何进行Oracle数据库硬解析、软解析、软软解析联系与区别的分析

本文链接: https://www.lsjlt.com/news/67995.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • sql怎么查看表的索引
    通过查询系统表,可以获取表的索引信息,包括索引名称、是否唯一、索引类型、索引列和行数。常用系统表有:mysql 的 information_schema.statistics、postg...
    99+
    2024-05-14
    mysql oracle
  • sql怎么查看索引
    您可以使用 sql 通过以下方法查看索引:show indexes 语句:显示表中定义的索引列表及其信息。explain 语句:显示查询计划,其中包含用于执行查询的索引。informat...
    99+
    2024-05-14
  • sql怎么查看存储过程
    如何查看 sql 存储过程的源代码:使用 show create procedure 语句直接获取创建脚本。查询 information_schema.routines 表的 routi...
    99+
    2024-05-14
  • sql怎么查看视图表
    要查看视图表,可以使用以下步骤:使用 select 语句获取视图中的数据。使用 desc 语句查看视图的架构。使用 explain 语句分析视图的执行计划。使用 dbms 提供...
    99+
    2024-05-14
    oracle python
  • sql怎么查看创建的视图
    可以通过sql查询查看已创建的视图,具体步骤包括:连接到数据库并执行查询select * from information_schema.views;查询结果将显示视图的名称、...
    99+
    2024-05-14
    mysql
  • sql怎么用循环语句实现查询
    可以通过 do 和 while 语句创建循环,并在循环内执行查询,详细步骤包括:定义循环变量设置循环初始值循环执行查询更新循环变量执行查询循环退出条件 SQL 中使用循环语句实现查询 ...
    99+
    2024-05-14
  • sql怎么用代码修改表中数据
    通过 sql 代码修改表中数据的方法包括:修改单个记录:使用 update 语句设置列值并指定条件。修改多条记录:在 update 语句中指定多个条件来修改满足条件的所有记录。增加新列:...
    99+
    2024-05-14
  • sql怎么用命令创建数据库
    在 sql 中使用 create database 命令创建新数据库,其语法包含以下步骤:指定数据库名称。指定数据库文件和日志文件的位置(可选)。指定数据库大小、最大大小和文件增长(可选...
    99+
    2024-05-14
  • sql怎么用身份证提取年龄
    sql 中提取身份证号码中的年龄的方法:提取出生日期部分(身份证号码中第 7-14 位);使用 to_date 函数转换为日期格式;使用 extract 函数计算与当前日期之间的年差。 ...
    99+
    2024-05-14
  • sql怎么看字段长度
    有两种方法可查看 sql 中的字段长度:使用 information_schema 架构,其中包含元数据信息,可用于查询字段长度。使用内建函数,如 length(),其适用于字符串数据类...
    99+
    2024-05-14
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作