从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. 将计算从等号左边移到右边 where goods_no>2 or goods_no<2
不要使用is null , 如WHERE DEPT_CODE IS NOT NULL 要改为 WHERE DEPT_CODE >=0;
3.5 select 的列如果全是索引列时 select order_no,order_time from shop_order where shop_no=4
当order_no,order_time,shop_no 这三列全为索引列时,你将看到一个和平时完全不同的执行计划。 4.减少查询往返和查询的表 4.2 封装PL/SQL内部函数 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)
DELETE FROM EMP E
WHERE E.ROWID > (SELECT MIN(X.ROWID) FROM EMP X WHERE X.EMP_NO = E.EMP_NO);
6.终极秘技 - Hints |
|