- Oracle Database In-Memory(架构与实践)
- 萧宇编著
- 2885字
- 2025-02-23 16:16:23
前言
2015年,由于项目的原因,我逐渐开始关注内存计算技术。2017年,我出版了第一本关于内存计算的书:《TimesTen内存数据库架构与实践》。实际上,Oracle内存计算技术家族还有另一个重要的成员:Database In-Memory。2018年底,在与某物流客户的联合测试中,我第一次亲身体验了Database In-Memory的易用性,用户启用Database In-Memory实现了查询提速108倍,而应用和查询未做任何修改。2020年初,Oracle中国公司推出了Oracle 19c公益课堂,通过网络为公众介绍Oracle产品和技术。在第一批拟定的课程主题中,我最终选择了Database In-Memory。经过一个多月的精心准备,阅读了大量产品手册、白皮书、博客文章、网络视频与论文,也做了大量的实验。公开课吸引了超过500人参加,课后我在甲骨文云计算公众号上发表了文章“加速度:走进Oracle Database In-Memory”,作为课程的文字版,同时也作为这一个月来学习的总结。2020年底,我开始有了出书的想法,希望可以完整和系统地介绍Database In-Memory。目前市面上仅有的一本介绍Database In-Memory的书是基于Oracle 12cR2版本的,由Oracle Press于2017年出版。Database In-Memory在12cR2版本之后又发布了很多新特性,所以我觉得一些理论可以更深入展开,也可以增加动手操作的内容,以加深对此项技术的理解。相信我学习Database In-Memory的这些心得体会、经验与教训是值得与大家分享的,我想做的正如我非常喜欢的散文家王鼎钧所说:“我一边赤脚行走,一边把什么地方有荆棘、什么地方有甘泉写下来,放在路旁让后面走过来的人拾去看看”。简而言之,我为什么写这本书?一是觉得Database In-Memory值得写,二是我有信心能把它写好。
本书适用于不同类型的读者。如果你是数据库管理员,可以通过此书了解内存计算的基本概念、Database In-Memory的体系架构和内部运行机制、监控与调优。如果你是架构师,可以了解如何利用新型内存计算技术简化整体架构设计,将Database In-Memory应用于企业级混合负载业务系统或数据仓库系统,助力构建实时企业。如果你是应用开发人员,可以学习如何充分利用数据库自身的能力,简化应用开发,聚焦于真正创造业务价值的核心问题。
希望本书能帮助读者编写出更高效的应用,设计出更敏捷的架构。阅读本书的唯一先决条件是对关系型数据库有基础了解。如果读者具备Oracle数据库管理、关系型数据库应用开发或系统架构设计能力中的一种,或对其他类型的内存数据库有所了解,对于理解本书内容也将大有裨益。
第1章首先介绍了内存计算技术的发展历史以及推动其发展的软硬件技术和新型企业应用需求,对内存计算技术的概念及分类进行了阐述。最后对当前主流的内存数据管理产品做了简要介绍,包括商业和开源领域的内存数据库和内存数据网格产品。
第2章介绍如何搭建Database In-Memory实验环境,包括安装虚拟化引擎VirtualBox、虚拟机环境管理工具Vagrant、下载随书示例、安装示例表和生成并导入测试数据,后续章节中的示例和概念讲解均基于此实验环境展开。接下来介绍了便于开发和测试的管理工具SQL Developer及命令行编辑工具rlwrap。最后介绍了Database In-Memory相关的学习资源,包括文档、博客、视频和动手实验资源等。
Database In-Memory是Oracle数据库企业版的选件之一。如果说Database In-Memory是一片树叶,Oracle数据库则是一棵参天大树。在探索树叶的脉络之前,对这棵大树有一全局的概念是非常必要的。因此第3章首先对Oracle数据库相关的重要基本概念做了简要介绍,包括数据库版本和版本号、选件和管理包体系以及升级和更新的概念。重点介绍了Database In-Memory中最核心的概念,包括行列双格式存储、数据库内存管理、Database In-Memory架构和内存压缩单元架构。
第4章介绍了两个重要的Database In-Memory操作:配置与发布。配置部分包括如何为数据库启用和禁用Database In-Memory,如何开启和关闭数据库对象的INMEMORY属性,如何指定INMEMORY对象的压缩级别和发布优先级。发布方面则涉及发布的基本概念和工作原理、不同的发布方式和发布对象与过程的监控等。
第5章全面介绍了与Database In-Memory相关的管理工具。首先介绍了一些传统的图形化和命令行管理工具,如SQL Developer、Oracle Enterprise Manager、SQL Plus和SQLcl。然后介绍了如何生成优化器统计信息和SQL执行统计信息,以及生成、显示和解读执行计划,这些概念对于理解Database In-Memory的执行都是非常重要的。Oracle数据库建议器部分介绍了In-Memory建议器和压缩建议器,并解答了两个常见问题,即哪些数据库对象适合使用Database In-Memory,以及如何估算不同压缩级别对于内存的消耗。本章最后介绍了用于控制Database In-Memory行为的初始化参数和优化器提示,以及监控Database In-Memory状态的系统视图。
第6章介绍了Database In-Memory最基础同时也是最核心的性能优化技术,包括内存列式存储格式、压缩、存储索引和SIMD向量处理。然后介绍了操作下推的概念及Database In-Memory所支持的各类下推操作。最后介绍了优化器在改进分析查询上的两类增强:In-Memory联结和In-Memory聚合。本章介绍的技术、概念和算法是Database In-Memory提供极速分析性能的关键,也充分体现了Oracle在数据库软件领域的长期和深厚积累。
第7章介绍了Database In-Memory高级性能优化功能,包括通过预计算实现性能提升的In-Memory表达式,通过全局字典避免解压缩和哈希计算的联结组,通过与SIMD指令紧密配合实现的In-Memory深度向量化,针对JSON、NUMBER、全文本和地理空间多种数据类型的优化,以及结合多线程和并行处理等技术实现的In-Memory扫描优化。
高可用性是关键业务系统最重要的非功能性需求之一。第8章首先介绍了Oracle最高可用性架构,然后详细介绍了Database In-Memory如何与RAC集群环境结合,包括数据的分布、复制和数据库服务等重要概念。接下来介绍了Database In-Memory与ADG灾备组件紧密集成的多种场景,以及如何利用数据库服务实现Database In-Memory与灾备角色的绑定。最后介绍了FastStart,这是可以在数据库启动时加速内存列式数据发布的功能。
第9章介绍了Database In-Memory与数据可管理性相关的一些功能。首先介绍了自动数据优化,可以将内存列式存储作为新的数据层级,根据制定的策略自动将对象发布到或移出内存列式存储。然后介绍了Automatic In-Memory,可以在内存不足时自动移除“冷”对象,以保证“热”对象的发布;在最新的21c版本中,即使未设置INMEMORY属性的数据库对象也可以通过其进行管理。
大数据有数据量大、数据类型多、产生速度快3个主要特征。第10章主要关注Database In-Memory与大数据的“量”和“速”的结合。本章首先介绍了Database In-Memory如何与多种形式的外部表协同工作,然后介绍了内存优化行存储。最后介绍了Exadata对In-Memory列格式的支持,此功能将Database In-Memory的好处延伸到Exadata存储层的大容量闪存,同时可以保证良好的性能。
本书的一大特色是理论与动手实践相结合,在计算机旁阅读此书是最佳的方式,这样可以对书中的概念进行验证和探索。全书附带大量脚本和代码,以加深读者对产品特性和基本概念的理解,所有脚本和代码均按章节组织,可以扫描文末二维码自助下载。
衷心感谢我的朋友和同事们在出书过程中给予的帮助与指导,感谢家人对我写作的支持。感谢清华大学出版社的王芳编辑,尽管未曾谋面,但这已经是我们配合的第3本书。感谢Oracle公司的同事Joyce Li、叶大海、段辉、朱俊峰、孙骏,Database In-Memory产品经理Andy Rivenes,Database In-Memory高级开发经理Gong Weiwei,以及SAP中国公司的Jennifer Jia和Long Sheng,感谢你们通过Oracle内部论坛、电话、邮件及现场对我提出问题的耐心指导和答疑。感谢海信集团IT与数据管理部总经理许敏、副总经理袁俊卿、基础架构及云服务部部长曲栋,网鼎明天科技有限公司的李兆,在Oracle第一届Database In-Memory高峰会议上无私分享了海信在SAP核心系统使用Database In-Memory的经验和教训,这些来自用户视角的不同观点也给予了我新的启发,并融入本书的内容当中。最后,我想对我的父母说,这本书是献给你们的,感谢你们从小培养了我阅读和思考的习惯,给予我克服困难的勇气和动力,谢谢你们!
萧 宇
2021年9月

代码脚本下载