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

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

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

    爪哇一角

    共同探討STRUTS#HIBERNATE#SPRING#EJB等技術(shù)
    posts - 3, comments - 6, trackbacks - 0, articles - 99
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    sql語(yǔ)句的執(zhí)行順序

    Posted on 2008-11-28 16:58 非洲小白臉 閱讀(310) 評(píng)論(0)  編輯  收藏 所屬分類: oracle
    一、sql語(yǔ)句的執(zhí)行步驟:
     1)語(yǔ)法分析,分析語(yǔ)句的語(yǔ)法是否符合規(guī)范,衡量語(yǔ)句中各表達(dá)式的意義。
    2) 語(yǔ)義分析,檢查語(yǔ)句中涉及的所有數(shù)據(jù)庫(kù)對(duì)象是否存在,且用戶有相應(yīng)的權(quán)限。
    3)視圖轉(zhuǎn)換,將涉及視圖的查詢語(yǔ)句轉(zhuǎn)換為相應(yīng)的對(duì)基表查詢語(yǔ)句。
    4)表達(dá)式轉(zhuǎn)換, 將復(fù)雜的 SQL 表達(dá)式轉(zhuǎn)換為較簡(jiǎn)單的等效連接表達(dá)式。
     5)選擇優(yōu)化器,不同的優(yōu)化器一般產(chǎn)生不同的“執(zhí)行計(jì)劃”
    6)選擇連接方式, ORACLE 有三種連接方式,對(duì)多表連接 ORACLE 可選擇適當(dāng)?shù)倪B接方式。
    7)選擇連接順序, 對(duì)多表連接 ORACLE 選擇哪一對(duì)表先連接,選擇這兩表中哪個(gè)表做為源數(shù)據(jù)表。
    8)選擇數(shù)據(jù)的搜索路徑,根據(jù)以上條件選擇合適的數(shù)據(jù)搜索路徑,如是選用全表搜索還是利用索引或是其他的方式。
    9)運(yùn)行“執(zhí)行計(jì)劃”
    二、oracle 共享原理:
            ORACLE將執(zhí)行過(guò)的SQL語(yǔ)句存放在內(nèi)存的共享池(shared buffer pool)中,可以被所有的數(shù)據(jù)庫(kù)用戶共享 當(dāng)你執(zhí)行一個(gè)SQL語(yǔ)句(有時(shí)被稱為一個(gè)游標(biāo))時(shí),如果它和之前的執(zhí)行過(guò)的語(yǔ)句完全相同, ORACLE就能很快獲得已經(jīng)被解析的語(yǔ)句以及最好的 執(zhí)行路徑. 這個(gè)功能大大地提高了SQL的執(zhí)行性能并節(jié)省了內(nèi)存的使用
    三、oracle 語(yǔ)句提高查詢效率的方法:1: where column in(select * from ... where ...); 2:... where exists (select 'X' from ...where ...); 第二種格式要遠(yuǎn)比第一種格式的效率高。在Oracle中可以幾乎將所有的IN操作符子查詢改寫(xiě)為使用EXISTS的子查詢 使用EXIST,Oracle系統(tǒng)會(huì)首先檢查主查詢,然后運(yùn)行子查詢直到它找到第一個(gè)匹配項(xiàng),這就節(jié)省了時(shí)間 Oracle系統(tǒng)在執(zhí)行IN子查詢時(shí),首先執(zhí)行子查詢,并將獲得的結(jié)果列表存放在在一個(gè)加了索引的臨時(shí)表中 避免使用having字句 避免使用HAVING子句, HAVING 只會(huì)在檢索出所有記錄之后才對(duì)結(jié)果集進(jìn)行過(guò)濾. 這個(gè)處理需要排序,總計(jì)等操作. 如果能通過(guò)WHERE子句限制記錄的數(shù)目,那就能減少這方面的開(kāi)銷

    SQL Select語(yǔ)句完整的執(zhí)行順序: 

    1、from子句組裝來(lái)自不同數(shù)據(jù)源的數(shù)據(jù);
     2、where子句基于指定的條件對(duì)記錄行進(jìn)行篩選;
    3、group by子句將數(shù)據(jù)劃分為多個(gè)分組;
    4、使用聚集函數(shù)進(jìn)行計(jì)算;
    5、使用having子句篩選分組;
    6、計(jì)算所有的表達(dá)式;
    7、使用order by對(duì)結(jié)果集進(jìn)行排序。

    ----------------------------------------------------------------------------------------------

    WHERE子句解析順序分析:

    由于SQL優(yōu)化起來(lái)比較復(fù)雜,并且還會(huì)受環(huán)境限制,在開(kāi)發(fā)過(guò)程中,寫(xiě)SQL必須必須要遵循以下幾點(diǎn)的原則:

    1.ORACLE采用自下而上的順序解析WHERE子句,根據(jù)這個(gè)原理,表之間的連接必須寫(xiě)在其他WHERE條件之前, 那些可以過(guò)濾掉最大數(shù)量記錄的條件必須寫(xiě)在WHERE子句的末尾.

    例如:

    (低效)

    SELECT … FROM EMP E WHERE SAL > 50000 AND JOB = ‘MANAGER’ AND 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO);

    (高效)

    SELECT … FROM EMP E WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO) AND SAL > 50000 AND JOB = ‘MANAGER’;

    2.SELECT子句中避免使用’*’

    當(dāng)在SELECT子句中列出所有的COLUMN時(shí),使用動(dòng)態(tài)SQL列引用 ‘*’ 是一個(gè)方便的方法.可是,這是一個(gè)非常低效的方法. 實(shí)際上,ORACLE在解析的過(guò)程中, 會(huì)將’*’ 依次轉(zhuǎn)換成所有的列名, 這個(gè)工作是通過(guò)查詢數(shù)據(jù)字典完成的, 這意味著將耗費(fèi)更多的時(shí)間.

    3.使用表的別名(Alias)

    當(dāng)在SQL語(yǔ)句中連接多個(gè)表時(shí), 請(qǐng)使用表的別名并把別名前綴于每個(gè)Column上.這樣一來(lái),就可以減少解析的時(shí)間并減少那些由Column歧義引起的語(yǔ)法錯(cuò)誤.

    注:Column歧義指的是由于SQL中不同的表具有相同的Column名,當(dāng)SQL語(yǔ)句中出現(xiàn)這個(gè)Column時(shí),SQL解析器無(wú)法判斷這個(gè)Column的歸屬。

    主站蜘蛛池模板: 亚洲日本一区二区三区在线| 久久亚洲精品无码VA大香大香| 国产午夜精品免费一区二区三区| 亚洲精品无码久久久久久久 | 成人午夜视频免费| 国产午夜亚洲精品不卡免下载| 亚洲成熟xxxxx电影| 成人毛片18岁女人毛片免费看| 国产大片免费天天看| 亚洲婷婷天堂在线综合| 亚洲不卡无码av中文字幕| 91高清免费国产自产拍2021| 国产亚洲精彩视频| 亚洲美女视频免费| 四虎AV永久在线精品免费观看| 免费无码又爽又刺激高潮视频| 小说区亚洲自拍另类| 久久精品国产亚洲77777| 亚洲国产av一区二区三区| 无码av免费毛片一区二区| a视频在线观看免费| 国产亚洲蜜芽精品久久| 亚洲精品91在线| 亚洲综合AV在线在线播放| 最新中文字幕免费视频| 无码人妻精品中文字幕免费| 精品女同一区二区三区免费播放 | 中文字幕无码日韩专区免费 | 东北美女野外bbwbbw免费| 亚洲最大的成人网站| 香蕉视频在线观看亚洲| 亚洲精品高清在线| 女人18一级毛片免费观看| 午夜视频在线免费观看| 成人午夜免费视频| 国产精品无码亚洲精品2021 | 亚洲an日韩专区在线| 国产亚洲一区二区在线观看 | 亚洲国产精品久久久久秋霞影院 | 亚洲综合激情另类专区| 免费无码又爽又高潮视频|