Wednesday, April 23, 2008

如何学习ORACLE优化

反正有空,说一下我能想到的,很多方面我的了解都很浅薄,甚至只有一个不甚清楚的概念,仅供参考。

最基本的还是要了解oracle的工作方式,oracle的架构,存储的,内存的,进程的,dedicate server/shared server, redo和undo,latch和lock。。。。。。no knowledge, no tune.

了解常见的调优思想,responese time=wait time+service time是最基本的思想,基于ratio的思想虽然总是被批驳,但有时候值得参考。对于wait time你要了解什么是wait event,了解常见的wait event。idle的event,non-idle的event,到底先定位哪个问题?idle的event是不是真的就可以忽略? 都是需要商榷的。对于service time你要关心CPU的使用,你的系统花费了多少CPU,都用在哪里?怎么获取这些信息?你是否能够v$sysstat和v$sesstat找到你需要 的信息?

了解常用的调优工具,explain plan, sql trace, 10046 event, 10053 event, other events,tkprof。。。。。。还有最常用的statspack,给你一个statspack report,你能挖掘多少信息?了解常见的数据字典并能够从中迅速获取信息。v$latch, v$lock, v$session, v$session_longops, v$session_wait, v$sysstat.........

熟悉sql优化,这恐怕是个无止境的topic,总之尽力而为吧。。。不停的学习体会,了解各种Hint,一点一点的了解神秘的CBO optimier,了解各种相关的初始化参数,了解典型的SQL计划,nested loop, hash join, merge join, inlist, index range scan, fast full index scan, full table scan......

对sql的优化当然也包括所谓的physical design, 建什么样的索引,什么样的表,了解heap table, IOT, cluster table, btree index, bitmap index,分区表/索引,物化视图......各有什么特点,优点,缺点。

要有大局观,什么时候从session级别着手,什么时候从系统级别着手,什么时候能够斩钉截铁的说:“这不是数据库的问题!请检查硬件/网络/应用。。。”

要有前瞻性,不是一定要等到问题发生的时候才去研究问题,如果用户的并发数翻一倍,系统的压力会增加多少个precent?如果系统的CPU使用率从30%涨到60%,性能的下降将是线性的还是指数性的?下降多少个precent?queuing theory是什么?

最后怎么把所有的这些知识融会贯通?

当然有时候也可以唯心一把,祈祷一下你会获得更多的奇思妙想,更多的灵感。不过有时候你可能会发现,当你绞尽脑汁,百思不得其解,即使在睡梦中也难以释怀之时,灵感却在第二天的清晨不期而至