新書推薦:
《
一个人·谁也不是·十万人(诺贝尔文学奖得主反思自我的巅峰之作)
》
售價:NT$
250.0
《
重写晚明史(全5册 精装)
》
售價:NT$
3560.0
《
汉末晋初之际政治研究
》
售價:NT$
602.0
《
强者破局:资治通鉴成事之道
》
售價:NT$
367.0
《
鸣沙丛书·鼎革:南北议和与清帝退位
》
售價:NT$
551.0
《
从康德到黑格尔的发展:兼论宗教哲学(英国观念论名著译丛)
》
售價:NT$
275.0
《
突破不可能:用特工思维提升领导力
》
售價:NT$
352.0
《
王阳明大传:知行合一的心学智慧(精装典藏版)
》
售價:NT$
1010.0
|
編輯推薦: |
资深Oracle DBA黄玮(Fuyuncat)十年磨一剑,深入揭示Oracle
SQL优化与调优的原理、核心技术与思想方法,盖国强鼎力推荐!
|
內容簡介: |
Oracle数据库的性能优化直接关系到系统的运行效率,而影响数据库性能的一个重要因素就是SQL性能问题。本书是作者十年磨一剑的成果之一,深入分析与解剖Oracle
SQL优化与调优技术,主要内容包括:
第一篇“执行计划”详细介绍各种执行计划的含义与操作,为后面的深入分析打下基础。重点讲解执行计划在SQL语句执行的生命周期中所处的位置和作用,SQL引擎如何生成执行计划以及如何获取SQL语句的执行计划,如何从各种数据源显示和查看已经生成的执行计划。
第二篇“SQL优化技术”深入分析Oracle的SQL优化技术,包括逻辑优化技术和物理优化技术。用大量示例详尽分析Oracle
中现有的各种查询转换技术,先分析Oracle如何收集、统计系统和对象的数据,然后推导各种代价估算公式,给出各种情形下的代价计算演示。
第三篇“SQL调优技术”深入剖析Oracle提供的各项调优技术。先对语句实际运行的性能统计数据进行了深度分析,介绍各项统计数据是由什么操作导致的以及如何统计。然后介绍如何对SQL语句进行优化以获得稳定、高效的性能。最后,依据对SQL优化及调优技术的分析,介绍如何快速优化SQL的思路。
本书内容丰富且深入,破解了Oracle技术的很多秘密,适合Oracle数据库管理员、应用开发人员参考。
|
關於作者: |
黄玮,资深Oracle数据库管理员,从事DBA工作十几年,有丰富的大型数据库开发、设计和维护经验,涉及水利、军工、电信及航运等行业。目前供职于某世界著名物流公司,负责公司的电子物流系统的数据库开发、维护工作。2005年创建个人网站www.HelloDBA.com,并致力于数据库方面的基础性技术研究,整理和发布了大量关于数据库系统的底层机制、存储结构、性能调优以及基础算法的文章,开发了多个数据恢复、性能监控、内核跟踪等免费的实用工具,为Oracle社区做出了应有的贡献。
|
目錄:
|
序
前言
第一篇 执行计划
第1章 生成和显示执行计划 3
1.1 生成执行计划 3
1.2 显示执行计划 4
1.2.1 通过查询语句显示计划 4
1.2.2 通过包DBMS_XPLAN显示计划 4
1.2.3 AUTOTRACE 12
1.2.4 其他方法 13
第2章 解读执行计划 15
2.1 执行计划的基本数据 15
2.2 内部函数与操作 17
2.3 执行计划各个列的含义 19
2.4 执行计划各个操作的含义 21
2.4.1 语句类型 21
2.4.2 访问路径方法 23
2.4.3 位图操作 31
2.4.4 排序操作 33
2.4.5 关联操作 36
2.4.6 层次查询操作 42
2.4.7 视图操作 45
2.4.8 数据集合操作 45
2.4.9 分区操作 48
2.4.10 并行查询操作 51
2.4.11 聚合操作 57
2.4.12 分析函数操作 58
2.4.13 模型化操作 60
2.4.14 数据和对象管理操作 63
2.4.15 其他操作 65
2.5 执行计划中其他信息的含义 69
2.5.1 查询块和对象别名 69
2.5.2 计划概要数据 70
2.5.3 绑定变量信息 70
2.5.4 分布式查询语句信息 72
2.5.5 注释 72
第二篇 SQL优化技术
第3章 查询转换 75
3.1 启发式查询转换 75
3.1.1 简单视图合并 76
3.1.2 子查询反嵌套 81
3.1.3 子查询推进 86
3.1.4 旧关联谓词推入 87
3.1.5 简单过滤谓词推入 90
3.1.6 谓词迁移 91
3.1.7 “或”操作扩张 91
3.1.8 物化视图查询重写 92
3.1.9 集合操作关联转变 94
3.1.10 由约束生成过滤谓词 95
3.1.11 星形转换 96
3.1.12 排序消除 98
3.1.13 DISTINCT消除 99
3.1.14 表消除 99
3.1.15 子查询合并 102
3.1.16 公共子表达式消除 104
3.1.17 计数函数转变 105
3.1.18 表达式和条件评估 105
3.1.19 聚集子查询消除 111
3.1.20 DISTINCT聚集函数转换 111
3.1.21 选择字段裁剪 113
3.1.22 DISTINCT消除 114
3.1.23 DISTINCT推入 114
3.1.24 集合分组查询转换 115
3.1.25 集合分组查询重写 115
3.1.26 集合分组裁剪 117
3.1.27 外关联消除 118
3.1.28 真正完全外关联 119
3.1.29 左(右)外关联转换为侧视图 120
3.2 基于代价的查询转换 123
3.2.1 复杂视图合并 123
3.2.2 关联谓词推入 124
3.2.3 谓词提取 126
3.2.4 GROUP BY配置 127
3.2.5 表扩张 128
3.2.6 关联因式分解 130
3.2.7 DISTINCT配置 131
3.2.8 WITH子查询转换 132
第4章 统计数据 134
4.1 系统统计数据 134
4.1.1 系统统计数据收集 136
4.1.2 系统统计数据管理 137
4.1.3 根据系统负载状况灵活管理 140
4.1.4 全局参数管理 142
4.1.5 项管理 143
4.2 对象统计数据 146
4.2.1 表统计数据 150
4.2.2 索引统计数据 150
4.2.3 字段统计数据 151
4.2.4 扩展统计数据 152
4.2.5 对象统计数据的管理 153
4.2.6 “待定”统计数据的管理 160
4.3 对象统计数据收集过程分析 161
4.3.1 表统计数据收集与计算 161
4.3.2 字段统计数据收集与计算 164
4.3.3 柱状图数据收集与计算 170
4.3.4 索引统计数据收集与计算 182
第5章 执行计划的代价估算 186
5.1 代价模型 187
5.2 基本代价计算公式 187
5.3 选择率计算 190
5.3.1 单过滤条件 190
5.3.2 绑定变量无具体数值 190
5.3.3 绑定变量有数值无柱状图 191
5.3.4 使用柱状图 192
5.3.5 过滤条件的组合 196
5.4 多数据块读操作代价计算 197
5.4.1 代价模型 197
5.4.2 IO代价计算 199
5.4.3 CPU代价计算 202
5.4.4 执行计划中其他数据的计算 209
5.4.5 全表扫描代价计算演示 209
5.5 并行扫描操作代价计算 218
5.5.1 IO代价计算 219
5.5.2 CPU代价计算 221
5.6 单数据块读操作代价计算 222
5.6.1 IO代价计算 222
5.6.2 CPU代价计算 226
5.6.3 单数据块读操作代价计算演示 228
5.7 排序操作代价计算 233
5.7.1 是否需要写入磁盘 233
5.7.2 IO代价计算 234
5.7.3 CPU代价计算 236
5.7.4 临时磁盘空间计算 236
5.7.5 排序代价计算演示 237
5.8 关联操作代价计算 241
5.8.1 关联选择率 242
5.8.2 嵌套循环关联代价计算 242
5.8.3 排序合并关联代价计算 249
5.8.4 哈希关联代价计算 252
5.9 并行模式下的关联代价计算 260
5.9.1 IO代价计算 262
5.9.2 CPU代价计算 263
5.9.3 代价计算演示 263
第三篇 SQL调优技术
第6章 SQL语句运行性能分析 270
6.1 性能统计数据 270
6.1.1 逻辑读 272
6.1.2 一致性获取 273
6.1.3 一致性直接获取 273
6.1.4 由缓存一致性获取 273
6.1.5 一致性修改 274
6.1.6 数据块修改 275
6.1.7 物理读入缓存 276
6.1.8 物理预提取读入缓存 276
6.1.9 排序数据行 277
6.1.10 递归调用 278
6.2 逻辑读分析 280
6.2.1 一致性读分析 280
6.2.2 当前模式读分析 309
6.3 物理读分析 319
6.3.1 物理直接读 319
6.3.2 物理读入缓存与LRU算法 378
第7章 Oracle调优技术 387
7.1 存储概要 387
7.1.1 什么是存储概要 388
7.1.2 创建存储概要 389
7.1.3 管理存储概要 391
7.1.4 使用存储概要 392
7.2 SQL执行计划管理 394
7.2.1 创建和增加执行计划基线 395
7.2.2 进化历史执行计划 405
7.2.3 优化器从基线中选择执行计划 407
7.3 Oracle自动调优 409
7.3.1 创建调优任务 410
7.3.2 SQL调优建议器的参数 410
7.3.3 自动调优分析 412
7.4 SQL性能分析器 423
7.4.1 性能分析过程 424
7.4.2 SQL性能分析示例 426
7.5 SQL访问建议器 428
7.5.1 建议器选择新索引分析过程 428
7.5.2 使用SQL访问建议器 433
第8章 快速调优思路 441
8.1 统计数据检查 441
8.2 从执行计划中找到潜在问题 444
8.2.1 是否存在多个游标 444
8.2.2 输出结果中特别注释 447
8.2.3 存在潜在性能问题的操作 448
8.2.4 谓词信息 452
8.2.5 概要数据以及优化器环境检查 455
8.3 物理设计优化 456
8.3.1 索引 456
8.3.2 分区 457
8.3.3 物化视图 458
8.3.4 约束 458
|
內容試閱:
|
作为一个数据库管理系统来说,Oracle不仅具备为用户存储和管理海量数据的能力,还能够解析用户提交结构化查询语言(Structured
Query
Language,SQL)的请求,高效和快速地响应请求。为了保证语句的查询效率,Oracle开发了许多技术,从各个方面提供支持,例如,物理设计、内存管理和SQL语句本身的自动优化与调优。
各种基于数据库的系统中,绝大多数功能都需要通过数据库管理系统查询和操作数据,因而后台的性能对系统整体性能的影响是相当关键的。而要实现对数据的管理与查询,程序需要通过SQL语句对数据库发起相应的请求。也就是说,SQL语句的性能成为影响系统性能至关重要的因素。
Oracle数据库作为目前市场占有量最大的关系型数据库管理系统,拥有成千上万的专利技术保证数据库系统的性能。而对于应用系统性能影响重大的SQL引擎,Oracle更是提供了强大的技术保障,不仅采用了主流数据库系统当中优化效果最好的优化模式—基于代价的优化模式,还引入了数量庞大的、有别于其他数据库系统的专利优化技术。这些优化技术使得Oracle在SQL优化和调优方面独树一帜。
然而,尽管Oracle可能已经在内部帮助我们完成了99%的优化工作,但剩余的1%仍然可能成为导致性能下降的决定因素。因此,在Oracle数据库系统当中,发生性能问题的例子还是层出不穷。并且,以作者的个人经历来看,这些性能问题绝大多数是由SQL语句引起的。因此,深入理解和掌握Oracle的SQL语句优化和调优技术,是开发人员和数据库管理员都应掌握的,也是开发出性能高效的数据库系统的必要前提。
本书结合作者多年来对Oracle的SQL内部优化机制的研究以及SQL调优的经验,深入分析了Oracle的各项SQL语句的优化与调优技术,侧重于对这些技术的内部机制的介绍,目的是帮助读者更加深入地了解和消化这些技术,使读者在面对和解决由SQL引起的性能问题时,能透彻地看清问题的本质,迅速找到有效的解决方法。
SQL优化是指在语句运行之前,由SQL引擎对语句进行解析,采用各项技术对查询进行优化,找到其最佳的执行路径,即执行计划;SQL调优则是对已经存在执行计划的语句进行进一步调整,使其运行性能更加接近性能指标的要求,达到性能改进的目的。SQL优化与SQL调优是在改善SQL语句性能的过程中,两个不同阶段实施的技术与方法。SQL优化,基本上是由优化器根据当前环境和数据实施的内部优化措施;SQL调优,则是通过对语句、物理对象以及优化环境的干预,使得优化器能够选择到最优的SQL执行方式。因此,这两个方面的技术内容是相辅相成的。
在RBO时期(9i之前),由于优化技术的限制,使得SQL语句往往不能获得最佳的执行计划,从而导致性能低下,需要依赖于开发人员或数据库管理员的经验和技能,对语句进行人工干预,从而调整其性能。可以说,这个时期的优化技术是有限的,并且优化与调优过程比较独立。进入CBO时代后,统计数据(Statistics
Data)为优化器采用更加智能和复杂的优化技术提供了有力的数据保障,越来越多的基于代价的优化技术被应用到了Oracle的SQL引擎当中。同时,这也使得自动和智能化的优化技术成为可能。在10g、11g当中,Oracle引入了多项新的优化技术。这些优化技术不仅仅能针对当前的运行结果进行调优,而且能对优化环境和物理设计等影响优化效果的因素进行深入检查,提供短期和长期的各种调优建议。并且,部分调优结果还可以在语句的下一个执行周期中影响其优化方法。这就使得优化与调优技术更加紧密地结合在一起,为SQL语句提供一个稳定、高效的运行性能。
简单地说,我们在调整SQL语句性能时,需要灵活地使用SQL调优技术,使得SQL语句在优化阶段能够获得真正最佳性能的执行计划。图0-1描述了SQL优化与SQL调优在改进性能过程中所处的位置以及相互作用的方式。希望读者可以先通过该图体会到这两方面技术之间的关系,在后续的阅读和学习过程中能清楚地知道各种技术在提高性能过程中的作用。
无论是SQL优化还是调优,它们的核心内容都是执行计划(Execution
Plan)。许多相关技术,例如查询转换、SQL调用配置(SQL
Profile)都是围绕执行计划这一要素展开的。本书将从执行计划开始,逐步剖析Oracle的SQL优化与调优的相关技术。
本书分为三篇、共八章。
第一篇解释什么是SQL语句的执行计划。主要内容包括:执行计划在SQL语句执行的生命周期中所处的位置和作用;SQL引擎如何生成执行计划以及如何手工生成一条语句的执行计划;如何从各种数据源显示和查看已经生成的执行计划。本篇的重点部分则是向读者解释如何读懂执行计划,包含执行计划结构解析、各种数据所代表的含义、执行计划各种操作的含义和示例,以及执行计划与内部函数之间的本质关系。
第二篇深入分析Oracle的SQL优化技术。总体上来说,SQL优化技术可以分为两类:逻辑优化技术和物理优化技术。其中,逻辑优化主要是指查询转换技术。本篇当中详尽地分析了10g、11g中现有的各种查询转换技术,并给出实际示例帮助读者理解这些技术。而物理优化则指的是优化器通过代价估算来选择最佳的执行计划。优化器要正确估算执行计划及其操作的代价,则需要准确的统计数据的支持。因此本书在分析优化器的代价估算方法之前,先分析Oracle如何收集、统计系统和对象的统计数据。然后,结合作者推导出的各种代价估算公式,演示了各种情形下的代价计算方法。
在本书中有不少演示代码用于解释相关知识点。读者请执行脚本00_01_Prepare.sql(进入Oracle
11g中再执行00_01_Prepare_11g.sql)准备演示环境。本书所介绍的内容将基于10g和11g的版本特性,其中有部分脚本只能用于相应版本,请注意提示。www.HelloDBA.com是作者专属的个人网站,是作者分享个人经验和心得的重要平台。本书中使用的所有代码脚本都会放在本网站上供读者免费下载。此外,因篇幅问题而删减的附录“SQL提示的含义和示例”也将以电子文档的形式提供读者免费阅读。读者在阅读本书过程中,如有任何疑问,可以给作者发送电子邮件:fuyuncat@gmail.com,也可以关注作者的微博(http:www.weibo.comu1407854870)。
【书摘】
第一篇
执行计划
执行计划是指示Oracle如何获取和过滤数据、产生最终结果集,是影响SQL语句执行性能的关键因素。我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行计划。
在深入了解执行计划之前,我们先了解SQL语句的处理执行过程。当一条语句提交到Oracle后,SQL引擎会分为三个步骤对其处理和执行:解析(Parse)、执行(Execute)和获取(Fetch),分别由SQL引擎的不同组件完成。SQL引擎的组件如图1-1所示。
1. SQL编译器(SQL Compiler)
将语句编译到一个共享游标中。SQL编译器由解析器(Parser)、查询优化器(Query Optimizer)和行源生成器(Row
Source Generator)组成。
q 解析器(Parser)—执行对SQL语句的语法、语义分析,将查询中的视图展开、划分为小的查询块。
q 查询优化器(Query
Optimizer)—为语句生成一组可能被使用的执行计划,估算出每个执行计划的代价,并调用计划生成器(Plan
Generator)生成计划,比较计划的代价,最终选择选择一个代价最小的计划。查询优化器由查询转换器(Query
Transform)、代价估算器(Estimator)和计划生成器(Plan Generator)组成。
注意,上述优化器实际上指的是基于代价的优化器(Cost Based
Optimizer,CBO),CBO也是当前采用的所有优化和调优技术的核心基础。
|
|