内容简介
这是国内第一本深度讲解如何架构与设计高并发Oracle数据库系统的著作,也是国内第一本系统讲解内存数据库TimesTen的专著。作者是拥有10余年Oracle从业经验的数据库架构师,本书的内容也得到了业界以盖国强为代表的数位数据库专家的一致认可。本书秉承大道至简的思想,技术与艺术并重,从技术、方法论、原理和思想等角度讲解了如何架构与设计高并发Oracle数据库系统。
全书主要内容从三个维度展开:先是内部扩展的维度,深入探讨了B树索引、表设计、查询优化器等数据库架构设计与优化的核心技术,以及高并发Oracle数据库系统架构与设计的方法论和常见的高并发案例;其次是纵向扩展的维度,国内次详细讲解了内存数据库TimesTen的基本使用、高可用架构设计、缓存应用、监控方法、数据备份与恢复、数据迁移以及高并发场景;是横向扩展的维度,详细讲解了如何使用GoldenGate构建数据库群,重点是结合链路原理的实现,介绍了拓展数据集成平台和异构数据库群的设计思路。此外,还从容灾和高并发的角度介绍了Data
Guard的妙用,以及超出纯技术范围的一些实践。
目录
Contents?目 录
序一
序二
前言
第一部分 内政篇
第1章 大道至简 2
1.1 初见高并发 2
1.1.1 从一次谈话说起 3
1.1.2 问题就在那里 4
1.1.3 你不是一个人在战斗 6
1.2 说句时髦话 8
1.2.1 谈谈去IOE 8
1.2.2 开源的作用域 9
1.3 在Oracle的世界里 10
1.3.1 数据库森林体系 10
1.3.2 大道至简 12
1.4 本章小结 13
第2章 B树索引 14
2.1 索引扫描识别 14
2.1.1 B树索引 15
2.1.2 全表扫描 16
2.1.3 ROWID扫描 17
2.1.4 索引扫描 18
2.1.5 索引范围扫描 20
2.1.6 索引全扫描 21
2.1.7 索引快速全扫描 22
2.1.8 索引跳跃扫描 24
2.1.9 索引组合扫描 25
2.1.10 索引联立扫描 27
2.2 索引与排序 28
2.2.1 B树索引内部结构 28
2.2.2 输出排序 29
2.2.3 降序索引 34
2.2.4 聚合查询min()与max() 37
2.3 索引设计优化 40
2.3.1 索引选择度 40
2.3.2 数据分布的影响 41
2.3.3 索引聚簇因子 45
2.3.4 数据存储的影响 47
2.3.5 复合索引 50
2.3.6 索引被无视 54
2.4 索引分裂 58
2.4.1 分裂原理 59
2.4.2 实例分析 61
2.5 索引维护 70
2.5.1 为何重建索引 71
2.5.2 何时重建索引 73
2.5.3 如何重建索引 76
2.5.4 废旧索引清理 77
2.6 本章小结 78
第3章 表设计 79
3.1 数据生命周期管理 80
3.1.1 什么是数据生命周期管理 80
3.1.2 架构模型设计 81
3.1.3 数据分层存储 86
3.2 常用字段类型选择 87
3.2.1 VARCHAR2与CHAR 87
3.2.2 NUMBER与VARCHAR2 88
3.2.3 主键字段的选择 90
3.2.4 LOB字段 91
3.3 字段顺序 95
3.3.1 热字段靠前排 95
3.3.2 行宽需要控制 97
3.4 行链接与行迁移 99
3.4.1 行链接原理 99
3.4.2 行迁移原理 101
3.4.3 发现问题 101
3.4.4 解决问题 104
3.5 分区表的使用 105
3.5.1 何时使用分区表 105
3.5.2 分区表设计思路 106
3.5.3 分区表特性 106
3.6 适当的冗余 110
3.6.1 反范式建模 110
3.6.2 物化视图 113
3.6.3 结果集缓存 117
3.6.4 直接路径插入 120
3.7 碎片分析与整理 122
3.7.1 碎片的产生 123
3.7.2 DBMS_SPACE包 125
3.7.3 碎片的整理 130
3.8 本章小结 138
第4章 查询优化器 139
4.1 优化器概述 140
4.1.1 优化器简介 140
4.1.2 参数配置 143
4.2 像优化器一样思考 147
4.2.1 成本计算机制 147
4.2.2 成本计算公式推导 150
4.3 统计信息管理 155
4.3.1 统计信息分类 156
4.3.2 制定收集策略 158
4.3.3 管理收集方式 164
4.3.4 制定备份策略 168
4.3.5 收集直方图 174
4.4 执行计划管理 175
4.4.1 获取执行计划 175
4.4.2
摘要与插图
第一部分内 政 篇
万物之始,大道至简,衍化至繁。
——老子,《道德经》
第1章
大 道 至 简
万物之始,大道至简,衍化至繁。世间一切事物在刚刚开始的时候,都是简单的,是为大道,随着事物不断地发展,其衍变出来各种复杂的局面。然而,追本溯源,仍然会发现复杂局面下真正在左右事物的还是那些本的东西——大道。如果能牢牢把握住这些被认作是“大道”的东西,再复杂的局面也自然会变得简单。
近些年来,在数据库领域里,可谓群雄逐鹿,志在中原。他们各自有各自的,相互间也甚是喜欢用自己的长处去比较对手的短处,以彰显其产品的优势,眼花缭乱的测试结果和市场评价,其局面之复杂就像将要开启一个新的时代。不论是作为研发者还是用户,这样的竞争无疑都是一件好事,但也要求我们需懂得把握其中的大道。
为什么会有如此多样的数据库在市场上竞争呢?当然是市场需求在推动的,而需求的本身则源自于各行业的业务系统应用。如果说未来会开启一个新数据库时代,那很好。然而,现在无疑还是RDBMS的时代,其中的佼佼者无疑还是Oracle数据库。
本书将秉承大道至简的主导思想,立足于Oracle的数据库相关技术,给读者展示一套高并发业务系统的数据库架构设计方法论。
1.1 初见高并发
高并发这个概念并不新鲜,可以说有数据库的地方都有可能面临高并发的问题。在数据库里,高并发问题主要集中在两个方面:读的高并发、写的高并发,两者看起来都不是很复杂,然而实际情况往往是读和写会交织在一起,并同时呈现出高并发的问题。
这个时候,相信很多读者都会提出一个观点:做读写分离嘛。是的,这是一个不错的主意,但只是一个治标不治本的主意。业务系统的耦合度很高,是不可能实现业务层级的读写分离的。在架构设计的过程中,不能驻足于技术层面,还是需要渗透到业务层面去的。不论是业务驱动技术,还是技术驱动业务,两者都是不能分离开考虑的,比较好的做法应该是,在两者之间形成一种平衡,当然这是需要架构师的分析能力和沟通能力来加以驱动的。
1.1.1 从一次谈话说起
应用架构师:“哥们!还记得上半年让你们帮忙做的一次数据库容量测试吗?”
数据库架构师:“当然!我们可是费了很大的工夫才完成的。”
应用架构师:“当时不是说我们在现有的硬件条件下,数据库的容量足够承受当时4倍业务压力吗?可是下半年我们的业务量才增长了0.5倍,怎么就不行了呢?”
数据库架构师:“从系统资源利用率的报告来看,CPU、内存、I/O、网络上都没有太大的压力。但是,在业务高峰时段,CPU出现短暂冲高的现象。”
应用架构师:“没错!在应用端可以看到出现用户阻塞,中间件上的连接持续增加,没有得到及时释放。”
数据库架构师:“嗯,那是数据库未能及时响应造成的。CPU冲高,通过监控,我们发现很多并发的会话在争用一些资源,比如数据块、索引块、Latch和Mutex。表现出很多等待事件的冲高。”
应用架构师:“我想我们遇到高并发争用的麻烦了。”
数据库架构师:“是的。当初这套系统的设计,预期到现在这么大的业务压力了吗?”
应用架构师:“谁也不会有这种先见之明吧?当初只是一种业务的尝试而已,谁能想到市场的反应会那么好!从数据库层面来看,有什么好办法吗?毕竟现在的问题出在数据库上。”
数据库架构师:“办法是有的,针对性地一一解决掉。但是,这总归是治标不治本的办法。就像治水,现在压力我们堵住了,如果压力再大一些呢?我需要你的帮助。”
应用架构师:“你是说业务架构的变更吗?小变化没有问题,但是要像互联网公司那样大改,肯定是不行的,我们接受不了这么大