编辑推荐
《基于Oracle的SQL优化》是本土Oracle数据库性能优化大师泣血力作
集十数年实战修行与潜心钻研之大成;
盖国强等国内数据库一线名家联合推荐;
囊括数据库性能优化技术所有分支与脉络,讲解通俗,实例经典。
内容简介
《基于Oracle的SQL优化》是一本与众不同的书,它的目的是使读者真正掌握如何在Oracle数据库里写出高质量的SQL语句,以及如何在Oracle数据库里对有性能问题的SQL做诊断和调整。
《基于Oracle的SQL优化》从Oracle处理SQL的本质和原理入手,由浅入深、系统地介绍了Oracle数据库里的优化器、执行计划、Cursor和绑定变量、查询转换、统计信息、Hint和并行等这些与SQL优化息息相关的本质性内容,并辅以大量极具借鉴意义的一线SQL优化实例,阐述了作者倡导的“从本质和原理入手,以不变应万变”的优化思路,最后还介绍了作者在实际工作中总结出来的Oracle数据库里SQL优化的方法论。
《基于Oracle的SQL优化》适用于使用Oracle数据库的开发人员、OracleDBA和其他对Oracle数据库感兴趣的人员,也可以作为各院校相关专业的教学辅导和参考用书,或作为相关培训机构的培训教材。
作者简介
崔华,网名dbsnake,OracleACE,ACOUG成员。
资深Oracle数据库工程师,拥有Oracle数据库技术各个领域的经验,尤其是在Oracle数据库性能优化与备份恢复方面经验丰富。
他与其他人合作编写了多本Oracle技术书籍,他经常在Oracle相关活动中发表演讲并在自己的博客上撰写了大量技术文章。
精彩书评
★崔华的新作付梓,我有16字赠言相送:十载痴迷,三年砥砺,书成纸贵,其华熠熠。崔华在Oracle数据库技术研究和钻研方面完全体现了“痴迷”二字,坚持十数年而不辍,屡屡有所得而忘食;而他在技术上之大成在最近三年,砥而砺之,始有此书,厚达千页,书成而纸为之贵。我相信其中所展现的才华必将以其熠熠之辉耀人耳目。在与崔华相识之数年间,我从他的研究和文章中受教良多,相信读者朋友们也必定可以从本书中获益。
——盖国强云和恩墨创始人,OracleACE总监,ACOUG联合创始人 ★使用Oracle数据库无非是想获得较佳的应用性能,而几乎所有应用的性能都受到SQL语句的莫大影响,可以说SQL语句质量的高下决定了Oracle数据库的快慢。“从本质和原理入手,以不变应万变”,正是优化SQL的上上之策。崔华对技术的热情和钻研在我所识朋友中数一数二,耗时17个月始得此部大作,如果你想获得SQL执行时间瞬间从数小时缩至不到1秒的美妙体验,本书不容错过。
——张乐奕云和恩墨技术总监,OracleACE总监,ACOUG联合创始人 ★毫无疑问,这是关于Oracle数据库优化的一部扛鼎之作,崔华对本书倾注的精力和写作态度,都令我非常敬佩。作者非常详尽地介绍了优化器、统计信息、执行计划、查询转换等重要内容。深入研究这些内容,SQL优化的能力一定会有巨大提升。
——熊军云和思墨西区技术总监,OracleACE ★我佩服崔华对各种问题刨根究底式的研究,如他对Trace文件的阅读分析,可谓曲径探幽,引人入胜,完美地重现了系统动态运行时的内幕。本书对各种复杂原理条分缕析,对各种现实问题进行了透彻的讲解;而这些解说之所以如此清晰明了、让人信服,我想根本的原因,是在于作者所编写的大量示例及对这些示例的精彩演绎。这些示例及其背后的总结和升华,对于任何一位实践工程师来说,都是一处处不可多得的熠熠生辉的宝藏。
——黄凯耀甲骨文Real-WorldPerformanceGroup首席工程师 目录
第1章 Oracle 里的优化器
1.1 什么是Oracle 里的优化器
1.1.1 基于规则的优化器
1.1.2 基于成本的优化器
1.1.2.1 集的势
1.1.2.2 可选择率
1.1.2.3 可传递性
1.1.2.4 CBO 的局限性
1.2 优化器的基础知识
1.2.1 优化器的模式
1.2.2 结果集
1.2.3 访问数据的方法
1.2.3.1 访问表的方法
1.2.3.1.1 全表扫描
1.2.3.1.2 ROWID 扫描
1.2.3.2 访问索引的方法
1.2.3.2.1 索引唯一性扫描
1.2.3.2.2 索引范围扫描
1.2.3.2.3 索引全扫描
1.2.3.2.4 索引快速全扫描
1.2.3.2.5 索引跳跃式扫描
1.2.4 表连接
1.2.4.1 表连接的类型
1.2.4.1.1 内连接
1.2.4.1.2 外连接
1.2.4.2 表连接的方法
1.2.4.2.1 排序合并连接
1.2.4.2.2 嵌套循环连接
1.2.4.2.3 哈希连接
1.2.4.2.4 笛卡儿连接
1.2.4.3 反连接
1.2.4.4 半连接
1.2.4.5 星型连接
1.3 优化器模式对CBO 计算成本带来巨大影响的实例
1.4 总结
第2章 Oracle 里的执行计划
2.1 什么是执行计划
2.2 如何查看执行计划
2.2.1 explain plan 命令
2.2.2 DBMS_XPLAN 包
2.2.3 AUTOTRACE 开关
2.2.4 事件与tkprof 命令
2.3 如何得到真实的执行计划
2.4 如何查看执行计划的执行顺序
2.5 Oracle 里的常见执行计划
2.5.1 与表访问相关的执行计划
2.5.2 与B 树索引相关的执行计划
2.5.3 与位图索引相关的执行计划
2.5.4 与表连接相关的执行计划
2.5.5 其他典型的执行计划
2.5.5.1 AND-EQUAL(INDEX MERGE)
2.5.5.2 INDEX JOIN
2.5.5.3 VIEW
2.5.5.4 FILTER
2.5.5.5 SORT
2.5.5.6 UNION/UNION ALL
2.5.5.7 CONCAT
2.5.5.8 CONNECT BY
2.6 Oracle 里执行计划的稳定
2.6.1 使用SQL Profile 来稳定执行计划
2.6.1.1 Automatic 类型的SQL Profile
2.6.1.2 Manual 类型的SQL Profile
2.6.2 使用SPM 来稳定执行计划
2.7 总结
第3章 Oracle 里的Cursor 和绑定变量
3.1 Oracle 里的Cursor
3.1.1 Oracle 里的Shared Cursor
3.1.1.1 Shared Cursor 的含义
3.1.1.2 硬解析
3.1.1.3 软解析
3.1.2 Oracle 里的Session Cursor
3.1.2.1 Session Cursor 的含义
3.1.2.2 Session Cursor 的相关参数解析
3.1.2.2.1 OPEN_CURSORS
3.1.2.2.2 SESSION_CACHED_CURSORS
3.1.2.2.3 CURSOR_SPACE_FOR_TIME
3.1.2.3 Session Cursor 的种类和用法
3.1.2.3.1 隐式游标
3.1.2.3.2 显式游标
3.1.2.3.3 参考游标
3.2 Oracle 里的绑定变量
3.2.1 绑定变量的作用
3.2.2 绑定变量的典型用法
3.2.3 绑定变量的使用原则和最佳实践
3.2.3.1 PL/SQL 批量绑定模板一
3.2.3.2 PL/SQL 批量绑定模板二
3.2.4 绑定变量窥探
3.2.5 绑定变量分级
3.2.6 绑定变量的个数不宜太多
3.2.7 批量绑定时如何处理错误
3.2.8 如何得到已执行的目标SQL 中绑定变量的值
3.3 Oracle 里的游标共享
3.3.1 常规游标共享
3.3.2 自适应游标共享
3.4 Oracle 里的应用类型
3.4.1 Session Cursor 的生命周期
3.4.2 应用类型一(硬解析)
3.4.3 应用类型二(软解析)
3.4.4 应用类型三(软软解析)
3.4.5 应用类型四(一次解析、多次执行)
3.4.6 四种应用类型的实测性能对比
3.5 总结
第4章 Oracle 里的查询转换
4.1 Oracle 里查询转换的作用
4.2 子查询展开
4.3 视图合并
4.3.1 简单视图合并
4.3.2 外连接视图合并
4.3.3 复杂视图合并
4.4 星型转换
4.5 连接谓词推入
4.6 连接因式分解
4.7 表扩展
4.8 表移除
4.9 Oracle 如何处理SQL 语句中的IN
4.9.1 IN-List Iterator
4.9.2 IN-List Expansion / OR Expansion
4.9.3 IN-List Filter
4.9.4 对IN 做子查询展开/视图合并
4.10 查询转换的综合应用实例(逻辑读从200 万降到6)
4.11 总结
第5章 Oracle 里的统计信息
5.1 什么是Oracle 里的统计信息
5.2 Oracle 里收集与查看统计信息的方法
5.2.1 收集统计信息
5.2.1.1 用ANALYZE 命令收集统计信息
5.2.1.2 用DBMS_STATS 包收集统计信息
5.2.1.3 ANALYZE 和DBMS_STATS 的区别
5.2.2 查看统计信息
5.3 表的统计信息
5.3.1 表统计信息的种类和含义
5.3.2 表统计信息不准导致SQL 性能问题的实例
5.4 索引的统计信息
5.4.1 索引统计信息的种类和含义
5.4.2 聚簇因子的含义及重要性
5.5 列的统计信息
5.5.1 列统计信息的种类和含义
5.5.2 列统计信息不准导致谓词越界的实例
5.5.3 直方图
5.5.3.1 直方图的含义
5.5.3.2 直方图的类型
5.5.3.2.1 Frequency 类型的直方图
5.5.3.2.2 Height Balanced 类型的直方图
5.5.3.3 直方图的收集方法
5.5.3.4 直方图对CBO 的影响
5.5.3.4.1 直方图对Shared Cursor 的影响
5.5.3.4.2 直方图对可选择率的影响
5.5.3.5 使用直方图的注意事项
5.6 全局统计信息
5.7 动态采样
5.8 多列统计信息
5.9 系统统计信息
5.10 数据字典统计信息
5.11 内部对象统计信息
5.12 Oracle 里的自动统计信息收集
5.13 Oracle 里应如何收集统计信息
5.14 总结
第6章 Oracle 里的Hint
6.1 什么是Hint
6.2 Hint 的用法
6.3 Hint 被Oracle 忽略的常见情形
6.3.1 情形一:使用的Hint 有语法或者拼写错误
6.3.2 情形二:使用的Hint 无效
6.3.3 情形三:使用的Hint 自相矛盾
6.3.4 情形四:使用的Hint 受到了查询转换的干扰
6.3.5 情形五:使用的Hint 受到了保留关键字的干扰
6.4 常见的Hint
6.4.1 与优化器模式相关的Hint
6.4.1.1 ALL_ROWS
6.4.1.2 FIRST_ROWS(n)
6.4.1.3 RULE
6.4.2 与表访问相关的Hint
6.4.2.1 FULL
6.4.2.2 ROWID
6.4.3 与索引访问相关的Hint
6.4.3.1 INDEX
6.4.3.2 NO_INDEX
6.4.3.3 INDEX_DESC
6.4.3.4 INDEX_COMBINE
6.4.3.5 INDEX_FFS
6.4.3.6 INDEX_JOIN
6.4.3.7 AND_EQUAL
6.4.4 与表连接顺序相关的Hint
6.4.4.1 ORDERED
6.4.4.2 LEADING
6.4.5 与表连接方法相关的Hint
6.4.5.1 USE_MERGE
6.4.5.2 NO_USE_MERGE
6.4.5.3 USE_NL
6.4.5.4 NO_USE_NL
6.4.5.5 USE_HASH
6.4.5.6 NO_USE_HASH
6.4.5.7 MERGE_AJ
6.4.5.8 NL_AJ
6.4.5.9 HASH_AJ
6.4.5.10 MERGE_SJ
6.4.5.11 NL_SJ
6.4.5.12 HASH_SJ
6.4.6 与查询转换相关的Hint
6.4.6.1 USE_CONCAT
6.4.6.2 NO_EXPAND
6.4.6.3 MERGE
6.4.6.4 NO_MERGE
6.4.6.5 UNNEST
6.4.6.6 NO_UNNEST
6.4.6.7 EXPAND_TABLE
6.4.6.8 NO_EXPAND_TABLE
6.4.7 与并行相关的Hint
6.4.7.1 PARALLEL
6.4.7.2 NO_PARALLEL
6.4.7.3 PARALLEL_INDEX
6.4.7.4 NO_PARALLEL_INDEX
6.4.8 其他常见Hint
6.4.8.1 DRIVING_SITE
6.4.8.2 APPEND
6.4.8.3 APPEND_VALUES
6.4.8.4 PUSH_PRED
6.4.8.5 NO_PUSH_PRED
6.4.8.6 PUSH_SUBQ
6.4.8.7 NO_PUSH_SUBQ
6.4.8.8 OPT_PARAM
6.4.8.9 OPTIMIZER_FEATURES_ENABLE
6.4.8.10 QB_NAME
6.4.8.11 CARDINALITY
6.4.8.12 SWAP_JOIN_INPUTS
6.5 用Cardinality Hint 解决ORA-01555 错误的实例
6.6 总结
第7章 Oracle 里的并行
7.1 Oracle 里并行的基本概念
7.1.1 为什么要用并行
7.1.2 并行的理论基础
7.1.3 Oracle 里能够并行执行的操作
7.1.4 Oracle 里与并行有关的术语及解释
7.1.4.1 Query Coordinator
7.1.4.2 Query Slaves 和Query Slave Set
7.1.4.3 Table Queues
7.1.4.4 数据传递方法
7.1.4.5 granules
7.1.4.6 直接读取
7.1.5 深入解析并行执行计划的实例
7.2 Oracle 里并行的控制
7.2.1 Oracle 里如何开启并行
7.2.2 Oracle 里并行度的控制
7.2.3 Oracle RAC 环境下的并行
7.2.4 Oracle 里与并行相关的参数
7.2.4.1 PARALLEL_MAX_SERVERS
7.2.4.2 PARALLEL_MIN_SERVERS
7.2.4.3 自动并行相关的参数
7.2.4.3.1 PARALLEL_DEGREE_POLICY
7.2.4.3.2 PARALLEL_MIN_TIME_THRESHOLD
7.2.4.3.3 PARALLEL_DEGREE_LIMIT
7.2.4.3.4 PARALLEL_SERVERS_TARGET
7.2.4.4 自适应并行相关的参数
7.2.4.4.1 PARALLEL_ADAPTIVE_MULTI_USER
7.2.4.4.2 PARALLEL_MIN_PERCENT
7.2.4.4.3 PARALLEL_AUTOMATIC_TUNING
7.2.4.5 其他参数
7.2.4.5.1 PARALLEL_THREADS_PER_CPU
7.2.4.5.2 PARALLEL_EXECUTION_MESSAGE_SIZE
7.2.4.5.3 PARALLEL_FORCE_LOCAL
7.2.5 绕开Oracle 并行执行Bug 大幅提升性能的实例
7.3 总结
第8章 Oracle 里SQL 优化的方法论
8.1 Oracle 里如何做SQL 优化
8.1.1 Oracle 里SQL 优化的本质是基于对CBO 和执行计划的深刻理解
8.1.2 Oracle 里SQL 优化需要联系实际的业务
8.1.3 Oracle 里SQL 优化需要适时使用绑定变量
8.2 Oracle 里SQL 优化的方法论在实战中的验证
8.3 总结
精彩书摘
从上述显示内容可以看出,此SQL的执行计划已经从之前的索引唯一性扫描变为现在的索引范围扫描,其耗费的逻辑读也从之前的73递增到现在的74,这说明在同等条件下,当目标索引的索引行的数量大于1时,索引范围扫描所耗费的逻辑读确实至少会比相应的索引唯一性扫描多1。
注意,上述测试结果中逻辑读为73和74;这是包含了硬解析时递归调用所耗费的逻辑读,上述SQL在软解析/软软解析的情况下不会有这么多的逻辑读。这里容易引起误解,因为这多出来的逻辑读可能来源于递归调用时所耗费的逻辑读(但实际上这里两次递归调用所耗费的逻辑读显然是相同的)。
这里更好的比较方式是不刷新数据字典缓存和Buffer Cache,然后多执行几次上述SQL并取最后几次稳定的执行结果。实际上,这种更好的比较方式所得到的测试结果和上述测试结果是一致的。
关于硬解析和软解析/软软解析,我们会在“第3章Oracle里的Cursor和绑定变量”中详细解释,这里不再赘述。
12.323索引全扫描
索引全扫描(INDEX FULL SCAN)适用于所有类型的8树索引(包括唯一性索引和非唯一性索引)。所谓的“索引全扫描”,就是指要扫描目标索引所有叶子块的所有索引行。这里需要注意的是,索引全扫描需要扫描目标索引的所有叶子块,但这并不意味着需要扫描该索引的所有分支块。在默认情况下,Oracle在做索引全扫描时只需要通过访问必要的分支块定位到位于该索引最左边的叶子块的第一行索引行,就可以利用该索引叶子块之间的双向指针链表,从左至右依次顺序扫描该索引所有叶子块的所有索引行了。
既然在默认情况下,索引全扫描要从左至右依次顺序扫描目标索引所有叶子块的所有索引行,而索引是有序的,所以索引全扫描的执行结果也是有序的,
基于Oracle的SQL优化 电子书 下载 mobi epub pdf txt
评分
☆☆☆☆☆
京东自营送货速度快,作者写的不错,支持一下
评分
☆☆☆☆☆
评分
☆☆☆☆☆
已经开始看了,还不懂好不好,很多人推荐应该不错,活动价很给力,已经开始看了,还不懂好不好,很多人推荐应该不错,活动价很给力,已经开始看了,还不懂好不好,很多人推荐应该不错,活动价很给力,已经开始看了,还不懂好不好,很多人推荐应该不错,活动价很给力,已经开始看了,还不懂好不好,很多人推荐应该不错,活动价很给力,已经开始看了,还不懂好不好,很多人推荐应该不错,活动价很给力,
评分
☆☆☆☆☆
买了好多书,看了几本,还有好多还没来得及看,收获很多,坚持都给看完!电子书看着没纸质书的感觉
评分
☆☆☆☆☆
《高性能MySQL(第3版)》是MySQL 领域的经典之作,拥有广泛的影响力。第3 版更新了大量的内容,不但涵盖了MySQL5.5版本的新特性
评分
☆☆☆☆☆
无庸置疑的经典,老而实用,大师之作,拿来当工具书查阅
评分
☆☆☆☆☆
评分
☆☆☆☆☆
收到宝贝,我在商城打滚这么多年,所谓阅人无数,收到宝贝我只想说,京东,你实在是太好了。 你的高尚情操太让人感动了。 如滔滔江水连绵不绝,海枯石烂,天崩地裂,永不变心。 收到货后,我的心情竟是久久不能平静。自古英雄出少年,卖家年纪轻轻,就有经天纬地之才,而今,沧海桑田5000年,神州平地一声雷,飞沙走石,大雾迷天,朦胧中,花见花开,人见人爱,这人英雄手持双斧,二目如电,一斧下去,混沌初开,二斧下去,女娲造人,三斧下去,小生倾倒。实乃国之幸也,民之福,人之初也,怎不叫人喜极而泣 看着宝贝,我竟产生出一种啊,这么好的宝贝,如果将来我再也买不到了,那我该怎么办?直到我毫不犹豫地把这个宝贝收藏了,我内心的那种激动才逐渐平静下来。 可是我立刻想到,这么好的宝贝,倘若别人看不到,那么不是浪费京东的心血吗?经过痛苦的思想斗争,我终于下定决心,牺牲小我,奉献大我。我要以此好评奉献给世人赏阅,我要给好评、给好评、给好评、给好评、给好评、给好评
评分
☆☆☆☆☆
书籍很好,每年618都必须屯一波图书,很划算