溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行Oracle數(shù)據(jù)庫(kù)硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析

發(fā)布時(shí)間:2021-11-29 15:25:06 來(lái)源:億速云 閱讀:265 作者:柒染 欄目:數(shù)據(jù)庫(kù)

如何進(jìn)行Oracle數(shù)據(jù)庫(kù)硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

Oracle數(shù)據(jù)庫(kù)硬解析和軟解析有相同的一步,而軟軟解析與硬解析、軟解析完全不一樣。

一、sql解析

這里我們先簡(jiǎn)單sql語(yǔ)句執(zhí)行步驟:

  • 語(yǔ)法檢查(syntax check)

  • 語(yǔ)義檢查(symantic check): 對(duì)象是否存在,是否有權(quán)限。

  • sql解析(parse): 利用內(nèi)部算法對(duì)sql進(jìn)行解析,生成解析樹(shù)及執(zhí)行計(jì)劃。

  • 執(zhí)行sql,返回結(jié)果(execute and return)

首先了解一下sql解析時(shí)用到的內(nèi)存結(jié)構(gòu)——shared pool。

shared pool是一塊內(nèi)存池,里邊又被分成了很多小的區(qū)塊,每個(gè)塊有他們的作用:

  • free (空閑)

  • library cache (庫(kù)緩存,緩存sql語(yǔ)句以及sql所對(duì)應(yīng)的執(zhí)行計(jì)劃)

  • row cache  (字典緩存——庫(kù)里有多少表,多少用戶,多少個(gè)列,列的名字,列的數(shù)據(jù)類型,每個(gè)表多大等等都屬于數(shù)據(jù)庫(kù)自身信息。)

一個(gè)sql 語(yǔ)句,進(jìn)入到數(shù)據(jù)庫(kù)后,server process 會(huì)拿著sql語(yǔ)句到shared pool中的library cache  里邊去找,看sql語(yǔ)句以前是否有執(zhí)行過(guò)。也就是在library cache  里面看有沒(méi)有這條sql語(yǔ)句以及sql語(yǔ)句所對(duì)應(yīng)的執(zhí)行計(jì)劃。(此過(guò)程是通過(guò)對(duì)傳遞進(jìn)來(lái)的SQL語(yǔ)句使用HASH函數(shù)運(yùn)算得出HASH值,與共享池中現(xiàn)有語(yǔ)句的HASH值進(jìn)行比較看是否一一對(duì)應(yīng)?,F(xiàn)有數(shù)據(jù)庫(kù)中SQL語(yǔ)句的HASH值我們可以通過(guò)訪問(wèn)vsql、vsql、vsqlarea、v$sqltext等數(shù)據(jù)字典中的HASH_VALUE列查詢得出。)

二、涉及解析的概念

1. 硬解析

硬解析(Hard Parse)是指Oracle在執(zhí)行目標(biāo)SQL時(shí),在庫(kù)緩存(Library  Cache)中找不到可以重用的解析樹(shù)和執(zhí)行計(jì)劃,而不得不從頭開(kāi)始解析目標(biāo)SQL并生成相應(yīng)的父游標(biāo)(Parent Cursor)和子游標(biāo)(Child  Cursor)的過(guò)程。

硬解析實(shí)際上有兩種類型:一種是在庫(kù)緩存中找不到匹配的父游標(biāo)(Parent  Cursor),此時(shí)Oracle會(huì)從頭開(kāi)始解析目標(biāo)SQL,新生成一個(gè)父游標(biāo)和一個(gè)子游標(biāo),并把它們掛在對(duì)應(yīng)的HashBucket中;另外一種是找到了匹配的父游標(biāo)但未找到匹配的子游標(biāo),此時(shí)Oracle也會(huì)從頭開(kāi)始解析該目標(biāo)SQL,新生成一個(gè)子游標(biāo),并把這個(gè)子游標(biāo)掛在對(duì)應(yīng)的父游標(biāo)下。

