亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle硬解析和軟解析的區別分析

2024-08-29 13:58:10
字體:
來源:轉載
供稿:網友
我們都知道在Oracle中每條SQL語句在執行之前都需要經過解析,這里面又分為軟解析和硬解析。在Oracle中存在兩種類型的SQL語句,一類為 DDL語句(數據定義語言),就是每次執行都需要進行硬解析。還有一類就是DML語句,他們會根據情況選擇要么進行硬解析,要么進行軟解析。
 
 

一、摘要

Oracle硬解析和軟解析是我們經常遇到的問題,所以需要考慮何時產生軟解析何時產生硬解析,如何判斷

SQL的執行過程

當發布一條SQL或PL/SQL命令時,Oracle會自動尋找該命令是否存在于共享池中來決定對當前的語句使用硬解析或軟解析。

通常情況下,SQL語句的執行過程如下:

Step1. SQL代碼的語法(語法的正確性)及語義檢查(對象的存在性與權限)。

Step2. 將SQL代碼的文本進行哈希得到哈希值。

Step3. 如果共享池中存在相同的哈希值,則對這個命令進一步判斷是否進行軟解析,否則到e步驟。

Step4. 對于存在相同哈希值的新命令行,其文本將與已存在的命令行的文本逐個進行比較。

    這些比較包括大小寫,字符串是否一致,空格,注釋等,如果一致,則對其進行軟解析,轉到步驟Step6,無需再次硬解析。

    否則到步驟Step5。

Step5. 硬解析,生成執行計劃。

Step6. 執行SQL代碼,返回結果。

二、軟解析

1.下面的三個查詢語句,不能使用相同的共享SQL區。盡管查詢的表對象使用了大小寫,但Oracle為其生成了不同的執行計劃

select * from emp;select * from Emp;select * from EMP;

2.類似的情況,下面的查詢中,盡管其where子句empno的值不同,Oracle同樣為其生成了不同的執行計劃      

select * from emp where empno=7369select * from emp where empno=7788

3.在判斷是否使用硬解析時,所參照的對象及schema應該是相同的,如果對象相同,而schema不同,則需要使用硬解析,生成不同的執行計劃

sys@ASMDB> select owner,table_name from dba_tables where table_name like 'TB_OBJ%';    OWNER             TABLE_NAME    ------------------------------ ------------------------------    USR1              TB_OBJ        --兩個對象的名字相同,當所有者不同    SCOTT             TB_OBJusr1@ASMDB> select * from tb_obj;scott@ASMDB> select * from tb_obj;   --此時兩者都需要使用硬解析以及走不同的執行計劃

三、硬解析

硬解析即整個SQL語句的執行需要完完全全的解析,生成執行計劃。而硬解析,生成執行計劃需要耗用CPU資源,以及SGA資源。在此不得不提的是對庫緩存中閂的使用。閂是鎖的細化,可以理解為是一種輕量級的串行化設備。當進程申請到閂后,則這些閂用于保護共享內存的數在同一時刻不會被兩個以上的進程修改。在硬解析時,需要申請閂的使用,而閂的數量在有限的情況下需要等待。大量的閂的使用由此造成需要使用閂的進程排隊越頻繁,性能則逾低下。

1. 下面對上面的兩種情形進行演示

在兩個不同的session中完成,一個為sys帳戶的session,一個為scott賬戶的session,不同的session,其SQL命令行以不同的帳戶名開頭

如" sys@ASMDB> "  表示使用時sys帳戶的session," scott@ASMDB> "表示scott帳戶的session

sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;     NAME           CLASS   VALUE-------------------- ---------- ----------      --當前的硬解析值為569parse count (hard)      64    569scott@ASMDB> select * from emp;      sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;       NAME           CLASS   VALUE    -------------------- ---------- ----------      --執行上一個查詢后硬解析值為570,解析次數增加了一次    parse count (hard)      64    570scott@ASMDB> select * from Emp;    sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;        NAME           CLASS   VALUE    -------------------- ---------- ----------      --執行上一個查詢后硬解析值為571    parse count (hard)      64    571scott@ASMDB> select * from EMP;    sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;        NAME           CLASS   VALUE    -------------------- ---------- ----------      --執行上一個查詢后硬解析值為572    parse count (hard)      64    572  scott@ASMDB> select * from emp where empno=7369;        sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;    NAME           CLASS   VALUE    -------------------- ---------- ----------      --執行上一個查詢后硬解析值為573    parse count (hard)      64    573scott@ASMDB> select * from emp where empno=7788;  --此處原來empno=7369,復制錯誤所致,現已更正為7788@20130905      sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;    NAME           CLASS   VALUE    -------------------- ---------- ----------     --執行上一個查詢后硬解析值為574    parse count (hard)      64    574

