{"id":15187416,"url":"https://github.com/yansheng836/head-first-postgresql-code","last_synced_at":"2026-02-07T15:33:33.033Z","repository":{"id":101461621,"uuid":"539319052","full_name":"yansheng836/head-first-postgresql-code","owner":"yansheng836","description":"《深入浅出PostgreSQL》代码。","archived":false,"fork":false,"pushed_at":"2022-09-22T08:56:29.000Z","size":366,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-20T01:10:37.737Z","etag":null,"topics":["pgsql","posgtresql","souce-code"],"latest_commit_sha":null,"homepage":"https://book.douban.com/subject/35005283/","language":"PLpgSQL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yansheng836.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-09-21T05:25:22.000Z","updated_at":"2022-09-21T05:27:02.000Z","dependencies_parsed_at":null,"dependency_job_id":"9f57c098-6f09-4b83-9819-e7b61b16b417","html_url":"https://github.com/yansheng836/head-first-postgresql-code","commit_stats":{"total_commits":8,"total_committers":2,"mean_commits":4.0,"dds":0.125,"last_synced_commit":"ced38d4891fd3fb5079ab0394a12e2726f6278a5"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/yansheng836/head-first-postgresql-code","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansheng836%2Fhead-first-postgresql-code","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansheng836%2Fhead-first-postgresql-code/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansheng836%2Fhead-first-postgresql-code/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansheng836%2Fhead-first-postgresql-code/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yansheng836","download_url":"https://codeload.github.com/yansheng836/head-first-postgresql-code/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yansheng836%2Fhead-first-postgresql-code/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29198178,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-07T14:35:27.868Z","status":"ssl_error","status_checked_at":"2026-02-07T14:25:51.081Z","response_time":63,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pgsql","posgtresql","souce-code"],"created_at":"2024-09-27T18:21:31.136Z","updated_at":"2026-02-07T15:33:33.015Z","avatar_url":"https://github.com/yansheng836.png","language":"PLpgSQL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Head-First-PostgreSQL-Code\n\n《深入浅出PostgreSQL》代码。\n\n## 书籍相关信息\n\n\u003chttps://book.douban.com/subject/35005283/\u003e\n\n深入浅出PostgreSQL\n\n作者: 屠要峰\n\n出版社: 电子工业出版社\n\n页数: 464\n\n定价: 99元\n\n装帧: 平装-胶订\n\nISBN: 9787121369018\n\n豆瓣截图：\n\n![image-20220920092849865](assets/image-20220920092849865.png)\n\n注：以下内容复制自豆瓣读书。\n\n### 内容简介\n\n《深入浅出PostgreSQL》基于PostgreSQL 10版本，采用“理论+实践”的形式编写，通过大量的实例，详细讲解了PostgreSQL的各种SQL特性、参数配置、备份恢复、性能调优、服务端编程、高可用方案等。\n\n第1篇“准备”，包括初识PostgreSQL、安装和启动PostgreSQL；第2篇“入门”，包括创建数据库和表、数据类型及其运算符、函数、查询和修改数据；第3篇“进阶”，包括索引、视图、触发器、表继承和表分区、管理用户权限和模式、配置和管理数据库服务器、备份和恢复数据；第4篇“高阶”，包括事务、优化SQL语句、优化数据库服务端性能、PL/pgSQL服务端编程、高可用方案。\n\n《深入浅出PostgreSQL》结构清晰、内容翔实、案例丰富、通俗易懂、实用性强，适合对数据库（特别是PostgreSQL）感兴趣的读者自学参考。另外，本书也适合...\n\n### 作者简介\n\n屠要峰\n\n研究员、中兴通讯数据库技术专家委员会主任、研究院副院长、CCF信息存储委员会常委、中国开源软件联盟理事。拥有二十多年大型软件系统研发实践经验，主持过大数据、云计算、云存储及分布式数据库等多个大型分布式系统的研发。负责中兴通讯数据智能方向的研发及应用，获省级科技进步一等奖两次。主要研究方向为大数据、云计算、数据库及存储。\n\n陈河堆\n\n现任中兴通讯数据库平台首席专家，PostgreSQL中文社区核心组成员，拥有十几年数据库研发工作经验，曾参与公司自研高性能内存数据库、分布式数据库和分布式缓存等系统的设计和开发，近年来醉心于钻研开源数据库技术，热心推动PostgreSQL在中国地区的推广和应用，积极参与PostgreSQL中文社区系列活动。\n\n### 目录\n\n------------------第1篇 准备\n\n\n\n第1章 初识PostgreSQL 2\n\n1.1 PostgreSQL的起源 2\n\n1.2 PostgreSQL简介 3\n\n-1.2.1 基本概念 3\n\n-1.2.2 存储体系结构 4\n\n-1.2.3 进程体系架构 6\n\n1.3 PostgreSQL 10版本的新特性 6\n\n1.4 小结 7\n\n第2章 安装和启动PostgreSQL 8\n\n2.1 安装PostgreSQL 8\n\n-2.1.1 在Windows中安装PostgreSQL 8\n\n-2.1.2 在Linux中安装PostgreSQL 12\n\n-2.1.3 源码安装PostgreSQL 14\n\n2.2 初始化数据库 17\n\n2.3 数据库的基本配置 18\n\n-2.3.1 配置数据库监听IP和端口 18\n\n-2.3.2 配置数据库错误日志 18\n\n2.4 启动、停止、查看数据库 18\n\n-2.4.1 启动数据库 18\n\n-2.4.2 停止数据库 19\n\n-2.4.3 查看数据库状态 19\n\n2.5 小结 19\n\n\n\n------------------第2篇 入门\n\n\n\n第3章 创建数据库和表 21\n\n3.1 认识SQL语言 21\n\n-3.1.1 SQL语句类型 21\n\n-3.1.2 SQL数据类型 21\n\n3.2 使用交互式终端psql 22\n\n-3.2.1 连接数据库 22\n\n-3.2.2 常用命令 23\n\n-3.2.3 使用技巧 26\n\n3.3 表空间的创建、修改和删除 27\n\n-3.3.1 【实例1】创建表空间 27\n\n-3.3.2 【实例2】修改表空间 29\n\n-3.3.3 【实例3】删除表空间 29\n\n3.4 数据库的创建、修改和删除 30\n\n-3.4.1 【实例4】创建数据库 30\n\n-3.4.2 【实例5】修改数据库 31\n\n-3.4.3 【实例6】删除数据库 32\n\n3.5 创建数据表 32\n\n-3.5.1 创建表的语法格式 32\n\n-3.5.2 使用CHECK约束 35\n\n-3.5.3 使用非空约束 36\n\n-3.5.4 使用唯一性约束 36\n\n-3.5.5 使用主键约束 37\n\n-3.5.6 使用默认约束 38\n\n-3.5.7 使用外键约束 38\n\n-3.5.8 【实例7】设置表的属性值自动增加 40\n\n-3.5.9 【实例8】查看表结构 41\n\n3.6 修改数据表 42\n\n-3.6.1 【实例9】修改表名 42\n\n-3.6.2 【实例10】修改字段名 43\n\n-3.6.3 【实例11】添加字段 43\n\n-3.6.4 【实例12】删除字段 44\n\n-3.6.5 【实例13】删除表的外键约束 44\n\n3.7 删除数据表 46\n\n-3.7.1 【实例14】删除没有被关联的表 46\n\n-3.7.2 【实例15】删除被其他表关联的主表 46\n\n3.8 数据的插入、修改和删除 47\n\n-3.8.1 【实例16】向表中插入数据 47\n\n-3.8.2 【实例17】修改表中的数据 48\n\n-3.8.3 【实例18】删除表中的数据 49\n\n3.9 数据的简单查询 50\n\n-3.9.1 【实例19】创建最简单的单表查询 50\n\n-3.9.2 【实例20】创建带过滤条件的查询 50\n\n3.10 小结 51\n\n\n\n第4章 数据类型及其运算符 52\n\n4.1 数值类型 52\n\n-4.1.1 整数类型 52\n\n-4.1.2 任意精度数字类型 53\n\n-4.1.3 浮点类型 53\n\n-4.1.4 序列类型 54\n\n-4.1.5 货币类型 55\n\n-4.1.6 【实例21】使用数学运算符 55\n\n4.2 字符串类型 56\n\n-4.2.1 字符串类型分类 57\n\n-4.2.2 使用连接运算符 57\n\n-4.2.3 使用模式匹配运算符 58\n\n4.3 二进制数据类型 60\n\n-4.3.1 二进制数据类型简介 60\n\n-4.3.2 二进制数据的十六进制格式 61\n\n-4.3.3 二进制数据的转义格式 61\n\n4.4 日期类型和时间类型 61\n\n-4.4.1 日期类型和时间类型分类 61\n\n-4.4.2 日期类型和时间类型输入格式 62\n\n-4.4.3 日期类型和时间类型输出格式 64\n\n-4.4.4 时区 64\n\n-4.4.5 使用日期类型和时间类型运算符 65\n\n4.5 布尔类型 66\n\n-4.5.1 布尔类型简介 66\n\n-4.5.2 布尔类型运算符 66\n\n4.6 位串类型 68\n\n-4.6.1 位串类型简介 68\n\n-4.6.2 【实例22】使用位串类型运算符 68\n\n4.7 枚举类型 69\n\n-4.7.1 声明枚举类型 69\n\n-4.7.2 排序 69\n\n-4.7.3 注意枚举类型安全性 70\n\n4.8 几何类型 71\n\n-4.8.1 点（point） 71\n\n-4.8.2 线（line） 72\n\n-4.8.3 线段（lseg） 72\n\n-4.8.4 矩形（box） 73\n\n-4.8.5 路径（path） 74\n\n-4.8.6 多边形（polygon） 75\n\n-4.8.7 圆（circle） 75\n\n-4.8.8 【实例23】使用几何类型运算符 76\n\n4.9 JSON数据类型 77\n\n-4.9.1 JSON数据类型简介 77\n\n-4.9.2 JSON数据类型的输入/输出语法 78\n\n-4.9.3 【实例24】使用json运算符 79\n\n-4.9.4 【实例25】使用jsonb运算符 79\n\n4.10 范围类型 80\n\n-4.10.1 内建范围类型 80\n\n-4.10.2 范围类型的边界 81\n\n-4.10.3 范围值的输入 81\n\n-4.10.4 使用范围类型运算符 82\n\n-4.10.5 【实例26】定义自己的范围类型 83\n\n4.11 数组类型 83\n\n-4.11.1 定义数组类型 84\n\n-4.11.2 输入数组 84\n\n-4.11.3 访问数组 86\n\n-4.11.4 修改数组 87\n\n-4.11.5 查找数组中的内容 88\n\n-4.11.6 数组运算符 89\n\n4.12 小结 89\n\n第5章 函数 90\n\n5.1 数学函数 90\n\n-5.1.1 认识数学函数 90\n\n-5.1.2 【实例27】用数学函数对小数取整 93\n\n5.2 字符串函数 94\n\n-5.2.1 认识字符串函数 95\n\n-5.2.2 认识二进制字符串函数 99\n\n-5.2.3 【实例28】用format()函数格式化输出 101\n\n5.3 数据类型格式化函数 103\n\n5.4 序列函数 104\n\n-5.4.1 认识序列函数 104\n\n-5.4.2 【实例29】创建及使用序列函数 104\n\n5.5 日期函数和时间函数 107\n\n-5.5.1 认识日期函数和时间函数 107\n\n-5.5.2 【实例30】用AT TIME ZONE进行时区转换 110\n\n-5.5.3 【实例31】获取当前的日期和时间 111\n\n-5.5.4 【实例32】设置延时执行 112\n\n5.6 位串函数 113\n\n-5.6.1 认识位串函数 113\n\n-5.6.2 【实例33】用bit()函数转换整数和位串 113\n\n5.7 枚举函数 114\n\n-5.7.1 认识枚举函数 114\n\n-5.7.2 【实例34】用枚举函数获取枚举类型中的值 114\n\n5.8 几何函数 115\n\n-5.8.1 认识几何函数 115\n\n-5.8.2 【实例35】用area()函数计算几何类型的面积 117\n\n5.9 JSON函数 117\n\n-5.9.1 JSON创建函数 117\n\n-5.9.2 JSON处理函数 118\n\n-5.9.3 【实例36】用to_json()函数将字符串转换成JSON格式 122\n\n-5.9.4 【实例37】用json_array_length()函数统计JSON数据类型中的元素个数 122\n\n5.10 范围函数 123\n\n-5.10.1 认识范围函数 123\n\n-5.10.2 【实例38】用range_merge()函数获取一个包含给定范围的最小范围 123\n\n-5.10.3 【实例39】用upper_inc()函数判断上界是否被包含在范围内 123\n\n5.11 数组函数 124\n\n-5.11.1 认识数组函数 124\n\n-5.11.2 【实例40】用array_position()函数在数组中检索数据 125\n\n-5.11.3 【实例41】用array_to_string()函数将数组转为字符串 126\n\n5.12 其他函数 126\n\n-5.12.1 聚合函数 126\n\n-5.12.2 集合返回函数 131\n\n-5.12.3 系统信息函数 131\n\n-5.12.4 系统管理函数 133\n\n5.13 小结 134\n\n第6章 查询和修改数据 135\n\n6.1 SELECT语法 135\n\n6.2 单表查询 136\n\n-6.2.1 【实例42】简单查询 136\n\n-6.2.2 【实例43】等值查询 137\n\n-6.2.3 【实例44】范围查询 137\n\n-6.2.4 【实例45】去重 138\n\n-6.2.5 【实例46】排序 140\n\n-6.2.6 【实例47】分组 140\n\n-6.2.7 【实例48】分页 141\n\n6.3 多表查询 142\n\n-6.3.1 【实例49】内连接 143\n\n-6.3.2 【实例50】外连接 144\n\n-6.3.3 【实例51】交叉连接 146\n\n-6.3.4 【实例52】多表关联复合查询 146\n\n6.4 子查询 147\n\n-6.4.1 【实例53】IN/NOT IN 子查询 147\n\n-6.4.2 【实例54】EXISTS/NOT EXISTS子查询 148\n\n-6.4.3 【实例55】ANY/SOME/ALL子查询 149\n\n6.5 模糊匹配查询 150\n\n-6.5.1 【实例56】LIKE查询 150\n\n-6.5.2 【实例57】SIMILAR TO查询 152\n\n6.6 查询运算 152\n\n-6.6.1 【实例58】聚集运算 152\n\n-6.6.2 【实例59】分组运算 154\n\n-6.6.3 【实例60】表达式运算 156\n\n-6.6.4 【实例61】递归查询 157\n\n6.7 窗口函数 158\n\n6.8 高级操作 162\n\n-6.8.1 【实例62】归并数据 162\n\n-6.8.2 【实例63】批量插入 164\n\n-6.8.3 【实例64】批量更新 165\n\n-6.8.4 【实例65】关联更新 166\n\n-6.8.5 【实例66】批量删除 166\n\n-6.8.6 【实例67】关联删除 166\n\n-6.8.7 【实例68】移动数据到历史表 167\n\n-6.8.8 【实例69】清空表 167\n\n6.9 小结 168\n\n\n\n------------------第3篇 进阶\n\n\n\n第7章 索引 170\n\n7.1 索引简介 170\n\n-7.1.1 索引的含义和作用 170\n\n-7.1.2 索引的分类 171\n\n-7.1.3 索引的设计原则 172\n\n7.2 索引操作 172\n\n-7.2.1 创建索引 172\n\n-7.2.2 修改索引 174\n\n-7.2.3 删除索引 175\n\n7.3 常用索引方法 176\n\n-7.3.1 多列索引 176\n\n-7.3.2 组合索引 177\n\n-7.3.3 唯一索引 177\n\n-7.3.4 表达式索引 178\n\n-7.3.5 部分索引 178\n\n-7.3.6 索引与排序 180\n\n7.4 索引类型 180\n\n-7.4.1 B-tree索引 180\n\n-7.4.2 Hash索引 181\n\n-7.4.3 GiST索引 182\n\n-7.4.4 SP-GiST索引 184\n\n-7.4.5 GIN索引 185\n\n-7.4.6 BRIN索引 186\n\n7.5 索引使用案例 187\n\n-7.5.1 【实例70】用GiST索引提升RANGE类型数据的查询性能 187\n\n-7.5.2 【实例71】用SP-GiST索引快速查找几何空间数据 189\n\n-7.5.3 【实例72】用GIN索引快速查找JSON数据 190\n\n-7.5.4 【实例73】用BRIN索引快速检索时间类型数据 192\n\n7.6 小结 194\n\n\n\n第8章 视图 195\n\n8.1 为什么使用视图 195\n\n8.2 普通视图 195\n\n-8.2.1 创建视图 196\n\n-8.2.2 使用视图 198\n\n8.3 物化视图 201\n\n-8.3.1 物化视图和普通视图的区别 201\n\n-8.3.2 创建和刷新物化视图 201\n\n-8.3.3 【实例74】用物化视图优化查询性能 203\n\n8.4 小结 205\n\n\n\n第9章 触发器 206\n\n9.1 常规触发器 206\n\n-9.1.1 了解常规触发器 206\n\n-9.1.2 【实例75】创建触发器 208\n\n-9.1.3 【实例76】修改触发器 211\n\n-9.1.4 【实例77】删除触发器 212\n\n-9.1.5 【实例78】注意数据变更的可见性 213\n\n9.2 事件触发器 214\n\n-9.2.1 事件触发器支持的事件 214\n\n-9.2.2 【实例79】创建一个具有数据库审计功能的事件触发器 215\n\n9.3 小结 217\n\n第10章 表继承和表分区 218\n\n10.1 表继承 218\n\n-10.1.1 表继承的使用场景 218\n\n-10.1.2 【实例80】创建表继承 219\n\n-10.1.3 【实例81】使用表继承 221\n\n-10.1.4 确定表继承数据来源 228\n\n-10.1.5 表继承的局限性和注意事项 230\n\n10.2 表分区 231\n\n-10.2.1 表分区的使用场景 231\n\n-10.2.2 表分区的实现方式 232\n\n-10.2.3 【实例82】创建表分区 233\n\n-10.2.4 【实例83】使用表分区 235\n\n-10.2.5 【实例84】维护表分区 237\n\n-10.2.6 使用约束排除提升查询性能 240\n\n-10.2.7 表分区注意事项 243\n\n10.3 小结 243\n\n第11章 管理用户权限和模式 244\n\n11.1 了解用户、角色和权限 244\n\n11.2 管理用户、角色和权限 245\n\n-11.2.1 【实例85】创建用户 245\n\n-11.2.2 【实例86】删除用户 246\n\n-11.2.3 【实例87】创建角色 247\n\n-11.2.4 【实例88】删除角色 249\n\n-11.2.5 【实例89】给角色授予权限 250\n\n-11.2.6 【实例90】使用系统默认角色 251\n\n11.3 管理数据库模式 252\n\n-11.3.1 【实例91】使用数据库模式 252\n\n-11.3.2 【实例92】设置模式的搜索路径 253\n\n-11.3.3 管理数据库模式权限 254\n\n-11.3.4 pg_catalog模式 254\n\n11.4 小结 255\n\n第12章 配置和管理数据库服务器 256\n\n12.1 用不同方式进行参数设置 256\n\n-12.1.1 了解参数格式 256\n\n-12.1.2 【实例93】通过配置文件设置参数 257\n\n-12.1.3 【实例94】通过SQL命令设置参数 259\n\n-12.1.4 【实例95】通过shell命令设置参数 261\n\n-12.1.5 【实例96】用include方式管理配置文件 262\n\n12.2 配置postgresql.conf文件的参数 262\n\n-12.2.1 连接和安全认证参数 263\n\n-12.2.2 缓存和存储参数 264\n\n-12.2.3 WAL日志参数 266\n\n-12.2.4 错误日志参数 267\n\n-12.2.5 AUTOVACUUM参数 274\n\n12.3 配置pg_hba.conf文件的参数 274\n\n-12.3.1 了解不同客户端认证方法 275\n\n-12.3.2 【实例97】用trust配置客户端认证 276\n\n-12.3.3 【实例98】用md5配置客户端认证 277\n\n-12.3.4 【实例99】用cert配置客户端认证 277\n\n12.4 服务端常用工具 277\n\n-12.4.1 【实例100】用initdb初始化数据库 277\n\n-12.4.2 【实例101】用pg_ctl管理数据库服务 278\n\n-12.4.3 【实例102】用pg_controldata查看控制信息 280\n\n-12.4.4 【实例103】用pg_rewind同步数据目录 282\n\n12.5 小结 283\n\n第13章 备份和恢复数据 284\n\n13.1 逻辑备份和恢复 284\n\n-13.1.1 【实例104】用pg_dump工具备份单库单表数据 284\n\n-13.1.2 【实例105】用pg_restore工具恢复数据 287\n\n-13.1.3 【实例106】用pg_dumpall工具备份所有库表数据 289\n\n-13.1.4 【实例107】用psql工具恢复pg_dumpall备份的数据 289\n\n13.2 物理备份和恢复 289\n\n-13.2.1 【实例108】用pg_basebackup工具热备份 290\n\n-13.2.2 【实例109】用基础备份恢复数据 292\n\n13.3 增量备份和恢复 293\n\n-13.3.1 【实例110】用归档日志进行增量备份 293\n\n-13.3.2 【实例111】将数据库状态恢复到指定时间点 294\n\n-13.3.3 【实例112】恢复到指定事务 297\n\n13.4 第三方备份恢复工具 299\n\n-13.4.1 认识pg_rman工具 299\n\n-13.4.2 【实例113】用pg_rman工具备份数据 301\n\n13.5 小结 304\n\n\n\n------------------第4篇 高阶\n\n\n\n第14章 事务 306\n\n14.1 事务的基本特性 306\n\n-14.1.1 事务模型要解决的问题 306\n\n-14.1.2 事务的四大特性 307\n\n-14.1.3 【实例114】设置合适的事务隔离级别 308\n\n14.2 理解事务的实现原理 310\n\n-14.2.1 WAL机制 310\n\n-14.2.2 MVCC机制 311\n\n-14.2.3 Checkpoint机制 314\n\n-14.2.4 Crash Recovery机制 315\n\n-14.2.5 事务并发与锁机制 316\n\n14.3 使用事务 319\n\n-14.3.1 理解事务语法 319\n\n-14.3.2 【实例115】用ROLLBACK回滚事务 320\n\n-14.3.3 【实例116】用COMMIT提交事务 321\n\n-14.3.4 【实例117】用SAVEPOINT回滚部分事务 321\n\n14.4 小结 323\n\n第15章 优化SQL语句 324\n\n15.1 理解查询优化器的工作原理 324\n\n-15.1.1 SQL语句执行过程 324\n\n-15.1.2 了解查询树 325\n\n-15.1.3 了解逻辑优化 326\n\n-15.1.4 逻辑优化：对子查询进行优化 326\n\n-15.1.5 逻辑优化：条件表达式优化及等价谓词重写优化 327\n\n-15.1.6 逻辑优化：外连接优化 328\n\n-15.1.7 了解物理优化 329\n\n15.1.8 代价估算 332\n\n15.2 查看并分析执行计划 334\n\n-15.2.1 EXPLAIN命令介绍 334\n\n-15.2.2 EXPLAIN输出解读 336\n\n-15.2.3 【实例118】用EXPLAIN分析执行计划 338\n\n15.3 常见SQL语句优化 343\n\n-15.3.1 【实例119】用索引避免表扫描 343\n\n-15.3.2 【实例120】子查询优化 345\n\n15.3.3 【实例121】表连接优化 347\n\n-15.3.4 【实例122】用UNION ALL代替UNION 349\n\n-15.3.5 【实例123】避免使用“SELECT *” 350\n\n-15.3.6 【实例124】为jsonb字段建立合适的索引 351\n\n15.4 小结 352\n\n第16章 优化数据库服务端性能 353\n\n16.1 了解数据库性能指标 353\n\n-16.1.1 衡量数据库性能的指标 353\n\n-16.1.2 影响数据库性能的硬件因素 353\n\n-16.1.3 【实例125】用nmon工具监控Linux性能 356\n\n16.2 优化存储性能 359\n\n-16.2.1 物理存储介质简介 359\n\n-16.2.2 存储路径隔离原则 361\n\n16.3 优化数据库配置参数 366\n\n-16.3.1 优化内存资源类参数 366\n\n-16.3.2 优化脏页刷写类参数 368\n\n-16.3.3 优化空间回收类参数 369\n\n-16.3.4 优化WAL日志文件相关参数 372\n\n-16.3.5 数据库性能视图 376\n\n16.4 小结 383\n\n第17章 PL/pgSQL服务端编程 384\n\n17.1 PL/pgSQL编程基础 384\n\n-17.1.1 PL/pgSQL的结构 384\n\n-17.1.2 PL/pgSQL的声明 386\n\n-17.1.3 PL/pgSQL的表达式 389\n\n-17.1.4 PL/pgSQL的基本语句 389\n\n-17.1.5 PL/pgSQL的控制结构 392\n\n-17.1.6 PL/pgSQL的游标 399\n\n-17.1.7 PL/pgSQL的错误和消息 401\n\n-17.1.8 PL/pgSQL的触发器函数 402\n\n17.2 PL/pgSQL 编程实战 405\n\n-17.2.1 PL/pgSQL开发建议 405\n\n-17.2.2 【实例126】编写一个自定义用户函数 407\n\n-17.2.3 【实例127】从PL/SQL移植到PL/pgSQL 409\n\n17.3 小结 411\n\n第18章 高可用方案 412\n\n18.1 如何实现高可用方案 412\n\n-18.1.1 基本概念 412\n\n-18.1.2 实现自动故障接管（Failover） 414\n\n-18.1.3 WAL归档与流复制 415\n\n-18.1.4 防止WAL日志文件被过早删除 418\n\n-18.1.5 巧用级联复制 419\n\n-18.1.6 同步复制与读写分离 420\n\n18.2 【实例128】基于Corosync+Pacemaker的方案 424\n\n-18.2.1 初识Corosync和Pacemaker 424\n\n-18.2.2 Corosync和Pacemaker的安装 426\n\n-18.2.3 基于Corosync+Pacemaker的高可用方案及实现 430\n\n18.3 【实例129】基于Stolon的方案 436\n\n-18.3.1 Stolon方案架构及特性 436\n\n-18.3.2 Stolon方案安装配置及【实例 437\n\n18.4 小结 443\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyansheng836%2Fhead-first-postgresql-code","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyansheng836%2Fhead-first-postgresql-code","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyansheng836%2Fhead-first-postgresql-code/lists"}