kxbin
          成功留給有準(zhǔn)備的人
          posts - 10,  comments - 35,  trackbacks - 0

          oracle SQL語句執(zhí)行步驟

          Oracle中SQL語句執(zhí)行過程中,Oracle內(nèi)部解析原理如下:

            1、當(dāng)一用戶第一次提交一個SQL表達式時,Oracle會將這SQL進行Hard parse,這過程有點像程序編譯,檢查語法、表名、字段名等相關(guān)信息(如下圖),這過程會花比較長的時間,因為它要分析語句的語法與語義。然后獲得最優(yōu)化后的執(zhí)行計劃(sql plan),并在內(nèi)存中分配一定的空間保存該語句與對應(yīng)的執(zhí)行計劃等信息。

            2、當(dāng)用戶第二次請求或多次請求時,Oracle會自動找到先前的語句與執(zhí)行計劃,而不會進行Hard parse,而是直接進行Soft parse(把語句對應(yīng)的執(zhí)行計劃調(diào)出,然后執(zhí)行),從而減少數(shù)據(jù)庫的分析時間。

            注意的是:Oracle中只能完全相同的語句,包大小寫、空格、換行都要求一樣時,才會重復(fù)使用以前的分析結(jié)果與執(zhí)行計劃。

            分析過程如下圖:


            對于大量的、頻繁訪問的SQL語句,如果不采用Bind 變量的方式,哪Oracle會花費大量的Shared latch與CPU在做Hard parse處理,所以,要盡量提高語句的重用率,減少語句的分析時間,通過了解Oracle SQL語句的分析過程可以明白Oracle的內(nèi)部處理邏輯,并在設(shè)計與實現(xiàn)上避免。

            在用JDBC或其它持久化數(shù)據(jù)(如Hibernate,JDO等)操作時,盡量用占位符(?)

            

          ORACLE sql 的處理過程大致如下:
           1.
          運用HASH算法,得到一個HASH值,這個值可以通過V$SQLAREA.HASH_VALUE 查看
           2.
          shared pool 中的 library cache 中查找是否有相同的HASH值,如果存在,則無需硬解析,進行軟解析
           3.
          如果shared pool不存在此HASH值,則進行語法檢查,查看是否有語法錯誤
           4.
          如果沒有語法錯誤,就進行語義檢查,檢查該SQL引用的對象是否存在,該用戶是否具有訪問該對象的權(quán)限
           5.
          如果沒有語義錯誤,對該SQL進行解析,生成解析樹,執(zhí)行計劃
           6.
          生成ORACLE能運行的二進制代碼,運行該代碼并且返回結(jié)果給用戶
          硬解析和軟解析都在第5步進行
          硬解析通常是昂貴的操作,大約占整個SQL執(zhí)行的70%左右的時間,硬解析會生成執(zhí)行樹,執(zhí)行計劃,等等。
          當(dāng)再次執(zhí)行同一條SQL語句的時候,由于發(fā)現(xiàn)library cache中有相同的HASH值,這個時候不會硬解析,而會軟解析,
          那么軟解析究竟是干了什么呢?其實軟解析就是跳過了生成解析樹,生成執(zhí)行計劃這個耗時又耗CPU的操作,直接利用生成的執(zhí)行計劃運行
          SQL語句。
          下面摘抄eygle深入解析ORACLE 中關(guān)于SQL執(zhí)行過程的描述
            1.
          首先獲得library cache latch,根據(jù)SQLHASH_VALUElibrary cache中查找是否存在此HASH_VALUE,如果找到這個HASH_VALUE,稱之為軟解析,Server獲得改SQL執(zhí)行計劃轉(zhuǎn)向第4步,如果找不到共享代碼就進行硬解析。
            2.
          釋放library pool cache,獲得shared pool latch,查找并鎖定自由空間(bucket 中查找chunk)。如果找不到,報ORA-04031錯誤
            3.
          釋放shared pool latch,重新獲得library cache latch,SQL執(zhí)行計劃放入library cache中。
            4.
          釋放library cache latch,保持null模式的library cache pin/lock.
            5.
          開始執(zhí)行。
          Library cache latch
          可以理解為硬/軟解析的時候發(fā)生的,因為解析的時候會搜索library cache,所以會產(chǎn)生library cache latch
          Library cache pin
          是在執(zhí)行的階段發(fā)生的。

          posted on 2012-09-28 11:28 kxbin 閱讀(1795) 評論(0)  編輯  收藏 所屬分類: ORACLE
          你恨一個人是因為你愛他;你喜歡一個人,是因為他身上有你沒有的;你討厭一個人是因為他身上有你有的東西;你經(jīng)常在別人面前批評某人,其實潛意識中是想接近他。

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          常用鏈接

          留言簿(5)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          J2EE

          java技術(shù)網(wǎng)站

          Linux

          平時常去的網(wǎng)站

          數(shù)據(jù)庫

          電影網(wǎng)站

          網(wǎng)站設(shè)計

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 土默特右旗| 岳阳市| 安远县| 桃江县| 榆林市| 安平县| 武川县| 洱源县| 高碑店市| 达拉特旗| 刚察县| 玛沁县| 皮山县| 买车| 镇康县| 新邵县| 洪江市| 淮北市| 池州市| 灵寿县| 云龙县| 汝州市| 闵行区| 旬邑县| 招远市| 宁陕县| 莒南县| 会宁县| 衡阳市| 甘德县| 瑞安市| 平安县| 军事| 上饶市| 桐柏县| 新兴县| 台南市| 收藏| 甘谷县| 东城区| 辉县市|