简介
《基于Oracle的SQL优化》是一本与众不同的书,它的目的是使读者真正掌握如何在 Oracle数据库里写出高质量的 SQL语句,以及如何在 Oracle数据库里对有性能问题的 SQL做诊断和调整。
《基于Oracle的SQL优化》从 Oracle处理 SQL的本质和原理入手,由浅入深、系统地介绍了 Oracle数据库里的优化器、执行计划、Cursor和绑定变量、查询转换、统计信息、Hint和并行等这些与 SQL优化息息相关的本质性内容,并辅以大量极具借鉴意义的一线 SQL优化实例,阐述了作者倡导的“从本质和原理入手,以不变应万变”的优化思路,最后还介绍了作者在实际工作中总结出来的 Oracle数据库里 SQL优化的方法论。
《基于Oracle的SQL优化》适用于使用 Oracle数据库的开发人员、Oracle DBA和其他对 Oracle数据库感兴趣的人员,也可以作为各院校相关专业的教学辅导和参考用书,或作为相关培训机构的培训教材。
海报:
目录
第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.4CBO的局限性
1.2优化器的基础知识
1.2.1优化器的模式
1.2.2结果集
1.2.3访问数据的方法
1.2.3.1访问表的方法
1.2.3.1.1全表扫描
1.2.3.1.2ROWID扫描
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.1explainplan命令
2.2.2DBMS_XPLAN包
2.2.3AUTOTRACE开关
2.2.410046事件与tkprof命令
2.3如何得到真实的执行计划
2.4如何查看执行计划的执行顺序
2.5Oracle里的常见执行计划
2.5.1与表访问相关的执行计划
2.5.2与B树索引相关的执行计划
2.5.3与位图索引相关的执行计划
2.5.4与表连接相关的执行计划
2.5.5其他典型的执行计划
2.5.5.1AND—EQUAL(INDEXMERGE)
INDEXJOIN
2.5.5.2VIEW
2.5.5.3FILTER
2.5.5.4SORT
2.5.5.5
2.5.5.6UNION/UNIONALL
CONCAT
2.5.5.7
CONNECTBY
2.5.5.8
2.6Oracle里执行计划的稳定
2.6.1使用SQLProfile来稳定执行计划
2.6.1.1Automatic类型的SQLProfile
2.6.1.2Manual类型的SQLProfile
2.6.2使用SPM来稳定执行计划
2.7总结
第3章Oracle里的Cursor和绑定变量
3.1Oracle里的Cursor
3.1.1Oracle里的SharedCursor
3.1.1.1SharedCursor的含义
3.1.1.2硬解析
3.1.1.3软解析
3.1.2Oracle里的SessionCursor
3.1.2.1SessionCursor的含义
3.1.2.2SessionCursor的相关参数解析
OPEN_CURSORS
3.1.2.2.1SESSION_CACHED_CURSORS
3.1.2.2.2CURSOR_SPACE_FOR_TIME
3.1.2.2.3
3.1.2.3SessionCursor的种类和用法
3.1.2.3.1隐式游标
3.1.2.3.2显式游标
3.1.2.3.3参考游标
3.2Oracle里的绑定变量
3.2.1绑定变量的作用
3.2.2绑定变量的典型用法
3.2.3绑定变量的使用原则和最佳实践
3.2.3.1PL/SQL批量绑定模板一
3.2.3.2PL/SQL批量绑定模板二
3.2.4绑定变量窥探
3.2.5绑定变量分级
3.2.6绑定变量的个数不宜太多
3.2.7批量绑定时如何处理错误
3.2.8如何得到已执行的目标SQL中绑定变量的值
3.3Oracle里的游标共享
3.3.1常规游标共享
3.3.2自适应游标共享
3.4Oracle里的应用类型
3.4.1SessionCursor的生命周期
3.4.2应用类型一(硬解析)
3.4.3应用类型二(软解析)
3.4.4应用类型三(软软解析)
3.4.5应用类型四(一次解析、多次执行)
3.4.6四种应用类型的实测性能对比
3.5总结
第4章Oracle里的查询转换
4.1Oracle里查询转换的作用
4.2子查询展开
4.3视图合并
4.3.1简单视图合并
4.3.2外连接视图合并
4.3.3复杂视图合并
4.4星型转换
4.5连接谓词推入
4.6连接因式分解
4.7表扩展
4.8表移除
4.9Oracle如何处理SQL语句中的IN
IN—ListIterator
4.9.1
4.9.2IN—ListExpansion/ORExpansion
IN—ListFilter
4.9.3
4.9.4对IN做子查询展开/视图合并
4.10查询转换的综合应用实例(逻辑读从200万降到6)
4.11总结
第5章Oracle里的统计信息
5.1什么是Oracle里的统计信息
5.2Oracle里收集与查看统计信息的方法
5.2.1收集统计信息
5.2.1.1用ANALYZE命令收集统计信息
5.2.1.2用DBMS_STATS包收集统计信息
5.2.1.3ANALYZE和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.1Frequency类型的直方图
5.5.3.2.2HeightBalanced类型的直方图
5.5.3.3直方图的收集方法
5.5.3.4直方图对CBO的影响
5.5.3.4.1直方图对SharedCursor的影响
5.5.3.4.2直方图对可选择率的影响
5.5.3.5使用直方图的注意事项
5.6全局统计信息
5.7动态采样
5.8多列统计信息
5.9系统统计信息
5.10数据字典统计信息
5.11内部对象统计信息
5.12Oracle里的自动统计信息收集
5.13Oracle里应如何收集统计信息
5.14总结
第6章Oracle里的Hint
6.1什么是Hint
6.2Hint的用法
6.3Hint被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.1ALL_ROWS
6.4.1.2FIRST_ROWS(n)
RULE
6.4.1.3
6.4.2与表访问相关的Hint
FULL
6.4.2.1ROWID
6.4.2.2
6.4.3与索引访问相关的Hint
INDEX
6.4.3.1NO_INDEX
6.4.3.2INDEX_DESC
6.4.3.3INDEX_COMBINE
6.4.3.4INDEX_FFS
6.4.3.5
6.4.3.6INDEX_JOIN
6.4.3.7AND_EQUAL
6.4.4与表连接顺序相关的Hint
ORDERED
6.4.4.1LEADING
6.4.4.2
6.4.5与表连接方法相关的Hint
6.4.5.1USE_MERGE
NO_USE_MERGE
6.4.5.2USE_NL
6.4.5.3NO_USE_NL
6.4.5.4USE_HASH
6.4.5.5NO_USE_HASH
6.4.5.6
6.4.5.7MERGE_AJ
NL_AJ
6.4.5.8HASH_AJ
6.4.5.9MERGE_SJ
6.4.5.10NL_SJ
6.4.5.11HASH_SJ
6.4.5.12
6.4.6与查询转换相关的Hint
USE_CONCAT
6.4.6.1NO_EXPAND
6.4.6.2MERGE
6.4.6.3NO_MERGE
6.4.6.4UNNEST
6.4.6.5
6.4.6.6NO_UNNEST
EXPAND_TABLE
6.4.6.7NO_EXPAND_TABLE
6.4.6.8
6.4.7与并行相关的Hint
PARALLEL
6.4.7.1NO_PARALLEL
6.4.7.2
6.4.7.3PARALLEL_INDEX
NO_PARALLEL_INDEX
6.4.7.4
6.4.8其他常见Hint
DRIVING_SITE
6.4.8.1APPEND
6.4.8.2APPEND_VALUES
6.4.8.3
6.4.8.4PUSH_PRED
NO_PUSH_PRED
6.4.8.5
6.4.8.6PUSH_SUBQ
6.4.8.7NO_PUSH_SUBQ
OPT_PARAM
6.4.8.8OPTIMIZER_FEATURES_ENABLE
6.4.8.9
6.4.8.10QB_NAME
CARDINALITY
6.4.8.11SWAP_JOIN_INPUTS
6.4.8.12
6.5用CardinalityHint解决ORA—01555错误的实例
6.6总结
第7章Oracle里的并行
7.1Oracle里并行的基本概念
7.1.1为什么要用并行
7.1.2并行的理论基础
7.1.3Oracle里能够并行执行的操作
7.1.4Oracle里与并行有关的术语及解释
7.1.4.1QueryCoordinator
7.1.4.2QuerySlaves和QuerySlaveSet
7.1.4.3TableQueues
7.1.4.4数据传递方法
7.1.4.5granules
7.1.4.6直接读取
7.1.5深入解析并行执行计划的实例
7.2Oracle里并行的控制
7.2.1Oracle里如何开启并行
7.2.2Oracle里并行度的控制
7.2.3OracleRAC环境下的并行
7.2.4Oracle里与并行相关的参数
PARALLEL_MAX_SERVERS
7.2.4.1PARALLEL_MIN_SERVERS
7.2.4.2
7.2.4.3自动并行相关的参数
PARALLEL_DEGREE_POLICY
7.2.4.3.1PARALLEL_MIN_TIME_THRESHOLD
7.2.4.3.2
7.2.4.3.3PARALLEL_DEGREE_LIMIT
PARALLEL_SERVERS_TARGET
7.2.4.3.4
7.2.4.4自适应并行相关的参数
PARALLEL_ADAPTIVE_MULTI_USER
7.2.4.4.1PARALLEL_MIN_PERCENT
7.2.4.4.2PARALLEL_AUTOMATIC_TUNING
7.2.4.4.3
7.2.4.5其他参数
PARALLEL_THREADS_PER_CPU
7.2.4.5.1PARALLEL_EXECUTION_MESSAGE_SIZE
7.2.4.5.2PARALLEL_FORCE_LOCAL
7.2.4.5.3
7.2.5绕开Oracle并行执行Bug大幅提升性能的实例
7.3总结
第8章Oracle里SQL优化的方法论
8.1Oracle里如何做SQL优化
8.1.1Oracle里SQL优化的本质是基于对CBO和执行计划的深刻理解
8.1.2Oracle里SQL优化需要联系实际的业务
8.1.3Oracle里SQL优化需要适时使用绑定变量
8.2Oracle里SQL优化的方法论在实战中的验证
8.3总结
1.1什么是Oracle里的优化器
1.1.1基于规则的优化器
1.1.2基于成本的优化器
1.1.2.1集的势
1.1.2.2可选择率
1.1.2.3可传递性
1.1.2.4CBO的局限性
1.2优化器的基础知识
1.2.1优化器的模式
1.2.2结果集
1.2.3访问数据的方法
1.2.3.1访问表的方法
1.2.3.1.1全表扫描
1.2.3.1.2ROWID扫描
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.1explainplan命令
2.2.2DBMS_XPLAN包
2.2.3AUTOTRACE开关
2.2.410046事件与tkprof命令
2.3如何得到真实的执行计划
2.4如何查看执行计划的执行顺序
2.5Oracle里的常见执行计划
2.5.1与表访问相关的执行计划
2.5.2与B树索引相关的执行计划
2.5.3与位图索引相关的执行计划
2.5.4与表连接相关的执行计划
2.5.5其他典型的执行计划
2.5.5.1AND—EQUAL(INDEXMERGE)
INDEXJOIN
2.5.5.2VIEW
2.5.5.3FILTER
2.5.5.4SORT
2.5.5.5
2.5.5.6UNION/UNIONALL
CONCAT
2.5.5.7
CONNECTBY
2.5.5.8
2.6Oracle里执行计划的稳定
2.6.1使用SQLProfile来稳定执行计划
2.6.1.1Automatic类型的SQLProfile
2.6.1.2Manual类型的SQLProfile
2.6.2使用SPM来稳定执行计划
2.7总结
第3章Oracle里的Cursor和绑定变量
3.1Oracle里的Cursor
3.1.1Oracle里的SharedCursor
3.1.1.1SharedCursor的含义
3.1.1.2硬解析
3.1.1.3软解析
3.1.2Oracle里的SessionCursor
3.1.2.1SessionCursor的含义
3.1.2.2SessionCursor的相关参数解析
OPEN_CURSORS
3.1.2.2.1SESSION_CACHED_CURSORS
3.1.2.2.2CURSOR_SPACE_FOR_TIME
3.1.2.2.3
3.1.2.3SessionCursor的种类和用法
3.1.2.3.1隐式游标
3.1.2.3.2显式游标
3.1.2.3.3参考游标
3.2Oracle里的绑定变量
3.2.1绑定变量的作用
3.2.2绑定变量的典型用法
3.2.3绑定变量的使用原则和最佳实践
3.2.3.1PL/SQL批量绑定模板一
3.2.3.2PL/SQL批量绑定模板二
3.2.4绑定变量窥探
3.2.5绑定变量分级
3.2.6绑定变量的个数不宜太多
3.2.7批量绑定时如何处理错误
3.2.8如何得到已执行的目标SQL中绑定变量的值
3.3Oracle里的游标共享
3.3.1常规游标共享
3.3.2自适应游标共享
3.4Oracle里的应用类型
3.4.1SessionCursor的生命周期
3.4.2应用类型一(硬解析)
3.4.3应用类型二(软解析)
3.4.4应用类型三(软软解析)
3.4.5应用类型四(一次解析、多次执行)
3.4.6四种应用类型的实测性能对比
3.5总结
第4章Oracle里的查询转换
4.1Oracle里查询转换的作用
4.2子查询展开
4.3视图合并
4.3.1简单视图合并
4.3.2外连接视图合并
4.3.3复杂视图合并
4.4星型转换
4.5连接谓词推入
4.6连接因式分解
4.7表扩展
4.8表移除
4.9Oracle如何处理SQL语句中的IN
IN—ListIterator
4.9.1
4.9.2IN—ListExpansion/ORExpansion
IN—ListFilter
4.9.3
4.9.4对IN做子查询展开/视图合并
4.10查询转换的综合应用实例(逻辑读从200万降到6)
4.11总结
第5章Oracle里的统计信息
5.1什么是Oracle里的统计信息
5.2Oracle里收集与查看统计信息的方法
5.2.1收集统计信息
5.2.1.1用ANALYZE命令收集统计信息
5.2.1.2用DBMS_STATS包收集统计信息
5.2.1.3ANALYZE和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.1Frequency类型的直方图
5.5.3.2.2HeightBalanced类型的直方图
5.5.3.3直方图的收集方法
5.5.3.4直方图对CBO的影响
5.5.3.4.1直方图对SharedCursor的影响
5.5.3.4.2直方图对可选择率的影响
5.5.3.5使用直方图的注意事项
5.6全局统计信息
5.7动态采样
5.8多列统计信息
5.9系统统计信息
5.10数据字典统计信息
5.11内部对象统计信息
5.12Oracle里的自动统计信息收集
5.13Oracle里应如何收集统计信息
5.14总结
第6章Oracle里的Hint
6.1什么是Hint
6.2Hint的用法
6.3Hint被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.1ALL_ROWS
6.4.1.2FIRST_ROWS(n)
RULE
6.4.1.3
6.4.2与表访问相关的Hint
FULL
6.4.2.1ROWID
6.4.2.2
6.4.3与索引访问相关的Hint
INDEX
6.4.3.1NO_INDEX
6.4.3.2INDEX_DESC
6.4.3.3INDEX_COMBINE
6.4.3.4INDEX_FFS
6.4.3.5
6.4.3.6INDEX_JOIN
6.4.3.7AND_EQUAL
6.4.4与表连接顺序相关的Hint
ORDERED
6.4.4.1LEADING
6.4.4.2
6.4.5与表连接方法相关的Hint
6.4.5.1USE_MERGE
NO_USE_MERGE
6.4.5.2USE_NL
6.4.5.3NO_USE_NL
6.4.5.4USE_HASH
6.4.5.5NO_USE_HASH
6.4.5.6
6.4.5.7MERGE_AJ
NL_AJ
6.4.5.8HASH_AJ
6.4.5.9MERGE_SJ
6.4.5.10NL_SJ
6.4.5.11HASH_SJ
6.4.5.12
6.4.6与查询转换相关的Hint
USE_CONCAT
6.4.6.1NO_EXPAND
6.4.6.2MERGE
6.4.6.3NO_MERGE
6.4.6.4UNNEST
6.4.6.5
6.4.6.6NO_UNNEST
EXPAND_TABLE
6.4.6.7NO_EXPAND_TABLE
6.4.6.8
6.4.7与并行相关的Hint
PARALLEL
6.4.7.1NO_PARALLEL
6.4.7.2
6.4.7.3PARALLEL_INDEX
NO_PARALLEL_INDEX
6.4.7.4
6.4.8其他常见Hint
DRIVING_SITE
6.4.8.1APPEND
6.4.8.2APPEND_VALUES
6.4.8.3
6.4.8.4PUSH_PRED
NO_PUSH_PRED
6.4.8.5
6.4.8.6PUSH_SUBQ
6.4.8.7NO_PUSH_SUBQ
OPT_PARAM
6.4.8.8OPTIMIZER_FEATURES_ENABLE
6.4.8.9
6.4.8.10QB_NAME
CARDINALITY
6.4.8.11SWAP_JOIN_INPUTS
6.4.8.12
6.5用CardinalityHint解决ORA—01555错误的实例
6.6总结
第7章Oracle里的并行
7.1Oracle里并行的基本概念
7.1.1为什么要用并行
7.1.2并行的理论基础
7.1.3Oracle里能够并行执行的操作
7.1.4Oracle里与并行有关的术语及解释
7.1.4.1QueryCoordinator
7.1.4.2QuerySlaves和QuerySlaveSet
7.1.4.3TableQueues
7.1.4.4数据传递方法
7.1.4.5granules
7.1.4.6直接读取
7.1.5深入解析并行执行计划的实例
7.2Oracle里并行的控制
7.2.1Oracle里如何开启并行
7.2.2Oracle里并行度的控制
7.2.3OracleRAC环境下的并行
7.2.4Oracle里与并行相关的参数
PARALLEL_MAX_SERVERS
7.2.4.1PARALLEL_MIN_SERVERS
7.2.4.2
7.2.4.3自动并行相关的参数
PARALLEL_DEGREE_POLICY
7.2.4.3.1PARALLEL_MIN_TIME_THRESHOLD
7.2.4.3.2
7.2.4.3.3PARALLEL_DEGREE_LIMIT
PARALLEL_SERVERS_TARGET
7.2.4.3.4
7.2.4.4自适应并行相关的参数
PARALLEL_ADAPTIVE_MULTI_USER
7.2.4.4.1PARALLEL_MIN_PERCENT
7.2.4.4.2PARALLEL_AUTOMATIC_TUNING
7.2.4.4.3
7.2.4.5其他参数
PARALLEL_THREADS_PER_CPU
7.2.4.5.1PARALLEL_EXECUTION_MESSAGE_SIZE
7.2.4.5.2PARALLEL_FORCE_LOCAL
7.2.4.5.3
7.2.5绕开Oracle并行执行Bug大幅提升性能的实例
7.3总结
第8章Oracle里SQL优化的方法论
8.1Oracle里如何做SQL优化
8.1.1Oracle里SQL优化的本质是基于对CBO和执行计划的深刻理解
8.1.2Oracle里SQL优化需要联系实际的业务
8.1.3Oracle里SQL优化需要适时使用绑定变量
8.2Oracle里SQL优化的方法论在实战中的验证
8.3总结
基于Oracle的SQL优化
- 名称
- 类型
- 大小
光盘服务联系方式: 020-38250260 客服QQ:4006604884
云图客服:
用户发送的提问,这种方式就需要有位在线客服来回答用户的问题,这种 就属于对话式的,问题是这种提问是否需要用户登录才能提问
Video Player
×
Audio Player
×
pdf Player
×