硬解析過(guò)程:

  • 語(yǔ)法、語(yǔ)義及權(quán)限檢查;

  • 查詢轉(zhuǎn)換(通過(guò)應(yīng)用各種不同的轉(zhuǎn)換技巧,會(huì)生成語(yǔ)義上等同的新的SQL語(yǔ)句,如count(1)會(huì)轉(zhuǎn)為count(*));

  • 根據(jù)統(tǒng)計(jì)信息生成執(zhí)行計(jì)劃(找出成本最低的路徑,這一步比較耗時(shí));

  • 將游標(biāo)信息(執(zhí)行計(jì)劃)保存到庫(kù)緩存。

2. 軟解析

軟解析(Soft Parse)是指Oracle在執(zhí)行目標(biāo)SQL時(shí),在Library Cache中找到了匹配的父游標(biāo)(Parent  Cursor)和子游標(biāo)(Child Cursor),并將存儲(chǔ)在子游標(biāo)中的解析樹(shù)和執(zhí)行計(jì)劃直接拿過(guò)來(lái)重用而無(wú)須從頭開(kāi)始解析的過(guò)程。

軟解析過(guò)程:

  • 語(yǔ)法、語(yǔ)義及權(quán)限檢查;

  • 將整條SQL hash后從庫(kù)緩存中執(zhí)行計(jì)劃。

軟解析對(duì)比硬解析省了三個(gè)步驟。

3. 軟軟解析

軟軟解析(Soft Soft  Parse)是指若參數(shù)SESSION_CACHED_CURSORS的值大于0,并且該會(huì)話游標(biāo)所對(duì)應(yīng)的目標(biāo)SQL解析和執(zhí)行的次數(shù)超過(guò)3次,則此時(shí)該會(huì)話游標(biāo)會(huì)被直接緩存在當(dāng)前會(huì)話的PGA中的。若該SQL再次執(zhí)行的時(shí)候,則只需要對(duì)其進(jìn)行語(yǔ)法分析、權(quán)限對(duì)象分析之后就可以直接從當(dāng)前會(huì)話的PGA中將之前緩存的匹配會(huì)話游標(biāo)直接拿過(guò)來(lái)用就可以了,這就是軟軟解析。

軟軟解析過(guò)程:

要完全理解軟軟解析先要理解游標(biāo)的概念,當(dāng)執(zhí)行SQL時(shí),首先要打開(kāi)游標(biāo),執(zhí)行完成后,要關(guān)閉游標(biāo),游標(biāo)可以理解為SQL語(yǔ)句的一個(gè)句柄。

在執(zhí)行軟軟解析之前,首先要進(jìn)行軟解析,MOS上說(shuō)執(zhí)行3次的SQL語(yǔ)句會(huì)把游標(biāo)緩存到PGA,這個(gè)游標(biāo)一直開(kāi)著,當(dāng)再有相同的SQL執(zhí)行時(shí),則跳過(guò)解析的所有過(guò)程直接去取執(zhí)行計(jì)劃。

三、實(shí)驗(yàn):

1. 環(huán)境準(zhǔn)備:

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');

如何進(jìn)行Oracle數(shù)據(jù)庫(kù)硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析

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;

如何進(jìn)行Oracle數(shù)據(jù)庫(kù)硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析

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;

如何進(jìn)行Oracle數(shù)據(jù)庫(kù)硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析

4. 軟軟解析

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

如何進(jìn)行Oracle數(shù)據(jù)庫(kù)硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析

5. 統(tǒng)計(jì)

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;

如何進(jìn)行Oracle數(shù)據(jù)庫(kù)硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析

可以看到軟解析與軟軟解析相比,軟軟解析只是解析一次。

字段解釋:

  • PARSE_CALLS 解析的次數(shù)

  • LOADS 硬解析的次數(shù)

  • EXECUTIONS 執(zhí)行的次數(shù)

關(guān)于如何進(jìn)行Oracle數(shù)據(jù)庫(kù)硬解析、軟解析、軟軟解析聯(lián)系與區(qū)別的分析問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI