新书备忘
资深PostgreSQL数据库专家撰写,全面系统阐释PostgreSQL性能调优的各种方法、技巧及实践
结合PostgreSQL自身架构和运行环境分析性能影响因素,涵盖服务器硬件挑选、文件系统调优、数据库参数配置、查询优化等方面,并提供大量具体操作实例
无论是传统的企业型应用,还是当下的Web应用,作为一种数据库平台,PostgreSQL在为这些应用程序提供数据存储服务方面的可行性日趋成熟。不过,要想获取PostgreSQL的最佳性能,一直以来都并非易事。用户需遵循适宜的经验法则,需持续监控和维护以保障数据库系统健康运行,需以合理化建议定位和处理当前问题,需对数据库相关的附件工具有所涉猎,以便遇到核心数据库无法解决的问题时,可以为其进行功能扩展。
本书内容概述
第1章介绍了PostgreSQL最近几个版本的性能改进情况。通常,人们认为所有软件的新版本会问题百出,而且会比以前的版本运行得更慢,但PostgreSQL不存在这个问题。
第2章讨论了如何仔细挑选服务器硬件中的主要部件,包括处理器、内存以及磁盘等,在预算允许的情况下如何组建一个稳定可靠的数据库存储服务器。特别是在磁盘控制器和驱动器方面,如果误用了易失性回写缓存,很容易导致数据库损坏。
第3章讨论了不同数据库硬件性能方面的量化标准。比如在你的系统当中,内存读取到底有多快?磁盘的原始性能有多强?在添加更多的磁盘后,数据库性能是否能正常按比例提升?
第4章研究现行文件系统的可选方案,并就如何权衡硬盘中数据库的不同布局提出建议。同时也讨论了一些常见的有效文件系统的调优问题。
第5章深入研究了数据库在磁盘、内存中的存储机制,并解释了checkpoint进程是如何协调这两种存储机制以保证数据安全的。此外,该章还讨论了如何深入查看数据库所缓存的数据,以及在此基础上,确认当下存储在系统内存里的数据与你的预期数据是否一致。
第6章涵盖了postgresql.conf文件中的最重要的一些设置选项,介绍了这些选项的含义以及如何设置这些选项。此外,也指出了可能会引起问题的设置。
第7章首先阐释了PostgreSQL如何判定哪些行数据对哪些用户可见。这些可见性信息的存储方法需要一个名为VACUUM的清理进程来正常地重新使用剩余空间。此外,该章也涉及了一些常见问题以及针对这些问题的调节方式,也涵盖了一直运行的autovacuum。最后,该章介绍了数据库日志的数据量调节方式,以及如何使用查询日志分析器对结果进行分析,从而帮助用户找出查询瓶颈。
第8章研究如何使用PostgreSQL自带的pgbench测试程序来获取有用的基准评测结果。
第9章介绍索引在响应查询时是如何减少数据块的读取量的。这种方法可以彻底探索一些常见问题,比如为什么一个查询会使用顺序扫描而不是使用强大的索引扫描。
第10章是PostgreSQL optimizer(优化器)指南,根据一些查询例子的不同执行方式以及数据库参数的不同设置,来说明数据库的不同优化方式。
第11章介绍了数据库内部所收集的统计信息,以及哪些信息有助于查找问题。同时,也介绍了能够让你看到查询活动以及锁行为的一些视图。
第12章先介绍了如何使用操作系统所提供的基本监视工具以确定数据库的当前动作。然后,该章针对可按照时间对信息趋势进行图形化表示的软件给出了建议。
第13章对在同一时间内对数据库进行大量连接时所遇到的困难进行了说明。同时,建议使用两种软件包——连接池(以更好地对请求进行排序)和缓存(在不连接数据库的情况下响应用户请求)——来帮助解决这些问题。
第14章讲述了如何通过跨节点复制数据来减轻数据库的负载压力,典型的解决方式是,多个同步只读的从节点搭配一个可读写的主节点。
第15章探讨如何有效地将数据划分为子集,这样可以在数据库的一小部分上执行查询。所讨论的方法包括单节点数据库表分区和使用PL/Proxy及其相关工具集来构建跨多节点的共享数据库。
第16章探讨那些在PostgreSQL中看起来阻碍初学者使用的部分。重点是如何找到代码不工作的原因,以及有哪些现有工具可以帮助诊断问题。
第17章以统计记录数和外键处理作为例子,涵盖了所有批量导入部分。同时,该章还包括人们使用PostgreSQL时所遇到的常见问题。
第18章详细介绍了从PostgreSQL 8.1到9.6各个版本中与性能相关的功能变化情况。有时,避免常见问题并获得更好性能的最佳方式就是升级到不再存在问题的新版本。
你需要为阅读本书准备什么
为了更好地利用本书,你至少需要一个能够连接服务器并执行查询的PostgreSQL客户端。理想情况下,你最好也是服务器管理员。从http://www.postgresql.org/download 上可以下载支持各种主流操作系统的完整客户端与服务端PostgreSQL安装包。本书的所有例子都是通过命令行方式执行的,通常是运行psql程序。这样可以使它们适合大多数操作系统平台。这样可以直接进行许多操作,而不必使用PostgreSQL的图形界面(GUI)工具,比如pgAdmin III程序。
本书提供的一些脚本是用bash脚本语言编写的,如果你使用的是Windows操作系统,可以从http://www.cygwin.com/ 下载cygwin软件套件,cygwin可以在Windows系统中提供常见的UNIX工具,比如bash。
本书读者
本书适用于那些使用或计划使用PostgreSQL的中高级数据库管理员和开发人员。系统管理员可以在安装、配置和监视数据库服务器方面受益。本书对开发人员在编写最佳查询并在其数据库设计中检测性能问题方面也会有所帮助。同时,本书也有利于PostgreSQL内部架构师使用基准评测工具监控性能。
下载示例代码
你可以通过http://www.packtpub.com用你的账户下载本书的示例代码。如果你从其他地方购得此书,可以直接访问http://www.packtpub.com/support去注册,来获得相关文件的邮件。
你可以通过以下步骤下载代码文件:
1)使用你的e-mail地址和密码在Packt网站上登录或注册;
2)将鼠标指针悬停在顶部的“SUPPORT”选项卡上;
3)点击“Code Downloads & Errata”;
4)在搜索框中输入图书的名称;
5)选择你要下载代码文件的图书;
6)从下拉菜单中选择你的购书途径;
7)点击“Code Download”下载。
文件下载后,请确保使用以下最新版本的文件解压缩软件:
WinRAR / 7-Zip (Windows)
Zipeg / iZip / UnRarX (Mac)
7-Zip / PeaZip (Linux)
本书示例代码包同样可以从GitHub上下载,网址是:https://github.com/PacktPublishing/PostgreSQL-9.6-High-Performance。
性能一直都是数据库用户关注的最核心问题,本书着眼于提高PostgreSQL系统的性能,全面介绍了在硬件设置、参数配置、查询优化等多个方面改善PostgreSQL性能的方法和技巧。不论是DBA还是开发人员都能从本书中有所收获和帮助。
《PostgreSQL数据库内核分析》作者,CCF数据库专委会副主任,武汉大学教授
彭智勇
7年过去了,终于盼来了最新版本的《PostgreSQL 9.6 High Performance》!新版本作者阵容更加强大,除了原作者Gregory Smith之外,又增加了一位重量级人物Ibrar Ahmed,两位大师级作者从性能的视角对PostgreSQL及其运行的环境进行了全面而深入的剖析,阅读此书,不仅可以了解PostgreSQL自身的架构以及影响性能的因素,而且可以学到计算机硬件知识,如CPU、内存、磁盘等对PostgreSQL性能的影响,以及如何对性能进行基准评测,从而形成完整的性能优化方法论。相信通过阅读此书,大家定会获益良多!也会更加喜欢PostgreSQL!
平安科技数据库技术部总监
汪洋
数据库性能调优从来都不是一个简单的话题。本书从操作系统到数据库实现的多个层面,讲解了PostgreSQL数据库进行常规性能调优的各个场景。无论是对从其他数据库转战PostgreSQL的DBA,还是使用过PostgreSQL一段时间的DBA,本书都是一本不可多得的参考资料。你既可以使用它解决线上系统的性能问题,也可以把它作为深入理解PostgreSQL性能相关的设计和实现的桥梁。
湖南红手指信息技术有限公司CTO,《PostgreSQL 9 Administration Cookbook》译者
黄坚
一本可以最大限度地发挥PostgreSQL性能的调校指南,推荐给所有想用好PostgreSQL的人,也推荐给高校信息化院系的同仁。
西安交通大学网络信息中心教师
李飞
计算机\数据库
性能一直都是数据库用户关注的最核心问题,本书着眼于提高PostgreSQL系统的性能,全面介绍了如何在硬件设置、参数配置、查询优化等多个方面改善PostgreSQL性能的方法和技巧,不管是DBA还是开发人员都能从本书中有所收获和帮助。
—— 彭智勇 《PostgreSQL数据库内核分析》作者,CCF数据库专委会副主任,武汉大学教授
7年过去了,终于盼来了最新版本的《PostgreSQL 9.6 High Performance》!新版本作者阵容更加强大,除了原作者Gregory Smith之外,又增加了一位重量级人物Ibrar Ahmed,两位大师级作者从性能的视角对PostgreSQL及其运行的环境进行了全面而深入的剖析。……相信通过阅读此书,大家定会获益良多,也会更加喜欢PostgreSQL!
—— 汪洋 平安科技数据库技术部总监
数据库性能调优从来都不是一个简单的话题。本书从操作系统到数据库实现的多个层面,讲解了PostgreSQL数据库进行常规性能调优的各个场景。无论对于从其他数据库转战PostgreSQL的DBA还是使用过PostgreSQL一段时间的DBA,它都是一本方不可多得的参考资料。你既可以使用它解决你线上系统的性能问题,也可以把它作为深入理解PostgreSQL性能相关的设计和实现的桥梁。
—— 黄坚 湖南红手指信息技术有限公司CTO,《PostgreSQL 9 Administration Cookbook》译者
一本可以最大限度发挥PostgreSQL性能的调教指南,推荐给所有想用好PostgreSQL的人,也推荐给高校信息化部门的同仁。
—— 李飞 西安交通大学网络信息中心教师
[美] 艾博拉·艾哈迈德(Ibrar Ahmed) 格利高里·史密斯(Gregory Smith) 著:
范翊 彭煜玮 唐成 等译:
《PostgreSQL 9.6 High Performance》的中文版出版在即,作为这部优秀作品的译者之一,我深感荣幸。在中文版的翻译过程中我们得到了很多朋友的帮助。本书中文版能够及时出版是国内众多PostgreSQL(可简称为PG)志愿者共同努力的成果,在此先向志愿者及出版社表示诚挚的谢意,有你们的付出与协助,PostgreSQL在中国一定能发展壮大,越来越好。
在国内,关于其他商业数据库的书籍应有尽有,从初级入门到深入提高,各个级别的工具书籍琳琅满目,而关于PostgreSQL的书籍,则是少之又少。专业书籍除了选择不多,内容要么太过浅显要么太过深入,PGer大都经历过无从选择的迷茫。本书则比较适中,将对PGer了解、学习PG起到非常重要的帮助作用。
PG从1996年开始流行,它的先天优势在于它具有和商业数据库一样的架构,但却是一个开源的项目,这使得它迅速地在开发人员之间流行起来。也正是由于它这种“自由”生长的状态,使得有关PG方面的专业资料都比较零散,且以英文资料为主。对于我们国内的开发人员来说,阅读并参透这些资料,无疑是一个不小的挑战。近年来,随着PG在国内的影响力加深,从事PG开发的公司也如雨后春笋般地逐渐增加,越来越多的开发运维人员迫切希望能有更多系统化的资料,帮助他们提高学习PG的效率。
2017年6月,中国开源软件推进联盟PostgreSQL协会成立,并将翻译英文文献及资料的工作列入重点率先启动,协会联系到《PostgreSQL 9.6 High Performance》的原作者Ibrar Ahmed及原书出版社,在获取双方的同意后,以协会为主导,启动了本书的翻译工作,期望通过这本书的翻译服务于更多的PG爱好者,及从事PG开发工作的广大工程师。
本书可以说是一本PG的百科全书,从各个版本的特点,到硬件的选择,甚至细致到具体每个参数的配置、取值范围,以及推荐的设置。本书由浅入深,包罗了PG的各个方面。同时作者理论结合实践,列举大量具体的实际操作演示,结果也有具体的输出,还有一些图表,可以使读者更清楚地了解某一个功能或者命令的实际运行情况。在本书的第17章,作者总结出了一些常见问题,基本都是使用PG的时候经常会遇到的。其中有些问题只有在实际的生产环境中才会凸显出严重性,作者根据自己的实践经验,为我们总结出这些问题,并提示出需要注意的地方。书中还有很多内容,尤其是一些参数的设置,作者根据自身经验给出一个经验值,这通常是需要我们在生产环境中测试很多遍才能得到的。当然,实际环境千差万别,我们要根据实际情况去判断使用。
通过翻译本书,译者对PG有了更深入的认识,也希望广大读者能够通过这个译本,重新认识PG,并从中汲取养分,转化到具体的生产实践中。本书的翻译从众邀专家、征集志愿者开始,历经多次审核、校正,最终呈现出这个版本,虽然每位参与者都付出了百分百的热情与专注,但是由于时间仓促,书中难免有一些翻译不当的地方,希望广大读者能够予以指正。同时,也期望越来越多的PG使用者和爱好者加入到翻译国外文献及资料的志愿活动中,愿PostgreSQL发展得越来越好!
——范翊
在翻译本书的过程中,译者也学到了很多,尤其是结合以往所学所想,很多以前比较模糊的问题都得到了澄清,让人有豁然开朗的感觉。在此,向每一位对PostgreSQL感兴趣的读者郑重推荐此书。
最后,感谢协助译者翻译第10章的邢艳女士,也感谢家人对我的支持和谅解,本书的翻译工作占用了大量本应该陪同她们的时间。由于译者水平有限,译文中难免出现疏漏,请读者海涵。
——彭煜玮
译者原本就是PostgreSQL的忠实用户,翻译的过程也是学习的过程,在本书的翻译过程中在PostgreSQL高性能方面受益良多。同时,也把本书献给所有PostgreSQL的使用者。
本书的翻译出版是团体协作的成果,在此感谢所有参与本书翻译出版的朋友们。另外,还要感谢我的家人,感谢你们对我翻译工作的大力支持和理解,并对一些翻译和行文问题提供了良好的建议。
——唐成
致谢
如果没有中国开源软件推进联盟PostgreSQL协会发起此次翻译项目,并将大家凝聚到一起,本书中文版是不会如此快速地问世的。我们首先要感谢PostgreSQL协会,更要感谢本书的全体翻译者和审校者,还有对翻译过程进行统筹管理的刘媛媛女士,以及对翻译任务进行监督调配的冯春晖女士。另外,我们还要特别感谢机械工业出版社华章公司的王春华和缪杰编辑,感谢你们深思熟虑的意见、对书籍编辑和完善持有的锐利眼光。
译文之中难免出现疏漏,欢迎读者朋友们提出宝贵建议,我们的联系邮箱是:[email protected]。
感谢所有关注本书以及热爱PostgreSQL技术的朋友们!
PostgreSQL是一个优秀的开源数据库产品,其稳定性和可靠性已被广泛证明,拥有活跃的开发者和用户社区,版本持续升级迭代,新的特性和功能不断引入。近几年在国内Postgre-
SQL也呈现出蓬勃发展之势,用户涵盖了互联网、金融、政府、运营商等各行各业,每年大象会(PostgreSQL中国用户大会)上都能看到新的使用者分享PostgreSQL在高负载复杂业务环境下运行的案例。
生产环境中,一旦数据库出现性能问题,用户和DBA都会承受非常大的压力,因此数据库优化是DBA的必备技能。本书主要讲述的就是如何对PostgreSQL数据库进行性能优化,希望读者是具备一定PostgreSQL基础的中高级PostgreSQL用户、开发者或数据库管理员。对于初学者而言,可以与PostgreSQL手册结合学习,从而能够对手册中的一些概念有更深入的理解。另外,书中有很多实用的例子,也可以帮助读者更好地学习。
目前,开源产品升级迭代普遍较快,这给专业书籍的编写出版带来了一定难度。往往一本书开始构思时,新版本刚刚发布,经过漫长的编写、校对后,下一个版本又发布了,这对“时效性”要求非常高,也给作者和出版社带来了很大的压力。既然开源产品是以社区的方式开发,集广大开发者之力,那么书籍是不是也可以用这种模式?本书的翻译就是在这样的思路下启动的。本书的译者既包含彭煜玮、唐成、黄坚等具备PostgreSQL书籍编篡经验的资深专家,也有周宝峰、范翊等具有海外工作经验的高级工程师,还有具有翻译组织经验的PostgreSQL官方文档翻译人员。此次翻译的所有参与者都非常热情和专业,大家为同一件事情而努力,共同保证了翻译工作按时高质量完成,可以说本书的翻译是群体智慧的结晶。
这次团队合作成功的价值远大于翻译这本书本身,通过这次探索,PostgreSQL协会有了一种新的凝聚模式,希望这种模式能进一步完善,让更多的人参与进来,让PostgreSQL相关书籍能更多更快地呈现给广大爱好者,“千人同心,则得千人之力”,为协会的蓬勃发展贡献力量。
赞誉
推荐序
译者序
译者简介
中文版序
关于作者
关于审校者
前言
第1章 PostgreSQL版本 1
1.1 PostgreSQL历代版本的性能 2
1.1.1 选择要部署的版本 3
1.1.2 升级到一个新的主版本 3
1.2 选择PostgreSQL还是其他数据库 4
1.3 PostgreSQL工具 5
1.3.1 PostgreSQL contrib 5
1.3.2 pgFoundry 8
1.3.3 其他PostgreSQL相关软件 8
1.4 PostgreSQL应用程序的扩展生命周期 8
1.5 在实践中做性能优化 9
1.6 小结 10
第2章 数据库硬件 11
2.1 平衡硬件支出 11
2.1.1 CPU 11
2.1.2 内存 13
2.1.3 磁盘 13
2.1.4 磁盘控制器 17
2.2 可靠的控制器及磁盘安装 21
2.2.1 驱动器可靠性研究 21
2.2.2 回写缓存 22
2.2.3 直写式缓存的性能影响 25
2.3 小结 25
第3章 数据库硬件的基准评测 27
3.1 CPU和内存基准评测 27
3.1.1 Memtest86+ 28
3.1.2 STREAM内存测试 28
3.1.3 CPU基准评测 29
3.1.4 内存及处理器速度慢的根源 31
3.2 物理磁盘的性能 32
3.2.1 随机存取和IOPS 32
3.2.2 顺序存取和ZCAV 33
3.2.3 提交率 34
3.3 硬盘基准评测工具 34
3.3.1 使用HD Tune进行硬盘基准评测 35
3.3.2 磁盘顺序读写吞吐量 38
3.3.3 Bonnie++ 38
3.3.4 sysbench 42
3.3.5 寻道速率 43
3.3.6 复杂磁盘基准评测 45
3.4 样品磁盘测试结果 45
3.5 小结 48
第4章 磁盘设置 50
4.1 文件系统最大值 50
4.2 文件系统的崩溃恢复 51
4.3 Linux文件系统 52
4.3.1 ext2 52
4.3.2 ext3 53
4.3.3 ext4 54
4.3.4 XFS 55
4.3.5 其他Linux文件系统 56
4.3.6 写入屏障 56
4.3.7 常规Linux文件系统调优 58
4.4 Solaris与FreeBSD文件系统 62
4.4.1 Solaris UFS 62
4.4.2 FreeBSD UFS2 64
4.4.3 ZFS 64
4.4.4 FAT32 66
4.4.5 NTFS 66
4.5 PostgreSQL的磁盘布局 67
4.5.1 符号链接 67
4.5.2 表空间 67
4.5.3 数据库目录树 68
4.5.4 磁盘阵列、RAID和磁盘布局 69
4.6 小结 71
第5章 数据库缓存内存 72
5.1 postgresql.conf中的内存单位 72
5.2 增加UNIX共享内存参数以增大共享内存块 73
5.2.1 内核信号量 74
5.2.2 估算共享内存块的分配 75
5.2.3 检查数据库缓存 76
5.2.4 在数据库中安装pg_buffercache模块 76
5.2.5 数据库磁盘布局 77
5.2.6 在数据库中创建新块 80
5.2.7 写脏块到磁盘 80
5.3 崩溃恢复和缓冲区缓存 81
5.3.1 检查点处理基础 81
5.3.2 预写日志和恢复处理 81
5.3.3 检查点的时间选择 82
5.3.4 数据库块的生命周期 84
5.4 数据库缓存与操作系统缓存对比 85
5.4.1 双重缓存数据 85
5.4.2 检查点开销 86
5.4.3 起始大小指导 86
5.5 分析缓存内容 87
5.5.1 检查缓冲区缓存查询 88
5.5.2 使用缓冲区缓存检查来调整反馈 91
5.6 小结 92
第6章 服务器配置调优 93
6.1 与实时配置交互 93
6.1.1 默认值和重置值 94
6.1.2 允许更改的上下文信息 94
6.1.3 重新加载配置文件 95
6.1.4 数据库连接 97
6.1.5 共享内存 98
6.1.6 日志记录 98
6.1.7 Vacuuming和统计 100
6.1.8 检查点 101
6.1.9 PITR和WAL复制 103
6.1.10 调整以防患于未然 106
6.2 小结 109
第7章 日常维护 110
7.1 事务可见性与多版本并发控制 110
7.1.1 可见性的内部计算 111
7.1.2 更新 111
7.1.3 行锁的冲突 113
7.1.4 删除操作 114
7.1.5 MVCC的优点 115
7.1.6 MVCC的缺点 115
7.1.7 事务ID重叠 116
7.2 vacuum 117
7.2.1 vacuum实现 117
7.2.2 基于开销的vacuum 119
7.2.3 autovacuum 120
7.2.4 vacuum和autovacuum的常见问题 123
7.3 自动分析 126
7.4 索引膨胀 127
7.4.1 测定索引膨胀 127
7.4.2 修复索引膨胀 128
7.5 转储和恢复 129
7.6 清空数据库/表 129
7.7 CLUSTER命令 129
7.8 重建索引 130
7.9 详细数据和索引页的监控 131
7.10 监控查询日志 131
7.10.1 基本的PostgreSQL日志设置 131
7.10.2 对棘手的查询进行日志记录 134
7.10.3 日志文件分析 136
7.11 小结 140
第8章 数据库基准评测 141
8.1 pgbench默认测试 141
8.1.1 表的定义 141
8.1.2 规模检测 143
8.1.3 查询脚本定义 143
8.1.4 为pgbench配置数据库服务器 145
8.2 使用pgbench-tools图形化输出结果 147
8.3 pgbench测试结果样例 148
8.3.1 只读测试 148
8.3.2 类TPC-B测试(读、写) 149
8.3.3 延迟分析 150
8.4 导致不良结果以及变化的缘由 152
8.4.1 PostgreSQL开发人员模式 153
8.4.2 worker线程和pgbench程序的限制 154
8.5 自定义pgbench测试 154
8.6 TPC基准评测 155
8.7 小结 156
第9章 数据库索引 157
9.1 索引例子详解 158
9.1.1 测量查询的磁盘和索引块统计信息 158
9.1.2 运行例子 159
9.1.3 例子数据设置 159
9.1.4 简单索引查找 160
9.1.5 全表扫描 161
9.1.6 索引创建 162
9.1.7 用低效的索引查找 163
9.1.8 联合索引 164
9.1.9 依靠索引聚簇 166
9.1.10 带有缓冲区计数的EXPLAIN 167
9.2 索引创建和维护 168
9.2.1 唯一索引 168
9.2.2 并发创建索引 169
9.2.3 对索引聚簇 169
9.2.4 重建索引 170
9.3 索引类型 170
9.3.1 B-tree 170
9.3.2 哈希 171
9.3.3 GIN 171
9.3.4 GiST 172
9.3.5 SP-GiST 172
9.3.6 BRIN 172
9.3.7 仅索引扫描 173
9.4 count(*) 174
9.5 可见性映射 175
9.6 高级索引使用 175
9.6.1 多列索引 175
9.6.2 索引用于排序 175
9.6.3 部分索引 176
9.6.4 基于表达式的索引 176
9.6.5 索引用于全文搜索 176
9.7 小结 177
第10章 查询优化 178
10.1 样例数据集 178
10.1.1 Pagila 179
10.1.2 Dell Store 2 179
10.2 EXPLAIN基础 180
10.2.1 计时开销 181
10.2.2 冷热缓存行为 181
10.3 执行计划节点结构 183
10.3.1 基本代价计算 184
10.3.2 可视化解释 185
10.3.3 详细输出 186
10.3.4 机器可读的解释输出 186
10.3.5 规划分析工具 188
10.4 组装行集合 188
10.4.1 元组ID 188
10.4.2 顺序扫描 189
10.4.3 索引扫描 189
10.4.4 仅索引扫描 190
10.4.5 位图堆扫描和索引扫描 190
10.5 处理节点 191
10.5.1 排序 191
10.5.2 Limit 192
10.5.3 聚集 193
10.5.4 HashAggregate 194
10.5.5 唯一 194
10.5.6 Result 195
10.5.7 Append 195
10.5.8 Group 196
10.5.9 子查询扫描和子计划 197
10.5.10 集合操作 198
10.5.11 物化 199
10.6 CTE扫描 199
10.7 copy命令 199
10.7.1 COPY TO 200
10.7.2 COPY FROM 200
10.7.3 COPY FREEZE 200
10.8 连接 201
10.8.1 嵌套循环 201
10.8.2 归并连接 203
10.8.3 哈希连接 204
10.8.4 连接顺序 205
10.9 收集统计信息 207
10.9.1 查看和使用统计信息 207
10.9.2 统计信息目标 210
10.9.3 难以估算的部分 211
10.10 其他查询规划参数 211
10.10.1 effective_cache_size 212
10.10.2 work_mem 212
10.10.3 constraint_exclusion 213
10.10.4 cursor_tuple_fraction 213
10.11 执行其他语句类型 214
10.12 改进查询 214
10.12.1 优化完全缓存的数据集 214
10.12.2 查询等价测试 215
10.12.3 禁用优化器特性 215
10.12.4 优化器缺陷的解决方案 218
10.12.5 用OFFSET避免计划重构 219
10.12.6 外部故障点 220
10.13 SQL的限制 221
10.13.1 在SQL中对数据行进行编号 221
10.13.2 使用窗口函数编号 222
10.13.3 使用窗口函数进行累计 222
10.14 小结 223
第11章 数据库活动和统计信息 224
11.1 统计信息视图 224
11.2 累积视图和实时视图 226
11.3 表统计信息 227
11.4 索引统计信息 230
11.5 数据库级别的汇总 231
11.6 连接与行为 232
11.7 锁 232
11.7.1 虚拟事务 233
11.7.2 解码锁信息 234
11.7.3 表级锁的模式 236
11.7.4 事务锁等待 236
11.7.5 表的锁等待 237
11.7.6 记录锁信息 238
11.7.7 保存pg_stat_bgwriter快照 242
11.7.8 通过后台写入进程的统计信息进行调优 243
11.8 小结 245
第12章 监控和趋势预测 247
12.1 UNIX监控工具 247
12.1.1 例子设置 247
12.1.2 vmstat 248
12.1.3 iostat 250
12.1.4 top 257
12.1.5 SysStat和sar 258
12.2 Windows监控工具 260
12.2.1 任务管理器 260
12.2.2 Windows系统监控器 261
12.3 趋势分析软件 262
12.3.1 监控和趋势分析软件类型 263
12.3.2 Nagios 264
12.3.3 Cacti 265
12.3.4 Munin 265
12.3.5 其他趋势分析软件包 266
12.4 小结 268
第13章 连接池和缓存 269
13.1 连接池技术 269
13.1.1 连接池中的连接数 270
13.1.2 pgpool-II 271
13.1.3 连接池 271
13.1.4 复制 271
13.1.5 看门狗 271
13.1.6 故障切换 272
13.1.7 负载均衡 272
13.1.8 pgBouncer 273
13.1.9 memcached是什么 274
13.1.10 pgmemcache 275
13.2 小结 275
第14章 扩展复制 277
14.1 热备份 277
14.1.1 专用术语 278
14.1.2 设置WAL文件传送 279
14.1.3 流复制 279
14.1.4 级联复制 279
14.1.5 同步复制 279
14.1.6 热备份调优 280
14.2 复制队列管理器 281
14.2.1 Slony 281
14.2.2 Londiste 282
14.2.3 使用复制队列软件进行读取扩展 282
14.2.4 特殊的应用程序需求 282
14.2.5 Bucardo 283
14.2.6 pglogical 283
14.2.7 xDB 283
14.2.8 pgpool-II 283
14.3 其他有趣的复制相关的项目 284
14.4 复制方案对比 285
14.5 小结 285
第15章 分区数据 286
15.1 表继承 286
15.2 dellstore2数据库 287
15.3 PostgreSQL中的分区技术 288
15.4 范围分区 288
15.5 确定要进行分区的关键字段 289
15.6 调整分区大小 290
15.7 重定向INSERT语句至分区 290
15.7.1 动态的触发器函数 291
15.7.2 分区规则 292
15.8 空分区的查询规则 293
15.9 修改日期的UPDATE触发器 293
15.10 实时迁移分区表 294
15.11 分区查询 296
15.12 创建新的分区 297
15.12.1 定期创建分区 297
15.12.2 动态创建分区 297
15.13 分区的优势 298
15.14 分区中的常见错误 298
15.15 使用PL/Proxy水平分区 299
15.15.1 哈希生成 300
15.15.2 使用PL/Proxy扩展 301
15.15.3 使用GridSQL扩展 302
15.16 小结 302
第16章 数据库性能分析 304
16.1 使用gprof进行性能分析 304
16.2 使用OProf?ile进行性能分析 305
16.3 使用Valgrind进行调试 306
16.4 Visual Studio 306
16.5 使用DTrace进行性能分析 307
16.5.1 FreeBSD中的DTrace 307
16.5.2 Linux中SystemTap的DTrace仿真 307
16.6 小结 308
第17章 避免常见问题 309
17.1 批量加载 309
17.1.1 加载方式 309
17.1.2 批量加载调优 310
17.1.3 省略预写式日志加速 311
17.1.4 重建索引和添加约束 312
17.1.5 并行恢复 312
17.1.6 加载后清理 313
17.2 常见性能问题 313
17.2.1 计算行数 313
17.2.2 不明写入 314
17.2.3 慢函数和预处理语句执行 315
17.2.4 PL/pgSQL基准评测 315
17.2.5 高外键开销 316
17.2.6 触发内存使用 317
17.2.7 过重的统计收集器开销 317
17.2.8 物化视图 318
17.3 小结 318
第18章 发行版本性能特征 319
18.1 积极升级PostgreSQL版本 319
18.2 版本8.1中的性能特征 320
18.3 版本8.2中的性能特征 320
18.4 版本8.3中的性能特征 321
18.5 版本8.4中的性能特征 322
18.6 版本9.0中的性能特征 324
18.6.1 复制 324
18.6.2 查询和EXPLAIN 324
18.6.3 数据库开发 325
18.6.4 设置和监控 326
18.7 版本9.1中的性能特征 328
18.8 版本9.2中的性能特征 328
18.9 版本9.3中的性能特征 329
18.10 版本9.4中的性能特征 329
18.11 版本9.5中的性能特征 330
18.12 版本9.6中的性能特征 330
18.13 小结 331