從上面的示例中可以看出,盡管執行的語句存在細微的差別,但Oracle還是為其進行了硬解析,生成了不同的執行計劃。即便是同樣的SQL語句,而兩條語句中空格的多少不一樣,Oracle同樣會進行硬解析。

四、硬解析改進 - 使用動態語句

1. 更改參數cursor_sharing

        參數cursor_sharing決定了何種類型的SQL能夠使用相同的SQL area

        CURSOR_SHARING = { SIMILAR | EXACT | FORCE }   

            EXACT      --只有當發布的SQL語句與緩存中的語句完全相同時才用已有的執行計劃。

            FORCE      --如果SQL語句是字面量,則迫使Optimizer始終使用已有的執行計劃,無論已有的執行計劃是不是最佳的。

            SIMILAR   --如果SQL語句是字面量,則只有當已有的執行計劃是最佳時才使用它,如果已有執行計劃不是最佳則重新對這個SQL

                            --語句進行分析來制定最佳執行計劃。

        可以基于不同的級別來設定該參數,如ALTER SESSION, ALTER SYSTEM

sys@ASMDB> show parameter cursor_shar       --查看參數cursor_sharing      NAME                 TYPE    VALUE      ------------------------------------ ----------- ------------------------------      cursor_sharing            string   EXACTsys@ASMDB> alter system set cursor_sharing='similar';  --將參數cursor_sharing的值更改為similarsys@ASMDB> select name,class,value from v$sysstat where statistic#=331;        NAME           CLASS   VALUE      -------------------- ---------- ----------    --當前硬解析的值為865      parse count (hard)      64    865scott@ASMDB> select * from dept where deptno=10;sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;       NAME           CLASS   VALUE      -------------------- ---------- ----------    --執行上一條SQL查詢后,硬解析的值變為866      parse count (hard)      64    866scott@ASMDB> select * from dept where deptno=20;sys@ASMDB> select name,class,value from v$sysstat where statistic#=331;      NAME           CLASS   VALUE      -------------------- ---------- ----------    --執行上一條SQL查詢后,硬解析的值沒有發生變化還是866      parse count (hard)      64    866sys@ASMDB> select sql_text,child_number from v$sql  -- 在下面的結果中可以看到SQL_TEXT列中使用了綁定變量:"SYS_B_0"       where sql_text like 'select * from dept where deptno%';      SQL_TEXT                      CHILD_NUMBE      -------------------------------------------------- ------------       select * from dept where deptno=:"SYS_B_0"          0sys@ASMDB> alter system set cursor_sharing='exact';    --將cursor_sharing改回為exact      --接下來在scott的session 中執行deptno=40 和的查詢后再查看sql_text,當cursor_sharing改為exact后,每執行那個一次      --也會在v$sql中增加一條語句sys@ASMDB> select sql_text,child_number from v$sql              where sql_text like 'select * from dept where deptno%';      SQL_TEXT                      CHILD_NUMBER      -------------------------------------------------- ------------      select * from dept where deptno=50              0         select * from dept where deptno=40              0      select * from dept where deptno=:"SYS_B_0"          0
 
2. 使用綁定變量的方式

綁定變量要求變量名稱,數據類型以及長度是一致,否則無法使用軟解析

(1). 綁定變量(bind variable)是指在DML語句中使用一個占位符,即使用冒號后面緊跟變量名的形式,如下

            select * from emp where empno=7788    --未使用綁定變量

            select * from emp where empono=:eno   --:eno即為綁定變量

            在第二個查詢中,變量值在查詢執行時被提供。該查詢只編譯一次,隨后會把查詢計劃存儲在一個共享池(庫緩存)中,以便以后獲取和重用這個查詢計劃。

(2). 下面使用了綁定變量,但兩個變量其實質是不相同的,對這種情形,同樣使用硬解析

            select * from emp where empno=:eno;

            select * from emp where empno=:emp_no

           使用綁定變量時要求不同的會話中使用了相同的回話環境,以及優化器的規則等

 

