去年大概8月份的时候, 我看完了Cost-Based Oracle Fundamentals,在SQL Tuning方面,我是藉由这书入门的,一本经典好书可以帮助提升在某一方面的层次。之后我想找Jonathan Lewis的一本更旧十年前的书看 – Practical Oracle8i™: Building Efficient Databases,当时还在豆瓣上找看过这本书的朋友,看看能不能把书借给我看或者卖给我。
不久后Jonathan Lewis在博客上宣布今年会出一本新书,我对这本书充满期待,期间甚至几次上过amazon.com这本书的主页,看看mobi格式的电子书出版了没有。这次不是关于优化器的进阶版本,而是一本关于Oracle internal的书籍。我是从Jonathan的博客知道Oracle Core的电子版已经在apress.com出售并且当天有15美元的优惠价格,当时马上买了。
从11月8号到现在差不多1个半月的时间,我把这本书看了三遍。Jonathan Lewis擅长用简单明了的语言,描述Oracle复杂的内部机制,这种化繁为简的功力或许来自长期实战经验和研究的积累。精心设计的测试用例很大程度降低这本书的门槛,如果你想对oracle知其所以然,这是一本不应该错过的书。
以下是Tanel Poder对这本书评论中的一句,另外,Charles Hooper也有一篇详细的评论,全书错误列表可以在这里更新。
It will likely be the best Oracle internals book out there for the coming 10 years, just like Steve Adams’es Oracle Internal Services book was in the last decade :)
Oracle Core很可能是未来十年关于Oracle内部原理最好的书,就像过去十年我们对Steve Adams的Oracle Internal Services一直津津乐道一样 :)
作者在第一章从一个简化的原理图出发,做了一个轻松的开始,后面7个章节的内容密度却让人惊叹,对我自己而言,读到第三遍之后,才把前后各个知识点联系起来。除了知识本身,Jonathan所展示的他研究Oracle的思路和方法或许更有借鉴意义。
第二章通过对data block, undo block和redo的转储,简单的说明Oracle最核心的机制redo和undo。那么Oracle如何利用redo和undo实现事物四个特性中的ACID中的A-Atomicity, C-Consistency, I-Isolation的呢?Oracle通过什么样的数据结构把transaction、undo和数据块上的ITL组织起来?你很可能从Tom Ktye的书里知道Oracle具备了multi versions, consistent read, current read的能力,那它们是如何实现的?Oracle如何fast commit, 为什么有commit cleanout和delayed block cleanout, 什么是transaction TABLES, transaction table也能回滚? 为什么会出现ORA-01555这种错误呢?第三章解释了这些问题。
第四章, Oracle在多用户的情况下利用latch和Lock,保护数据不被破坏。不同的锁机制运用在什么不同的场景,背后的实现逻辑分别是怎样的?比如Latch的原子操作,enqueue的三个队列(owners,converters,waiters),不同模式之间的兼容性。
第五章,从Oracle以Granule为单位管理内存,Buffer pool和Granule, Buffer pool和Working Data Set, Working data set和Granue之间是什么关系, Oracle如何用LRU+TCH的算法来有效管理缓存,LRU链表和hash链表、cache buffers chains和cache buffers lru chain这两种latch如何互动。Oracle里如何利用典型的哈希表和双向链表的结合,快速的查找已经缓存的数据。
第六章阐述Oracle 优先写log的方式来实现事物四个特性ACID中的D-Durability,保证事物持久性,通过各种checkpiont机制(incremetal checkpoint, media recovery checkpoint),尽量缩短instance recovery和media recovery所需要的时间,同时最大限度的减小对性能的影响。Log writter和database如何工作,他们之间如何沟通。
第七章关于在Oracle里,SQL被解析,优化和执行。软解析和硬解析的过程是怎样的?为什么有些情况下可以不出现解析?为什么在OLTP中使用绑定变量可以很大程度减少latch的争用? Ditionary Cache和library cache的组织结构,shared pool和buffer pool内存管理方式有什么异同?如何应对ORA-04031错误?
第八章,RAC所标榜的高可用,扩展性如何实现的。RAC如何通过GRD(Global Resource Directory)在实例之间协调各种资源的使用,GCS和GES如何协调工作,Case Fusion的原理是怎样的,RAC的水平扩展如何实现。
最后的附录作者分享了如何通过各种转储和调试工具和方法,研究Oracle的内部原理。授人以鱼不如授人以渔。