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

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

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

    爪哇一角

    共同探討STRUTS#HIBERNATE#SPRING#EJB等技術
    posts - 3, comments - 6, trackbacks - 0, articles - 99
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    sql語句的執行順序

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

    SQL Select語句完整的執行順序: 

    1、from子句組裝來自不同數據源的數據;
     2、where子句基于指定的條件對記錄行進行篩選;
    3、group by子句將數據劃分為多個分組;
    4、使用聚集函數進行計算;
    5、使用having子句篩選分組;
    6、計算所有的表達式;
    7、使用order by對結果集進行排序。

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

    WHERE子句解析順序分析:

    由于SQL優化起來比較復雜,并且還會受環境限制,在開發過程中,寫SQL必須必須要遵循以下幾點的原則:

    1.ORACLE采用自下而上的順序解析WHERE子句,根據這個原理,表之間的連接必須寫在其他WHERE條件之前, 那些可以過濾掉最大數量記錄的條件必須寫在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子句中避免使用’*’

    當在SELECT子句中列出所有的COLUMN時,使用動態SQL列引用 ‘*’ 是一個方便的方法.可是,這是一個非常低效的方法. 實際上,ORACLE在解析的過程中, 會將’*’ 依次轉換成所有的列名, 這個工作是通過查詢數據字典完成的, 這意味著將耗費更多的時間.

    3.使用表的別名(Alias)

    當在SQL語句中連接多個表時, 請使用表的別名并把別名前綴于每個Column上.這樣一來,就可以減少解析的時間并減少那些由Column歧義引起的語法錯誤.

    注:Column歧義指的是由于SQL中不同的表具有相同的Column名,當SQL語句中出現這個Column時,SQL解析器無法判斷這個Column的歸屬。

    主站蜘蛛池模板: 无套内谢孕妇毛片免费看看| 亚洲偷自拍另类图片二区| 特级毛片A级毛片100免费播放| 国产v精品成人免费视频400条| 亚洲四虎永久在线播放| 日本免费一区二区三区四区五六区| 亚洲av午夜成人片精品网站| 三级网站免费观看| 精品久久香蕉国产线看观看亚洲| 国产一级一毛免费黄片| 国产亚洲精品国产| 外国成人网在线观看免费视频| 亚洲∧v久久久无码精品 | 亚洲色中文字幕无码AV| 成人免费ā片在线观看| 亚洲自偷自拍另类12p| 免费下载成人电影| 亚洲AV成人一区二区三区观看 | 亚洲动漫精品无码av天堂| 青柠影视在线观看免费高清| 亚洲国产精品婷婷久久| 91香蕉国产线在线观看免费| 亚洲天堂2016| 免费在线观看一级毛片| 中国一级全黄的免费观看| 亚洲视频免费观看| 永久久久免费浮力影院| 人碰人碰人成人免费视频| 亚洲av不卡一区二区三区| 成人av免费电影| 国产成人精品免费视频大全| 午夜亚洲www湿好大| 午夜dj在线观看免费视频| 一级毛片免费不卡直观看| 亚洲精品韩国美女在线| 国产男女猛烈无遮挡免费视频| 丁香花在线观看免费观看图片| 亚洲国产精品综合久久2007| 免费大黄网站在线观| 97在线视频免费| 无遮挡免费一区二区三区|