scott@ASMDB> create table tb_test(col int);   --創建表tb_testscott@ASMDB> create or replace procedure proc1 --創建存儲過程proc1使用綁定變量來插入新記錄asbeginfor i in 1..10000loopexecute immediate 'insert into tb_test values(:n)' using i;end loop;end;/Procedure created.scott@ASMDB> create or replace procedure proc2 --創建存儲過程proc2,未使用綁定變量,因此每一個SQL插入語句都會硬解析asbeginfor i in 1..10000loopexecute immediate 'insert into tb_test values('||i||')';end loop;end;/Procedure created.scott@ASMDB> exec runstats_pkg.rs_startPL/SQL procedure successfully completed.scott@ASMDB> exec proc1;PL/SQL procedure successfully completed.scott@ASMDB> exec runstats_pkg.rs_middle;PL/SQL procedure successfully completed.scott@ASMDB> exec proc2;PL/SQL procedure successfully completed.scott@ASMDB> exec runstats_pkg.rs_stop(1000);      Run1 ran in 1769 hsecs      Run2 ran in 12243 hsecs       --run2運行的時間是run1的/1769≈倍      run 1 ran in 14.45% of the time        Name                Run1   Run2   Diff      LATCH.SQL memory manager worka    410   2,694   2,284      LATCH.session allocation       532   8,912   8,380      LATCH.simulator lru latch       33   9,371   9,338      LATCH.simulator hash latch      51   9,398   9,347      STAT...enqueue requests        31  10,030   9,999      STAT...enqueue releases        29  10,030  10,001      STAT...parse count (hard)       4  10,011  10,007  --硬解析的次數,前者只有四次      STAT...calls to get snapshot s    55  10,087  10,032      STAT...parse count (total)      33  10,067  10,034      STAT...consistent gets        247  10,353  10,106      STAT...consistent gets from ca    247  10,353  10,106      STAT...recursive calls      10,474  20,885  10,411      STAT...db block gets from cach  10,408  30,371  19,963      STAT...db block gets       10,408  30,371  19,963      LATCH.enqueues            322  21,820  21,498  --閂的隊列數比較      LATCH.enqueue hash chains      351  21,904  21,553      STAT...session logical reads   10,655  40,724  30,069      LATCH.library cache pin      40,348  72,410  32,062  --庫緩存pin      LATCH.kks stats            8  40,061  40,053      LATCH.library cache lock       318  61,294  60,976      LATCH.cache buffers chains    51,851  118,340  66,489      LATCH.row cache objects       351  123,512  123,161      LATCH.library cache        40,710  234,653  193,943      LATCH.shared pool         20,357  243,376  223,019      Run1 latches total versus runs -- difference and pct      Run1   Run2   Diff   Pct      157,159  974,086  816,927 16.13%     --proc2使用閂的數量也遠遠多于proc1,其比值是.13% PL/SQL procedure successfully completed. 

 (3). 使用綁定變量的好處

由上面的示例可知,在未使用綁定變量的情形下,不論是解析次數,閂使用的數量,隊列,分配的內存,庫緩存,行緩存遠遠高于綁定

變量的情況。因此盡可能的使用綁定變量避免硬解析產生所需的額外的系統資源。

綁定變量的優點

減少SQL語句的硬解析,從而減少因硬解析產生的額外開銷(CPU,Shared pool,latch)。其次提高編程效率,減少數據庫的訪問次數。

綁定變量的缺點

 優化器就會忽略直方圖的信息,在生成執行計劃的時候可能不夠優化。SQL優化相對比較困難

