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

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

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

    鷹翔宇空

    學習和生活

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks
    引自:http://www.tkk7.com/calvin/archive/2005/11/11/19276.html

    從8i到10g,Oracle不斷進化自己的SQL Tuning智能,一些秘籍級的優化口訣已經失效。
    ???但我喜歡失效,不用記口訣,操個Toad for Oracle Xpert?,按照大方向舒舒服服的調優才是愛做的事情。

    1.Excution Plan
    ???? Excution Plan是最基本的調優概念,不管你的調優吹得如何天花亂墮,結果還是要由Excution plan來顯示Oracle 最終用什么索引、按什么順序連接各表,Full Table Scan還是Access by Rowid Index,瓶頸在什么地方。如果沒有它的指導,一切調優都是蒙的。


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


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

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

     ?2.??? 特別為計算建立函數索引

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

    3.3 索引重建
    ?????傳說中數據更新頻繁導致有20%的碎片時,Oracle就會放棄這個索引。寧可信其有之下,應該時常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 將直接從索引里獲取數據而不去讀真實的數據表,這樣子理論上會快很多,比如

    select?order_no,order_time?from?shop_order?where?shop_no=4

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

    3.6 位圖索引
    ?????傳說中當數據值較少,比如某些表示分類、狀態的列,應該建位圖索引而不是普通的二叉樹索引,否則效率低下。不過看執行計劃,這些位圖索引鮮有被Oracle臨幸的。
    ?

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

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

    4.2 封裝PL/SQL內部函數
    ??有機會,將一些查詢封裝到函數里,而在普通SQL里使用這些函數,同樣是很有效的優化。

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

    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.其他優化

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

    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中所做的選擇總不合自己心水時,可以用它來強力調教一下Oracle,結果經常讓人喜出望外。
    ?? 如果開發人員沒那么多時間來專門學習它,可以依靠Toad SQL opmitzer 來自動生成這些提示,然后對比一下各種提示的實際效果。不過隨著10g智能的進化,hints的驚喜少了。

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

    posted on 2006-01-13 12:44 TrampEagle 閱讀(311) 評論(0)  編輯  收藏 所屬分類: datebase
    主站蜘蛛池模板: 亚洲人成亚洲精品| 亚洲男同帅GAY片在线观看| 亚洲国产亚洲片在线观看播放| 三级网站在线免费观看| 自拍偷自拍亚洲精品第1页| 一级毛片在线播放免费| 亚洲精品动漫人成3d在线| 国产日韩在线视频免费播放| 久久久久亚洲精品中文字幕| 久久精品成人免费国产片小草| 亚洲精品制服丝袜四区| 免费A级毛片av无码| 亚洲熟妇无码爱v在线观看| 最近免费中文字幕4| 国产精成人品日日拍夜夜免费| 亚洲乱色熟女一区二区三区丝袜| 黄色网站软件app在线观看免费| 国产精品亚洲A∨天堂不卡| 99爱视频99爱在线观看免费 | 亚洲精品国产高清不卡在线| 成人免费777777被爆出| 亚洲av无码无在线观看红杏| **一级毛片免费完整视| 亚洲欧洲免费无码| 亚洲精品无码你懂的网站| 9久热这里只有精品免费| 亚洲第一网站免费视频| 日本19禁啪啪无遮挡免费动图| 国产免费内射又粗又爽密桃视频| 亚洲一区二区三区四区在线观看| 91免费资源网站入口| 日本久久久久亚洲中字幕| 成人免费无码大片A毛片抽搐| 日韩在线观看视频免费| 91情国产l精品国产亚洲区| 国产无遮挡裸体免费视频在线观看| 亚洲综合视频在线观看| 免费h成人黄漫画嘿咻破解版| 日本亚洲欧洲免费天堂午夜看片女人员 | 久久国产精品免费| 亚洲AV无码乱码麻豆精品国产|