《基于Oracle的SQL优化》是本土Oracle数据库性能优化大师泣血力作
集十数年实战修行与潜心钻研之大成;
盖国强等国内数据库一线名家联合推荐;
囊括数据库性能优化技术所有分支与脉络,讲解通俗,实例经典。
从上述显示内容可以看出,此SQL的执行计划已经从之前的索引唯一性扫描变为现在的索引范围扫描,其耗费的逻辑读也从之前的73递增到现在的74,这说明在同等条件下,当目标索引的索引行的数量大于1时,索引范围扫描所耗费的逻辑读确实至少会比相应的索引唯一性扫描多1。
注意,上述测试结果中逻辑读为73和74;这是包含了硬解析时递归调用所耗费的逻辑读,上述SQL在软解析/软软解析的情况下不会有这么多的逻辑读。这里容易引起误解,因为这多出来的逻辑读可能来源于递归调用时所耗费的逻辑读(但实际上这里两次递归调用所耗费的逻辑读显然是相同的)。
这里更好的比较方式是不刷新数据字典缓存和Buffer Cache,然后多执行几次上述SQL并取最后几次稳定的执行结果。实际上,这种更好的比较方式所得到的测试结果和上述测试结果是一致的。
关于硬解析和软解析/软软解析,我们会在“第3章Oracle里的Cursor和绑定变量”中详细解释,这里不再赘述。
12.323索引全扫描
索引全扫描(INDEX FULL SCAN)适用于所有类型的8树索引(包括唯一性索引和非唯一性索引)。所谓的“索引全扫描”,就是指要扫描目标索引所有叶子块的所有索引行。这里需要注意的是,索引全扫描需要扫描目标索引的所有叶子块,但这并不意味着需要扫描该索引的所有分支块。在默认情况下,Oracle在做索引全扫描时只需要通过访问必要的分支块定位到位于该索引最左边的叶子块的第一行索引行,就可以利用该索引叶子块之间的双向指针链表,从左至右依次顺序扫描该索引所有叶子块的所有索引行了。
既然在默认情况下,索引全扫描要从左至右依次顺序扫描目标索引所有叶子块的所有索引行,而索引是有序的,所以索引全扫描的执行结果也是有序的,并且是按照该索引的索引键值列来排序,这也意味着走索引全扫描能够既达到排序的效果,又同时避免了对该索引的索引键值列的真正排序操作。
……
为什么写这本书
写这本书纯属偶然。
2010年12月11日,我在中国软件技术大会上做了一个关于Oracle数据库备份与恢复机制揭密的主题演讲。可能是因为这个演讲的缘故,电子工业出版社的编辑毕宁随后多次邀请我写一本关于Oracle数据库备份恢复方面的书,但均被我以各种理由搪塞、推脱。这一拖就拖了大半年(为什么会推脱?一来是因为我认为备份恢复这个点相对来说较窄,不具备普适性;二来市面上已经有不少关于备份恢复方面的书,这意味着如果我想写出有新意、有不一样的内容的话,会有相当的难度)。
这种推脱一直持续到2011年10月,那个时候我正好在公司内部主讲一个基于Oracle数据库的SQL优化的系列课程。我开设这门课程的初衷是因为当时恰逢公司开始研发新一代系统,而我深知对于使用Oracle数据库的应用系统而言,SQL语句的质量会直接影响系统的性能,甚至可以说大部分基于Oracle数据库的应用系统的性能问题都是由于开发人员不懂Oracle数据库,不懂如何在Oracle数据库里写出高质量的SQL所致。这样的系统性能问题,单靠高水准的OracleDBA来调整是非常痛苦的,很多时候是事倍功半。如果能把我在SQL优化方面的经验分享给大家,告诉大家如何避免在Oracle数据库中写出很烂的SQL,如何在Oracle数据库中做SQL优化,那么就可以从源头上提升新一代系统在数据库端的性能,这也算是我为公司新一代系统的研发所做的一份贡献。
这门课程一经推出,就取得了很好的反响,同事们纷纷反馈说这门课程很实用,课程里的不少方法和知识点在实际的工作中都能用上,这使我意识到自己是在做一件非常有意义的事情,虽然辛苦,但是确实能帮助到同事。
这门课程大约是30个学时,我才开始讲没多久,毕宁就再次打电话给我,他还是希望我能写一本关于Oracle数据库备份恢复方面的书。我清楚地记得那天下午接到毕宁电话的时候,脑海里突然闪现了一个念头——为什么不把现在讲的这门SQL优化的课程写成一本书呢?这样一来可以对毕宁有个交待,二来也可以帮到更多的人,而不仅仅是我的同事。因为只要是用Oracle数据库的,只要是构建在Oracle数据库上的应用系统就必然会涉及SQL优化,也就是说SQL优化不同于备份恢复,它是具备普适性的。另外,市面上系统阐述Oracle数据库中SQL优化的书非常少,这意味着我有很大的发挥空间。如果能写一本系统的、从本质上阐述如何在Oracle数据库里做SQL优化的书,能够通过这本书教会开发人员如何在Oracle数据库里写出高质量的SQL,以及如何对有性能问题的SQL做诊断与调整,那么也许就可以从源头上保证,由这些开发人员所开发出来的基于Oracle数据库的应用系统在SQL上是没有性能问题的,而那些由于SQL撰写不当而导致的各种性能问题也就不复存在了。如果真能做到这一点,那真是一件功德无量的事情。
在和毕宁沟通过几次后,我的上述想法获得了他的支持,于是从2011年10月份开始,我就正式开始撰写这本书。只是我万万没有想到,这一写就写了17个月。
这本书的撰写过程是极为艰苦的。一来是因为我对自己要求很高,希望写出来的书通俗易懂(普通的使用Oracle数据库的开发人员就能看懂),但同时又要具备一定的深度;二来是因为我倡导“从本质和原理入手,以不变应万变”的SQL优化思路,必然涉及深入介绍Oracle数据库里的优化器,但Oracle数据库里的优化器实在是太复杂了。
现在回想起来,我为这本书付出了太多太多。在这一年多的撰写过程中,由于长期熬夜,我能明显感觉到身体越来越差,到了撰写后期更是频繁往医院跑,但无论如何,我还是坚持下来了。
本书的主要内容
本书共8章。
第1章“Oracle里的优化器”,详细介绍了Oracle数据库中与优化器相关的各个方面的内容,包括优化器的模式、结果集(RowSource)、集的势(Cardinality)、可选择率(Selectivity)、可传递性(Transitivity)、各种数据访问的方法,以及与表连接相关的内容。
第2章“Oracle里的执行计划”,详细介绍了Oracle数据里与执行计划有关的各个方面的内容,包括执行计划的含义,如何查看执行计划,如何得到目标SQL真实的执行计划,如何查看执行计划的执行顺序,Oracle数据库里各种常见的执行计划的含义,以及如何在Oracle数据库中稳定执行计划。
第3章“Oracle里的Cursor和绑定变量”,详细介绍了Oracle数据库中与Cursor和绑定变量相关的各个方面的内容,包括SharedCursor、SessionCursor、绑定变量、游标共享、硬解析、软解析、软软解析,以及与它们息息相关的Oracle数据库里的四种应用类型。
第4章“Oracle里的查询转换”,详细介绍了Oracle数据库中与查询转换有关的各个方面的内容,包括子查询展开、视图合并、星型转换、连接谓词推入、连接因式分解、表扩展、表移除,以及Oracle如何处理SQL语句中的IN。
第5章“Oracle里的统计信息”,详细介绍了Oracle数据库里与统计信息相关的各个方面的内容,包括Oracle数据库中各种统计信息的分类、含义、收集和查看方法,以及如何在Oracle数据库里正确地收集统计信息。
第6章“Oracle里的Hint”,详细介绍了Oracle数据库中与Hint有关的各个方面的内容,包括什么是Hint,如何用Hint,Hint什么情况下会失效,以及Oracle数据库中常见的各种Hint。
第7章“Oracle里的并行”,详细介绍了Oracle数据库里并行的基本概念以及在Oracle数据库里如何控制并行,包括在Oracle数据库里开启并行、控制并行度等。
第8章“Oracle里SQL优化的方法论”,介绍了在Oracle数据库里如何做SQL优化,提出了我们总结出来的Oracle数据库里SQL优化的方法论,并结合实例验证了上述方法论。
本书的读者对象
本书适用于使用Oracle数据库的开发人员、OracleDBA和其他对Oracle数据库感兴趣的人员。
本书也可以作为各大中专院校相关专业的教学辅导和参考用书,或作为相关培训机构的培训教材。
本书代码下载
本书使用的所有脚本和范例代码均可以通过我网站上的Books专栏下载。
本书约定
本书介绍的SQL优化方法论是通用的方法,并不局限于Oracle数据库的某个具体的版本,但本书的实例和测试结果绝大部分是基于Oracle11gR2的(除个别特别注明的实例之外)。而Oracle数据库不同的版本之间在某些方面可能会差别很大,所以即便是同样的实例,在Oracle数据库不同的版本上的测试结果也有可能不同,在此特别说明,一切以实际情况为准。
由于我的水准和经验所限,书中的错误之处在所难免,在此诚挚期待大家阅读后的指正。可以通过电子邮件与我取得联系,欢迎与我交流任何关于本书的问题。
这是一本能够切实提升工作效率的书籍。作为一名资深的DBA,我一直在寻找一本能够系统性地梳理Oracle SQL优化知识,并提供实用技巧的书籍。这本书正好满足了我的需求。它没有陈词滥调,而是用大量实际的案例和深入的分析来论证每一个优化点。我尤其喜欢书中关于“参数调优”和“内存管理”部分的讲解,这些都是日常工作中非常关键但往往容易被忽视的环节。书中提供的调优模板和检查清单,可以帮助我们快速地识别潜在问题并采取相应的措施。此外,书中对数据库升级和版本特性对SQL性能影响的讨论,也为我们提供了重要的参考信息。读完这本书,我感觉自己对Oracle SQL的掌握又上了一个台阶,能够更自信地应对各种性能挑战,也能够更有效地为业务保驾护航。
评分对于有一定SQL基础但希望在Oracle性能调优方面有所突破的开发者来说,这本书绝对是不可多得的宝藏。我之前一直觉得SQL优化很大程度上依赖“经验”,但这本书让我意识到,背后有着严谨的理论和科学的方法论。书中关于执行计划的解读部分,可以说是点睛之笔。它详细讲解了各种节点(如全表扫描、索引查找、哈希连接、排序等)的含义及其对性能的影响,并提供了多种工具和技巧来辅助分析。我学会了如何有效地使用`EXPLAIN PLAN`、SQLPlus的`AUTOTRACE`功能,以及更高级的AWR报告和ASH报告来定位性能瓶颈。特别是书中关于统计信息的重要性和管理的部分,让我对如何保持数据库“健康”有了更深的认识。这本书的深度和广度都让我印象深刻,它不仅仅是关于SQL本身,更是对Oracle数据库整体性能的深入探索。
评分如果你正在经历SQL查询缓慢的折磨,或者想将自己的SQL性能提升到新的高度,那么这本书绝对是你不可或缺的工具。它以一种非常直观和易懂的方式,将Oracle SQL优化的复杂世界展现在我们面前。书中对于“死锁”和“阻塞”的分析,让我对数据库并发环境下的性能问题有了更清晰的认识。我学会了如何通过分析等待事件来定位瓶颈,以及如何采取有效的措施来缓解这些问题。书中还提供了关于“分区表”和“物化视图”等高级特性的优化技巧,这些都是在大型数据库环境中非常实用的技术。总的来说,这本书就像一个全能的SQL优化助手,它不仅提供了理论知识,更重要的是提供了实操性的指导,让我能够立刻将所学应用到实际工作中,并看到立竿见影的效果。
评分这是一本从初学者到进阶者都能找到共鸣的书。它就像一位经验丰富的老师,循序渐进地引导我理解Oracle SQL优化的核心理念。我尤其欣赏书中对于“慢查询”的剖析,不仅仅是给出简单的解决方案,而是深入讲解了导致性能瓶颈的各种可能性,比如索引缺失、低效的连接方式、不合理的WHERE子句等等。书中大量的案例分析,让我仿佛置身于实际的调优场景中,跟着作者一步步排查问题、分析执行计划、调整SQL语句。它没有堆砌晦涩难懂的理论,而是将复杂的概念用通俗易懂的语言和清晰的图示解释清楚。读完之后,我对Oracle的内部机制有了更深刻的理解,也掌握了一套系统性的SQL优化方法论。即使我是一名数据库初学者,也能从中受益匪浅。这本书的价值在于,它不仅教会了我“怎么做”,更重要的是教会了我“为什么这么做”,让我能够举一反三,独立解决更复杂的性能问题。
评分这本书的价值体现在它对Oracle SQL优化“艺术”的极致追求。它不仅仅停留在表面的SQL调优,而是深入到数据库内核的层面,讲解了Oracle是如何处理SQL语句的,以及各种优化器的工作原理。我曾经对某些SQL语句的执行计划感到困惑,这本书就像一位向导,为我揭示了背后的逻辑。书中对各种优化器模式(如规则模式和成本模式)的讲解,以及如何通过 Hints 来引导优化器做出更优选择,让我受益匪浅。此外,书中关于并发控制、锁机制以及它们如何影响SQL性能的论述,也极大地拓展了我的视野。我发现,很多时候SQL性能问题并非SQL语句本身的问题,而是由底层的数据库运行机制引起的。这本书提供了一个宏观的视角,让我能够从更深层次去理解和解决性能挑战,这种“治本”的方法论,对于长期的职业发展至关重要。
评分这次买的书都没有塑封包装,书的印刷还可以,内容也符合个人需求
评分很好,送货非常快,很快看起来了,便宜
评分破的城市 平淡日子 他要寻找生活的刺
评分现在没有时间看,挺好的一本书
评分活动期间下手,性价比很高,最近也遇到关于MySQL的问题,刚刚用上。只是对书籍包装不满意,连一层薄膜都没有。
评分9岁的时候,开始使用模板
评分很好,送货非常快,很快看起来了,便宜
评分DBA学习SQL优化必备书籍,手头备一本,经常翻的看看,有助于提升技术,挺好,快递也很给力!
评分书已经收到,还没时间看。家里一堆书放着有成就感。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 book.idnshop.cc All Rights Reserved. 静思书屋 版权所有