<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

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

      1、當(dāng)一用戶(hù)第一次提交一個(gè)SQL表達(dá)式時(shí),Oracle會(huì)將這SQL進(jìn)行Hard parse,這過(guò)程有點(diǎn)像程序編譯,檢查語(yǔ)法、表名、字段名等相關(guān)信息(如下圖),這過(guò)程會(huì)花比較長(zhǎng)的時(shí)間,因?yàn)樗治稣Z(yǔ)句的語(yǔ)法與語(yǔ)義。然后獲得最優(yōu)化后的執(zhí)行計(jì)劃(sql plan),并在內(nèi)存中分配一定的空間保存該語(yǔ)句與對(duì)應(yīng)的執(zhí)行計(jì)劃等信息。

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

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

      分析過(guò)程如下圖:


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

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

      

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

    posted on 2012-09-28 11:28 kxbin 閱讀(1791) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): ORACLE
    你恨一個(gè)人是因?yàn)槟銗?ài)他;你喜歡一個(gè)人,是因?yàn)樗砩嫌心銢](méi)有的;你討厭一個(gè)人是因?yàn)樗砩嫌心阌械臇|西;你經(jīng)常在別人面前批評(píng)某人,其實(shí)潛意識(shí)中是想接近他。

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(5)

    隨筆檔案

    文章分類(lèi)

    文章檔案

    相冊(cè)

    收藏夾

    J2EE

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

    Linux

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

    數(shù)據(jù)庫(kù)

    電影網(wǎng)站

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

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 99久久99这里只有免费费精品 | 亚洲国产综合无码一区| 波多野结衣在线免费观看| 三上悠亚在线观看免费| 国产成人亚洲精品播放器下载| 亚洲一级毛片中文字幕| 国产亚洲精品自在久久| 成人免费网站久久久| 亚洲激情校园春色| 亚洲综合色自拍一区| 免费人成视频在线观看不卡| 成年女人毛片免费观看97| 8x8×在线永久免费视频| 免费黄网站在线观看| 国产免费牲交视频免费播放| 日韩色日韩视频亚洲网站| 亚洲熟妇无码av另类vr影视| 亚洲图片校园春色| 久久久久亚洲AV无码专区首JN| 亚洲日韩欧洲无码av夜夜摸| 亚洲中文字幕无码一区二区三区| 免费午夜爽爽爽WWW视频十八禁| 日韩免费a级在线观看| 成人午夜视频免费| 免费鲁丝片一级观看| 欧洲美熟女乱又伦免费视频| 好吊妞视频免费视频| 啦啦啦www免费视频| 在线免费观看污网站| 日本特黄特黄刺激大片免费| 在线观看成人免费| 最近最好的中文字幕2019免费 | 亚洲动漫精品无码av天堂| 国产亚洲美女精品久久久2020| 亚洲女同成人AⅤ人片在线观看| 亚洲精品成人区在线观看| ZZIJZZIJ亚洲日本少妇JIZJIZ| 2022中文字字幕久亚洲| 国产精品亚洲精品日韩已满| 亚洲AV无码成人精品区蜜桃| 亚洲精品人成在线观看|