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

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

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

    月亮的太陽

    小乖的BLOG
    posts - 114, comments - 41, trackbacks - 0, articles - 27
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Oracle 10g SQL 優(yōu)化再學(xué)習(xí)

    Posted on 2005-12-16 09:57 月亮的太陽 閱讀(549) 評論(0)  編輯  收藏 所屬分類: 編程
    從8i到10g,Oracle不斷進化自己的SQL Tuning智能,一些秘籍級的優(yōu)化口訣已經(jīng)失效。
       但我喜歡失效,不用記口訣,操個Toad for Oracle Xpert ,按照大方向舒舒服服的調(diào)優(yōu)才是愛做的事情。

    1.Excution Plan
         Excution Plan是最基本的調(diào)優(yōu)概念,不管你的調(diào)優(yōu)吹得如何天花亂墮,結(jié)果還是要由Excution plan來顯示Oracle 最終用什么索引、按什么順序連接各表,F(xiàn)ull Table Scan還是Access by Rowid Index,瓶頸在什么地方。如果沒有它的指導(dǎo),一切調(diào)優(yōu)都是蒙的。


    2.Toad for Oracle Xpert
        用它來調(diào)優(yōu)在真的好舒服。Quest 吞并了Lecco后,將它整合到了Toad 的SQL Tunning里面:最清晰的執(zhí)行計劃顯示,自動生成N條等價SQL、給出優(yōu)化建議,不同SQL執(zhí)行計劃的對比,還有實際執(zhí)行的邏輯讀、物理讀數(shù)據(jù)等等一目了然。


    3.索引
       大部分的性能問題其實都是索引應(yīng)用的問題,Where子句、Order By、Group By 都要用到索引。
       一般開發(fā)人員認為將索引建全了就可以下班回家了,實則還有頗多的思量和陷阱。

    3.1 索引列上不要進行計算
          這是最最普遍的失效陷阱,比如where trunc(order_date)=trunc(sysdate), i+2>4。索引失效的原因也簡單,索引是針對原值建的二叉樹,你將列值*3/4+2折騰一番后,原來的二叉樹當(dāng)然就用不上了。解決的方法:
      1. 換成等價語法,比如trunc(order_date) 換成
    where order_date>trunc(sysdate)-1 and order_date<trunc(sysdate)+1

      2.    特別為計算建立函數(shù)索引

    create index I_XXXX on shop_order(trunc(order_date))

        3.    將計算從等號左邊移到右邊
     這是針對某些無心之失的糾正,把a*2>4 改為a>4/2;把TO_CHAR(zip) = '94002' 改為zip = TO_NUMBER('94002');

    3.2 CBO與索引選擇性
         建了索引也不一定會被Oracle用的,就像個挑食的孩子。基于成本的優(yōu)化器(CBO, Cost-Based Optimizer),會先看看表的大小,還有索引的重復(fù)度,再決定用還是不用。表中有100 條記錄而其中有80 個不重復(fù)的索引鍵值. 這個索引的選擇性就是80/100 = 0.8,留意Toad里顯示索引的Selective和Cardinailty。實在不聽話時,就要用hints來調(diào)教。
         另外,where語句存在多條索引可用時,只會選擇其中一條。所以索引也不是越多越好:)

    3.3 索引重建
         傳說中數(shù)據(jù)更新頻繁導(dǎo)致有20%的碎片時,Oracle就會放棄這個索引。寧可信其有之下,應(yīng)該時常alter index <INDEXNAME> rebuild一下。

    3.4 其他要注意的地方
          不要使用Not,如goods_no != 2,要改為

    where goods_no>2 and goods_no<2

          不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改為

    WHERE DEPT_CODE >=0;

    3.5 select 的列如果全是索引列時
       又如果沒有where 條件,或者where條件全部是索引列時,Oracle 將直接從索引里獲取數(shù)據(jù)而不去讀真實的數(shù)據(jù)表,這樣子理論上會快很多,比如

    select order_no,order_time from shop_order where shop_no=4

    當(dāng)order_no,order_time,shop_no 這三列全為索引列時,你將看到一個和平時完全不同的執(zhí)行計劃。

    3.6 位圖索引
         傳說中當(dāng)數(shù)據(jù)值較少,比如某些表示分類、狀態(tài)的列,應(yīng)該建位圖索引而不是普通的二叉樹索引,否則效率低下。不過看執(zhí)行計劃,這些位圖索引鮮有被Oracle臨幸的。
     

    4.減少查詢往返和查詢的表
    這也是很簡單的大道理,程序與Oracle交互的成本極高,所以一個查詢能完成的不要分開兩次查,如果一個循環(huán)執(zhí)行1萬條查詢的,怎么都快不到哪里去了。

    4.1 封裝PL/SQL存儲過程
      最高級的做法是把循環(huán)的操作封裝到PL/SQL寫的存儲過程里,因為存儲過程都在服務(wù)端執(zhí)行,所以沒有數(shù)據(jù)往返的消耗。

    4.2 封裝PL/SQL內(nèi)部函數(shù)
      有機會,將一些查詢封裝到函數(shù)里,而在普通SQL里使用這些函數(shù),同樣是很有效的優(yōu)化。

    4.3 Decode/Case
      但存儲過程也麻煩,所以有case/decode把幾條條件基本相同的重復(fù)查詢合并為一條的用法:

    SELECT
     
    COUNT(CASE WHEN price < 13 THEN 1 ELSE null END) low,
     
    COUNT(CASE WHEN price BETWEEN 13 AND 15 THEN 1 ELSE null END) med,
     
    COUNT(CASE WHEN price > 15 THEN 1 ELSE null END) high
    FROM products;

    4.4 一種Where/Update語法

    SELECT TAB_NAME FROM TABLES
    WHERE (TAB_NAME,DB_VER) = (( SELECT TAB_NAME,DB_VER)
    FROM TAB_COLUMNS WHERE VERSION = 604)

    UPDATE EMP
    SET (EMP_CAT, SAL_RANGE)
    = (SELECT MAX(CATEGORY)FROM EMP_CATEGORIES)


    5.其他優(yōu)化

    5.1RowID和ROWNUM
         連Hibernate 新版也支持ROWID了,證明它非常有用。比如號稱刪除重復(fù)數(shù)據(jù)的最快寫法:

    DELETE FROM EMP E
    WHERE E.ROWID > (SELECT MIN(X.ROWID)
    FROM EMP X
    WHERE X.EMP_NO = E.EMP_NO);

     

    6.終極秘技 - Hints
       這是Oracle DBA的玩具,也是終極武器,比如Oracle在CBO,RBO中所做的選擇總不合自己心水時,可以用它來強力調(diào)教一下Oracle,結(jié)果經(jīng)常讓人喜出望外。
       如果開發(fā)人員沒那么多時間來專門學(xué)習(xí)它,可以依靠Toad SQL opmitzer 來自動生成這些提示,然后對比一下各種提示的實際效果。不過隨著10g智能的進化,hints的驚喜少了。

    7. 找出要優(yōu)化的Top SQL
        磨了這么久的槍,如果找不到敵人是件郁悶的事情。
        幸虧10g這方面做得非常好。進入Web管理界面,就能看到當(dāng)前或者任意一天的SQL列表,按性能排序。
        有了它,SQL Trace和TKPROF都可以不用了。

    Tracker: http://www.tkk7.com/calvin/archive/2005/11/11/19276.html

    主站蜘蛛池模板: 久久国产福利免费| 国产97视频人人做人人爱免费| 久久这里只精品国产免费10 | 97在线观免费视频观看| 77777_亚洲午夜久久多人| 久9久9精品免费观看| 亚洲成色www久久网站夜月| 人人玩人人添人人澡免费| 亚洲va在线va天堂va888www| 久久永久免费人妻精品下载| 亚洲日本国产精华液| 歪歪漫画在线观看官网免费阅读| 亚洲最大天堂无码精品区| 国产公开免费人成视频| 国产精品九九久久免费视频| 亚洲av无码成h人动漫无遮挡| 国产精品美女久久久免费| 亚洲AV无码1区2区久久| 免费精品国产自产拍在| 亚洲精品国产av成拍色拍| 亚洲伊人成无码综合网| 无码国产精品一区二区免费3p| 亚洲成A∨人片在线观看无码| 午夜私人影院免费体验区| 全黄A免费一级毛片| 亚洲AV无码精品色午夜果冻不卡| 3d成人免费动漫在线观看| 亚洲av无码有乱码在线观看| 亚洲性久久久影院| 0588影视手机免费看片| 亚洲乱亚洲乱妇无码| 亚洲国产精品一区二区第一页免| 今天免费中文字幕视频| 亚洲第一男人天堂| 中文字幕亚洲无线码| 91成人免费观看网站| 国产激情久久久久影院老熟女免费| 亚洲色成人网一二三区| 免费又黄又爽又猛的毛片| 久久嫩草影院免费看夜色| 美女被暴羞羞免费视频|