当前位置: 首页 > 科技观察

Oracle数据库硬分析、软分析、软-软分析联系及区别详解

时间:2023-03-12 05:11:35 科技观察

Oracle数据库硬分析和软分析步骤相同,但软-软分析与硬分析和软分析完全不同。1.sql分析这里我们从简单的sql语句执行步骤开始:语法检查(syntaxcheck)语义检查(symanticcheck):对象是否存在,是否有权限。SQL解析(parse):使用内部算法解析SQL,生成解析树和执行计划。执行sql,返回结果(executeandreturn)先了解一下sql解析用到的内存结构——共享池。sharedpool是一个内存池,被分成很多小块。每个block都有它的功能:free(idle)librarycache(库缓存,缓存sql语句和sql对应的执行计划)rowcache(字典缓存——库中有多少表,有多少用户,有多少列,列名,列的数据类型,每个表的大小等,都属于数据库本身。)一条sql语句进入数据库后,服务器进程会把这条sql语句带到共享池中的librarycache中去查找到查看之前是否执行过sql语句。也就是去librarycache中查看是否有这条sql语句和sql语句对应的执行计划。(这个过程是利用HASH函数计算传入的SQL语句的HASH值,与共享池中已有语句的HASH值进行比较,看是否一一对应。我们可以通过现有数据库中SQL语句的HASH值访问vsql、vsql、vsqlarea、v$sqltext等数据字典中的HASH_VALUE列查询)二、解析相关概念1、硬解析(HardParse)表示Oracle在执行目标SQL时,在库缓存(LibraryCache)中找不到可重用的解析树和执行计划,而不得不从头解析目标SQL,并生成对应的父游标(ParentCursor)和子游标游标(ChildCursor)进程。硬解析其实有两种:一种是在librarycache中找不到匹配的父游标(ParentCursor)。这时Oracle会从头解析目标SQL,生成新的父游标和子游标,并把它们挂在对应的HashBucket中;另一种是找到了匹配的父游标,但是没有找到匹配的子游标。这时Oracle也会从头解析目标SQL,生成新的子游标,并将子游标挂在对应的父游标下。硬解析过程:语法、语义和权限检查;查询转换(通过应用各种转换技术,将生成语义等价的新SQL语句,例如count(1)将转换为count(*));根据统计信息生成执行计划(寻找成本最低的路径,比较耗时);将游标信息(执行计划)保存到库缓存中。2.SoftParseSoftParse是指Oracle在执行目标SQL时,在LibraryCache中找到匹配的父游标(ParentCursor)和子游标(ChildCursor),并将解析树存储在子游标中的过程。获取并重用执行计划而不从头开始解析它。软解析过程:检查语法、语义和权限;在散列整个SQL语句后从库缓存中执行计划。与硬解析相比,软解析省去了三个步骤。3.SoftParseSoftParse是指如果参数SESSION_CACHED_CURSORS的值大于0,并且sessioncursor对应的目标SQL被解析执行了3次以上,那么sessioncursor会直接缓存在PGA中当前会话。如果再次执行SQL,只需要分析语法和权限对象,就可以直接从当前会话的PGA中使用之前缓存的匹配会话游标。这就是软解析。软软解析过程:要充分理解软软解析,首先要理解游标的概念。执行SQL时,必须先打开游标。执行完成后,必须关闭游标。游标可以理解为SQL语句的句柄。在进行软解析之前,先进行软解析。按照MOS的说法,执行3次的SQL语句会将游标缓存到PGA中。此游标始终打开。当再次执行相同的SQL时,将跳过所有解析。该进程直接获取执行计划。三、实验:1、环境准备:droptabletestpurge;altersystemflushshared_pool;createtabletestasseselect*fromdba_objectswhere1<>1;execdbms_stats.gather_table_stats(ownname=>'sys',tabname=>'test');2.硬解析select*fromtestwhereobject_id=20;select*fromtestwhereobject_id=30;select*fromtestwhereobject_id=40;select*fromtestwhereobject_id=50;3.软分析varoidnumber;exec:oid:=20;select*fromtestwhereobject_id=:oid;exec:oid:=30;select*fromtestwhereobject_id=:oid;exec:oid:=40;select*fromtestwhereobject_id=:oid;exec:oid:=50;select*fromtestwhereobject_id=:oid;4.软解析beginforiin1..4loopexecuteimmediate'select*fromtestwhereobject_id=:i'usingi;endloop;结束;/5。统计selectsql_text,s.PARSE_CALLS,loads,executionsfromv$sqlswheresql_textlike'select*fromtestwhereobject_id%'orderby1,2,3,4;可以看到和soft-softparsing相比,soft-softparsing只解析一次。字段说明:PARSE_CALLS解析次数LOADS硬解析次数EXECUTIONS执行次数