五、總結

 1.盡可能的避免硬解析,因為硬解析需要更多的CPU資源,閂等。

 2.cursor_sharing參數應權衡利弊,需要考慮使用similar與force帶來的影響。

 3.盡可能的使用綁定變量來避免硬解析。 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩风俗一区 二区| 92看片淫黄大片欧美看国产片| 久久精品国产v日韩v亚洲| 午夜精品久久久久久久99热浪潮| 欧美在线播放视频| 91国内产香蕉| 成人在线一区二区| 久久国产精品久久久久| 日韩中文字幕视频在线观看| 91精品视频免费观看| 欧美www在线| 国产日韩精品在线观看| 欧美综合国产精品久久丁香| 国产一区二区日韩精品欧美精品| 日韩欧亚中文在线| 国产精品影院在线观看| 午夜精品蜜臀一区二区三区免费| 久久69精品久久久久久国产越南| 91国内揄拍国内精品对白| 97色在线观看| 欧美一区二三区| 日韩大胆人体377p| 久久在线免费视频| 成人激情视频在线播放| 日韩高清电影免费观看完整版| 97香蕉超级碰碰久久免费软件| 欧美在线视频播放| 一区二区在线视频| 国产精品1234| 国产精品v日韩精品| 91网站在线看| 亚洲free性xxxx护士hd| 美女精品久久久| 自拍偷拍亚洲一区| 91精品国产91久久久久久最新| 久久男人资源视频| 毛片精品免费在线观看| 国内精品视频在线| 欧美日韩裸体免费视频| 欧美视频13p| 中文字幕在线看视频国产欧美| 在线播放国产一区二区三区| www.国产一区| 国产三级精品网站| 久久久久久久999精品视频| 欧美成在线观看| 欧美国产日韩中文字幕在线| 国产精品2018| 亚洲精品v天堂中文字幕| 欧美激情免费视频| 亚洲欧美日韩国产成人| 97精品国产97久久久久久免费| 国产精品丝袜白浆摸在线| 亚洲综合日韩在线| 亚洲亚裔videos黑人hd| 成人网页在线免费观看| 2020欧美日韩在线视频| 欧美高清视频一区二区| 亚洲美女精品成人在线视频| 亚洲人成亚洲人成在线观看| 揄拍成人国产精品视频| 久久成人18免费网站| 92福利视频午夜1000合集在线观看| 日本久久精品视频| 亚洲男人av电影| 成人免费看吃奶视频网站| 欧美性视频在线| 奇门遁甲1982国语版免费观看高清| 欧美电影在线播放| 在线观看国产精品日韩av| 欧美国产乱视频| 国产在线拍揄自揄视频不卡99| 国产精品高潮在线| 亚洲最大的网站| 78色国产精品| 欧美一级视频在线观看| 亚洲精品在线91| 国产精品久久久久久搜索| 国产精品日本精品| 日韩美女在线观看| 深夜福利国产精品| 国产午夜精品视频免费不卡69堂| 中文字幕日韩精品在线观看| 欧美日韩福利在线观看| 91九色国产社区在线观看| 欧美激情一级欧美精品| 亚洲最大福利视频网站| 最近2019中文免费高清视频观看www99| 精品久久久久久久久久久久| 国产综合视频在线观看| 精品免费在线观看| 亚洲电影天堂av| 日韩中文字幕在线观看| 亚洲欧美日韩综合| 成人福利视频在线观看| 成人网在线免费看| 欧美精品18videos性欧| 97超级碰碰碰久久久| 国产综合久久久久| 97在线观看免费| 日韩精品极品在线观看| 国产日韩欧美视频在线| 国产精品91在线| 亚洲国产精品一区二区三区| 欧美精品成人91久久久久久久| 国产精品一区久久久| 国产精品色视频| 91免费视频国产| 555www成人网| 中文字幕精品久久久久| 日韩成人网免费视频| 欧美一区二区三区……| 岛国精品视频在线播放| 亚洲成年人影院在线| 国产在线视频不卡| 亚洲级视频在线观看免费1级| 亚洲日本成人网| 亚洲自拍偷拍福利| 在线视频欧美日韩精品| 97精品国产97久久久久久春色| 日韩免费在线观看视频| 久久综合久中文字幕青草| 伊人久久大香线蕉av一区二区| 亚洲aⅴ男人的天堂在线观看| 久久久av免费| 日韩欧美精品在线观看| 国内精品小视频在线观看| 中文欧美在线视频| 亚洲欧美精品伊人久久| 国产欧美日韩中文字幕在线| 欧美日韩中文字幕| 久久久国产成人精品| 97av在线影院| 亚洲国语精品自产拍在线观看| 久久久久久91| 66m—66摸成人免费视频| 欧美成人一区二区三区电影| 欧美亚洲在线视频| 综合激情国产一区| 国产精品欧美日韩一区二区| 色噜噜国产精品视频一区二区| 久久久噜久噜久久综合| 亚洲精品资源美女情侣酒店| 亚洲黄页网在线观看| 国模吧一区二区三区| 亚洲男人的天堂在线播放| 亚洲精品久久久久久久久久久久| 亚洲国产成人一区| 成人免费在线视频网址| 亚洲精品成人久久| 久久久国产成人精品| 国产精品jizz在线观看麻豆| 欧美高清视频免费观看| 欧美一级大片在线观看| 国产亚洲精品久久久优势| 欧美成人午夜剧场免费观看| 亚洲最大福利网| 日韩视频免费大全中文字幕| 国产欧美日韩免费| 久久久中精品2020中文| 久久久久久久久久久91| 亚洲成av人片在线观看香蕉| 国产一区二区三区在线免费观看| 亚洲第五色综合网|