PostgreSQL中国社区成员作品,从基础的语法到工程级应用、性能调优
-D1篇 准备
--D1章 初识PostgreSQL /2
1.1 PostgreSQL的起源 /2
1.2 PostgreSQL简介 /3
∣1.2.1 基本概念 /3
∣1.2.2 存储体系结构 /4
∣1.2.3 进程体系架构 /6
1.3 PostgreSQL 10版本的新特性 /6
1.4 小结 /7
-
-D2章 安装和启动PostgreSQL /8
2.1 安装PostgreSQL /8
∣2.1.1 在Windows中安装PostgreSQL /8
∣2.1.2 在Linux中安装PostgreSQL /12
∣2.1.3 源码安装PostgreSQL /14
2.2 初始化数据库 /17
2.3 数据库的基本配置 /18
∣2.3.1 配置数据库监听IP和端口 /18
∣2.3.2 配置数据库错误日志 /18
2.4 启动、停止、查看数据库 /18
∣2.4.1 启动数据库 /18
∣2.4.2 停止数据库 /19
∣2.4.3 查看数据库状态 /19
2.5 小结 /19
-
------------------D2篇 入门
-
D3章 创建数据库和表 /21
3.1 认识SQL语言 /21
∣3.1.1 SQL语句类型 /21
∣3.1.2 SQL数据类型 /21
3.2 使用交互式终端psql /22
∣3.2.1 连接数据库 /22
∣3.2.2 常用命令 /23
∣3.2.3 使用技巧 /26
3.3 表空间的创建、修改和删除 /27
∣3.3.1 实例1:创建表空间 /27
∣3.3.2 实例2:修改表空间 /29
∣3.3.3 实例3:删除表空间 /29
3.4 数据库的创建、修改和删除 /30
∣3.4.1 实例4:创建数据库 /30
∣3.4.2 实例5:修改数据库 /31
∣3.4.3 实例6:删除数据库 /32
3.5 创建数据表 /32
∣3.5.1 创建表的语法格式 /32
∣3.5.2 使用CHECK约束 /35
∣3.5.3 使用非空约束 /36
∣3.5.4 使用W一性约束 /36
∣3.5.5 使用主键约束 /37
∣3.5.6 使用默认约束 /38
∣3.5.7 使用外键约束 /38
∣3.5.8 实例7:设置表的属性值自动增加 /40
∣3.5.9 实例8:查看表结构 /41
3.6 修改数据表 /42
∣3.6.1 实例9:修改表名 /42
∣3.6.2 实例10:修改字段名 /43
∣3.6.3 实例11:添加字段 /43
∣3.6.4 实例12:删除字段 /44
∣3.6.5 实例13:删除表的外键约束 /44
3.7 删除数据表 /46
∣3.7.1 实例14:删除没有被关联的表 /46
∣3.7.2 实例15:删除被其他表关联的主表 /46
3.8 数据的插入、修改和删除 /47
∣3.8.1 实例16:向表中插入数据 /47
∣3.8.2 实例17:修改表中的数据 /48
∣3.8.3 实例18:删除表中的数据 /49
3.9 数据的简单查询 /50
∣3.9.1 实例19:创建Z简单的单表查询 /50
∣3.9.2 实例20:创建带过滤条件的查询 /50
3.10 小结 /51
-
D4章 数据类型及其运算符 /52
4.1 数值类型 /52
∣4.1.1 整数类型 /52
∣4.1.2 任意精度数字类型 /53
∣4.1.3 浮点类型 /53
∣4.1.4 序列类型 /54
∣4.1.5 货币类型 /55
∣4.1.6 实例21:使用数学运算符 /55
4.2 字符串类型 /56
∣4.2.1 字符串类型分类 /57
∣4.2.2 使用连接运算符 /57
∣4.2.3 使用模式匹配运算符 /58
4.3 二进制数据类型 /60
∣4.3.1 二进制数据类型简介 /60
∣4.3.2 二进制数据的十六进制格式 /61
4.3.3 二进制数据的转义格式 /61
4.4 日期类型和时间类型 /61
∣4.4.1 日期类型和时间类型分类 /61
∣4.4.2 日期类型和时间类型输入格式 /62
∣4.4.3 日期类型和时间类型输出格式 /64
∣4.4.4 时区 /64
∣4.4.5 使用日期类型和时间类型运算符 /65
4.5 布尔类型 /66
∣4.5.1 布尔类型简介 /66
∣4.5.2 布尔类型运算符 /66
4.6 位串类型 /68
∣4.6.1 位串类型简介 /68
∣4.6.2 实例22:使用位串类型运算符 /68
4.7 枚举类型 /69
∣4.7.1 声明枚举类型 /69
∣4.7.2 排序 /69
∣4.7.3 注意枚举类型安全性 /70
4.8 几何类型 /71
∣4.8.1 点(point) /71
∣4.8.2 线(line) /72
∣4.8.3 线段(lseg) /72
∣4.8.4 矩形(box) /73
∣4.8.5 路径(path) /74
∣4.8.6 多边形(polygon) /75
∣4.8.7 圆(circle) /75
∣4.8.8 实例23:使用几何类型运算符 /76
4.9 JSON数据类型 /77
∣4.9.1 JSON数据类型简介 /77
∣4.9.2 JSON数据类型的输入/输出语法 /78
∣4.9.3 实例24:使用json运算符 /79
∣4.9.4 实例25:使用jsonb运算符 /79
4.10 范围类型 /80
∣4.10.1 内建范围类型 /80
∣4.10.2 范围类型的边界 /81
∣4.10.3 范围值的输入 /81
∣4.10.4 使用范围类型运算符 /82
∣4.10.5 实例26:定义自己的范围类型 /83
4.11 数组类型 /83
∣4.11.1 定义数组类型 /84
∣4.11.2 输入数组 /84
∣4.11.3 访问数组 /86
∣4.11.4 修改数组 /87
∣4.11.5 查找数组中的内容 /88
∣4.11.6 数组运算符 /89
4.12 小结 /89
-
D5章 函数 /90
5.1 数学函数 /90
∣5.1.1 认识数学函数 /90
∣5.1.2 实例27:使用数学函数对小数取整 /93
5.2 字符串函数 /94
∣5.2.1 认识字符串函数 /95
∣5.2.2 认识二进制字符串函数 /99
∣5.2.3 实例28:使用format()函数格式化输出 /101
5.3 数据类型格式化函数 /103
5.4 序列函数 /104
∣5.4.1 认识序列函数 /104
∣5.4.2 实例29:创建及使用序列函数 /104
5.5 日期函数和时间函数 /107
∣5.5.1 认识日期函数和时间函数 /107
∣5.5.2 实例30:使用AT TIME ZONE进行时区转换 /110
∣5.5.3 实例31:获取D前的日期和时间 /111
∣5.5.4 实例32:设置延时执行 /112
5.6 位串函数 /113
∣5.6.1 认识位串函数 /113
∣5.6.2 实例33:使用bit()函数转换整数和位串 /113
5.7 枚举函数 /114
∣5.7.1 认识枚举函数 /114
∣5.7.2 实例34:使用枚举函数获取枚举类型中的值 /114
5.8 几何函数 /115
∣5.8.1 认识几何函数 /115
∣5.8.2 实例35:使用area()函数计算几何类型的面积 /117
5.9 JSON函数 /117
∣5.9.1 JSON创建函数 /117
∣5.9.2 JSON处理函数 /118
∣5.9.3 实例36:使用to_json()函数将字符串转换成JSON格式 /122
∣5.9.4 实例37:使用json_array_length()函数统计JSON数据类型中的元素个数 /122
5.10 范围函数 /123
∣5.10.1 认识范围函数 /123
∣5.10.2 实例38:用range_merge()函数获取一个包含给定范围的Z小范围 /123
∣5.10.3 实例39:用upper_inc()函数判断上界是否被包含在范围内 /123
5.11 数组函数 /124
∣5.11.1 认识数组函数 /124
∣5.11.2 实例40:用array_position()函数在数组中检索数据 /125
∣5.11.3 实例41:用array_to_string函数将数组转为字符串 /126
5.12 其他函数 /126
∣5.12.1 聚合函数 /126
∣5.12.2 集合返回函数 /131
∣5.12.3 系统信息函数 /131
∣5.12.4 系统管理函数 /133
5.13 小结 /134
-
D6章 查询和修改数据 /135
6.1 SELECT语法 /135
6.2 单表查询 /136
∣6.2.1 实例42:简单查询 /136
∣6.2.2 实例43:等值查询 /137
∣6.2.3 实例44:范围查询 /137
∣6.2.4 实例45:去重 /138
∣6.2.5 实例46:排序 /140
∣6.2.6 实例47:分组 /140
∣6.2.7 实例48:分页 /141
6.3 多表查询 /142
∣6.3.1 实例49:内连接 /143
∣6.3.2 实例50:外连接 /144
∣6.3.3 实例51:交叉连接 /146
∣6.3.4 实例52:多表关联复合查询 /146
6.4 子查询 /147
∣6.4.1 实例53:IN/DT IN 子查询 /147
∣6.4.2 实例54:EXISTS/DT EXISTS子查询 /148
∣6.4.3 实例55:ANY/SOME/ALL子查询 /149
6.5 模糊匹配查询 /150
∣6.5.1 实例56:LIKE查询 /150
∣6.5.2 实例57:SIMILAR TO查询 /152
6.6 查询运算 /152
∣6.6.1 实例58:聚集运算 /152
∣6.6.2 实例59:分组运算 /154
∣6.6.3 实例60:表达式运算 /156
∣6.6.4 实例61:递归查询 /157
6.7 窗口函数 /158
6.8 GJ操作 /162
∣6.8.1 实例62:归并数据 /162
∣6.8.2 实例63:批量插入 /164
∣6.8.3 实例64:批量更新 /165
∣6.8.4 实例65:关联更新 /166
∣6.8.5 实例66:批量删除 /166
∣6.8.6 实例67:关联删除 /166
∣6.8.7 实例68:移动数据到历史表 /167
∣6.8.8 实例69:清空表 /167
6.9 小结 /168
-
-----------------D3篇 进阶
-
D7章 索引 /170
7.1 索引简介 /170
∣7.1.1 索引的含义和作用 /170
∣7.1.2 索引的分类 /171
∣7.1.3 索引的设计原则 /172
7.2 索引操作 /172
∣7.2.1 创建索引 /172
∣7.2.2 修改索引 /174
∣7.2.3 删除索引 /175
7.3 常用索引方法 /176
∣7.3.1 多列索引 /176
∣7.3.2 组合索引 /177
∣7.3.3 W一索引 /177
∣7.3.4 表达式索引 /178
∣7.3.5 部分索引 /178
∣7.3.6 索引与排序 /180
7.4 索引类型 /180
∣7.4.1 B-tree索引 /180
∣7.4.2 Hash索引 /181
∣7.4.3 GiST索引 /182
∣7.4.4 SP-GiST索引 /184
∣7.4.5 GIN索引 /185
∣7.4.6 BRIN索引 /186
7.5 索引使用案例 /187
∣7.5.1 实例70:使用GiST索引提升RANGE类型数据的查询性能 /187
∣7.5.2 实例71:使用SP-GiST索引快速查找几何空间数据 /189
∣7.5.3 实例72:使用GIN索引快速查找JSON数据 /190
∣7.5.4 实例73:使用BRIN索引快速检索时间类型数据 /192
7.6 小结 /194
-
D8章 视图 /195
8.1 为什么使用视图 /195
8.2 普通视图 /195
∣8.2.1 创建视图 /196
∣8.2.2 使用视图 /198
8.3 物化视图 /201
∣8.3.1 物化视图和普通视图的区别 /201
∣8.3.2 创建和刷新物化视图 /201
∣8.3.3 实例74:使用物化视图优化查询性能 /203
8.4 小结 /205
-
D9章 触发器 /206
9.1 常规触发器 /206
∣9.1.1 了解常规触发器 /206
∣9.1.2 实例75:创建触发器 /208
∣9.1.3 实例76:修改触发器 /211
∣9.1.4 实例77:删除触发器 /212
∣9.1.5 实例78:注意数据变更的可见性 /213
9.2 事件触发器 /214
∣9.2.1 事件触发器支持的事件 /214
∣9.2.2 实例79:创建一个具有数据库审计功能的事件触发器 /215
9.3 小结 /217
-D10章 表继承和表分区 /218
10.1 表继承 /218
∣10.1.1 表继承的使用场景 /218
∣10.1.2 实例80:创建表继承 /219
∣10.1.3 实例81:使用表继承 /221
∣10.1.4 确定表继承数据来源 /228
∣10.1.5 表继承的局限性和注意事项 /230
10.2 表分区 /231
∣10.2.1 表分区的使用场景 /231
∣10.2.2 表分区的实现方式 /232
∣10.2.3 实例82:创建表分区 /233
∣10.2.4 实例83:使用表分区 /235
∣10.2.5 实例84:维护表分区 /237
∣10.2.6 使用约束排除提升查询性能 /240
∣10.2.7 表分区注意事项 /243
10.3 小结 /243
-
D11章 管理用户权限和模式 /244
11.1 了解用户、角色和权限 /244
11.2 管理用户、角色和权限 /245
∣11.2.1 实例85:创建用户 /245
∣11.2.2 实例86:删除用户 /246
∣11.2.3 实例87:创建角色 /247
∣11.2.4 实例88:删除角色 /249
∣11.2.5 实例89:给角色授予权限 /250
∣11.2.6 实例90:使用系统默认角色 /251
11.3 管理数据库模式 /252
∣11.3.1 实例91:使用数据库模式 /252
∣11.3.2 实例92:设置模式的搜索路径 /253
∣11.3.3 管理数据库模式权限 /254
∣11.3.4 pg_catalog模式 /254
11.4 小结 /255
-
D12章 配置和管理数据库服务器 /256
12.1 使用不同方式进行参数设置 /256
∣12.1.1 了解参数格式 /256
∣12.1.2 实例93:通过配置文件设置参数 /257
∣12.1.3 实例94:通过SQL命令设置参数 /259
∣12.1.4 实例95:通过shell命令设置参数 /261
∣12.1.5 实例96:使用include方式管理配置文件 /262
12.2 配置postgresql.conf文件的参数 /262
∣12.2.1 连接和安全认证参数 /263
∣12.2.2 缓存和存储参数 /264
∣12.2.3 WAL日志参数 /266
∣12.2.4 错误日志参数 /267
∣12.2.5 AUTOVACUUM参数 /274
12.3 配置p_hba.conf文件的参数 /274
∣12.3.1 了解不同客户端认证方法 /275
∣12.3.2 实例97:使用trust配置客户端认证 /276
∣12.3.3 实例98:使用md5配置客户端认证 /277
∣12.3.4 实例99:使用cert配置客户端认证 /277
12.4 服务端常用工具 /277
∣12.4.1 实例100:使用initdb初始化数据库 /277
∣12.4.2 实例101:使用pg_ctl管理数据库服务 /278
∣12.4.3 实例102:使用pg_controldata查看控制信息 /280
∣12.4.4 实例103:使用pg_rewind同步数据目录 /282
12.5 小结 /283
-
D13章 备份和恢复数据 /284
13.1 逻辑备份和恢复 /284
∣13.1.1 实例104:使用pg_dump工具备份单库单表数据 /284
∣13.1.2 实例105:使用pg_restore工具恢复数据 /287
∣13.1.3 实例106:使用pg_dumpall工具备份所有库表数据 /289
∣13.1.4 实例107:使用psql工具恢复pg_dumpall备份的数据 /289
13.2 物理备份和恢复 /289
∣13.2.1 实例108:使用pg_basebackup工具热备份 /290
∣13.2.2 实例109:使用基础备份恢复数据 /292
13.3 增量备份和恢复 /293
∣13.3.1 实例110:使用归档日志进行增量备份 /293
∣13.3.2 实例111:将数据库状态恢复到指定时间点 /294
∣13.3.3 实例112:恢复到指定事务 /297
13.4 -D三方备份恢复工具 /299
∣13.4.1 认识pg_rman工具 /299
∣13.4.2 实例113:使用pg_rman工具备份数据 /301
13.5 小结 /304
-
-----------------D4篇 高阶
-
D14章 事务 /306
14.1 事务的基本特性 /306
∣14.1.1 事务模型要解决的问题 /306
∣14.1.2 事务的四大特性 /307
∣14.1.3 实例114:设置合适的事务隔离级别 /308
14.2 理解事务的实现原理 /310
∣14.2.1 WAL机制 /310
∣14.2.2 MVCC机制 /311
∣14.2.3 Checkpoint机制 /314
∣14.2.4 Crash Recovery机制 /315
∣14.2.5 事务并发与锁机制 /316
14.3 使用事务 /319
∣14.3.1 理解事务语法 /319
∣14.3.2 实例115:使用ROLLBACK回滚事务 /320
∣14.3.3 实例116:使用COMMIT提交事务 /321
∣14.3.4 实例117:使用SAVEPOINT回滚部分事务 /321
14.4 小结 /323
-
D15章 优化SQL语句 /324
15.1 理解查询优化器的工作原理 /324
∣15.1.1 SQL语句执行过程 /324
∣15.1.2 了解查询树 /325
∣15.1.3 了解逻辑优化 /326
∣15.1.4 逻辑优化:对子查询进行优化 /326
∣15.1.5 逻辑优化:条件表达式优化及等价谓词重写优化 /327
∣15.1.6 逻辑优化:外连接优化 /328
∣15.1.7 了解物理优化 /329
∣15.1.8 代价估算 /332
15.2 查看并分析执行计划 /334
∣15.2.1 EXPLAIN命令介绍 /334
∣15.2.2 EXPLAIN输出解读 /336
∣15.2.3 实例118:使用EXPLAIN分析执行计划 /338
15.3 常见SQL语句优化 /343
∣15.3.1 实例119:使用索引避免表扫描 /343
∣15.3.2 实例120:子查询优化 /345
∣15.3.3 实例121:表连接优化 /347
∣15.3.4 实例122:使用UNION ALL代替UNION /349
∣15.3.5 实例123:避免使用“SELECT *” /350
∣15.3.6 实例124:为jsonb字段建立合适的索引 /351
15.4 小结 /352
-
D16章 优化数据库服务端性能 /353
16.1 了解数据库性能指标 /353
∣16.1.1 衡量数据库性能的指标 /353
∣16.1.2 影响数据库性能的硬件因素 /353
∣16.1.3 实例125:使用nmon工具监控Linux性能 /356
16.2 优化存储性能 /359
∣16.2.1 物理存储介质简介 /359
∣16.2.2 存储路径隔离原则 /361
16.3 优化数据库配置参数 /366
∣16.3.1 优化内存资源类参数 /366
∣16.3.2 优化脏页刷写类参数 /368
∣16.3.3 优化空间回收类参数 /369
∣16.3.4 优化WAL日志文件相关参数 /372
∣16.3.5 数据库性能视图 /376
16.4 小结 /383
-
D17章 PL/pgSQL服务端编程 /384
17.1 PL/pgSQL编程基础 /384
∣17.1.1 PL/pgSQL的结构 /384
∣17.1.2 PL/pgSQL的声明 /386
∣17.1.3 PL/pgSQL的表达式 /389
∣17.1.4 PL/pgSQL的基本语句 /389
∣17.1.5 PL/pgSQL的控制结构 /392
∣17.1.6 PL/pgSQL的游标 /399
∣17.1.7 PL/pgSQL的错误和消息 /401
∣17.1.8 PL/pgSQL的触发器函数 /402
17.2 PL/pgSQL 编程实战 /405
∣17.2.1 PL/pgSQL开发建议 /405
∣17.2.2 实例126:编写一个自定义用户函数 /407
∣17.2.3 实例127:从PL/SQL移植到PL/pgSQL /409
17.3 小结 /411
-
D18章 高可用方案 /412
18.1 如何实现高可用方案 /412
∣18.1.1 基本概念 /412
∣18.1.2 实现自动故障接管(Failover) /414
∣18.1.3 WAL归档与流复制 /415
∣18.1.4 防止WAL日志文件被过早删除 /418
∣18.1.5 巧用级联复制 /419
∣18.1.6 同步复制与读写分离 /420
18.2 实例128:基于Corosync+Pacemaker的方案 /424
∣18.2.1 初识Corosync和Pacemaker /424
∣18.2.2 Corosync和Pacemaker的安装 /426
18.2.3 基于Corosync+Pacemaker的高可用方案及实现 /430
18.3 实例129:基于Stolon的方案 /436
∣18.3.1 Stolon方案架构及特性 /436
∣18.3.2 Stolon方案安装配置及实例 /437
18.4 小结 /443