PostgreSQL 11 小记

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
简介: ## 关于 PostgreSQL [PostgreSQL](https://en.wikipedia.org/wiki/PostgreSQL) 是世界上最先进的开源数据库。 PostgreSQL 最早可追溯到 1973 年,当时加州大学伯克利分校的两位科学家,[Michael Stonebraker](https://en.

关于 PostgreSQL

PostgreSQL 是世界上最先进的开源数据库。

PostgreSQL 最早可追溯到 1973 年,当时加州大学伯克利分校的两位科学家,Michael Stonebraker 和 Eugene Wong 受 1970 年 Edgar F. Codd 发表的论文 A Relational Model of Data for Large Shared Data Banks 以及 IBM 开发的关系数据库系统 System R 的启发,开发了一个研究性质的关系数据库系统 Ingres),该项目后续衍生出了众多现在依然耳熟能详的数据库系统,如 Sybase,微软的 SQL Server 等。

PostgreSQL 并没有直接继承自 Ingres,而是 1985 年 Michael Stonebraker 为解决当时数据库系统遇到的各种问题而重新开发的,借鉴了 Ingres 的思想,使用 POSTQUEL 作为其查询语言,命名为 POSTGRES(即 post-Ingres)。1994 年,伯克利大学的两位研究生 Andrew Yu 和 Jolly Chen 将 POSTQUEL 替换为 SQL 查询语言,将其命名为 Postgres95,将其前端交互式控制台命名为 psql。1995 年 5 月 5 日,发布第一版(0.01),同年 9 月 5 日发布 1.0 版本。

1996 年 7 月 8 日,PostgreSQL 有了第一个非大学的开发服务器用于开源开发,Bruce Momjian 和 Vadim B. Mikheev 加入,这一天也是 PostgreSQL 的生日[1]。同年,将其重命名为 PostgreSQL,以体现其支持 SQL。PostgreSQL 官网 PostgreSQL.org 与同年 10 月 22 日开始运营。PostgreSQL 的第一个版本于 1997 年 1 月 29 号发布,版本号是 6.0

PostgreSQL 以 PostgreSQL License 开源,如今已经吸引了全球众多用户、贡献者、公司和组织参与到开源社区中,保持几乎每年发布一个大版本的节奏向前推进。

PostgreSQL 11

以上简单介绍 PostgreSQL 的历史,有兴趣的同学可以查阅相关文献,几乎贯穿整个关系数据库系统的发展史。言归正传,2018 年 10 月 18 日 PostgreSQL 发布了 11 版本,该版本的主要特性如下:

  • 提升分区功能

    • 支持 HASH 分区,目前已经支持 RANGE,LIST 和 HASH 三种分区方式
    • 分区表支持主键,外键, 索引和触发器
    • 为不符合任何分区的数据提供 default 分区
    • UPDATE 分区键可以将其移动至合适的分区
    • 在计划和执行阶段,增强分区裁剪策略,提升 SELECT 性能
  • 提升并行能力

    • 并行创建 B-tree 索引
    • CREATE TABLE ... AS, CREATE MATERIALIZED VIEW 和特定的 UNION 查询支持并行
    • 优化并行 HASH JOIN 和 并行顺序扫描
  • 存储过程中支持嵌入事务
  • 可选的 Just-in-Time (JIT) 编译选项,提升表达式计算性能
  • 支持 SQL:2011 标准中窗口函数对应的所有 window frame 选项
  • 覆盖索引可以使用 INCLUDE 子句包含其他的非索引字段

从分区表和并能能力的增强可以看出,PostgreSQL 11 对于大数据量下的数据管理和查询能力都在提升,在存储空间不成为瓶颈的情况下,PostgreSQL 正努力将单机性能发挥到极致。

分区表

分区与 sharding

PostgreSQL 的分区与为解决传统数据库系统扩展问题的 sharding 方案是很相似的,区别在于前者将一张逻辑表划分为多个物理表存储在当前实例上,后者将多个物理表分布在不同的实例上;两者均通过水平切分将大表拆成小表,通过该方法,前者突破单表的大小限制,后者突破单实例的大小限制。

其实,借助 PostgreSQL 的分区能力以及 postgres_fdw 能力,完全可以将分区表中不同的分区存储在不同的外部表中,这些外部表可以是 PostgreSQL,也可以是 MySQL,甚至其他数据库类型。不妨来看一下在 PostgreSQL 中创建外部表的语法:

CREATE FOREIGN TABLE foreign_table (
        id integer NOT NULL,
        data text
)
        SERVER foreign_server
        OPTIONS (schema_name 'some_schema', table_name 'some_table');

以上语法如果可以支持指定多个 SERVER,建表语句支持 PARTITION BY,是否就实现了跨多实例的 sharding 方案呢?其实目前是支持手动配置外部分区表的,只是使用起来会比较繁琐,另外 pg_shardman 也做了同样的事情,如果 PostgreSQL 能从语法上直接支持使用起来就方便多了。

关于 PostgreSQL 内置 sharding 的信息可以参考这个wiki

另外分区表已经支持了默认分区,离支持自动扩展分区还远么?参考 Oracle 的 interval partition

分区表与性能

借助分区表和 postgres_fdw 可以实现表存储空间的扩展,但如果单机性能达到瓶颈,大数据量下的复杂查询依然很难满足企业用户 OLAP 的场景。因此,PostgreSQL 在性能方面做了很多努力。

并行 JOIN

两个分区表 JOIN,如果满足分区方式相同,分区数量相同,并且 JOIN 条件是分区键的等值连接等条件,则可以对每个分区分别做 JOIN,然后 UNION(对应计划树节点为 APPEND) 在一起,而每个分区的 JOIN 是可以并行执行的。可以参考德哥的分区表智能并行JOIN,性能提升约 2.4 倍。

image.png

并行聚合

与并行 JOIN 类似,在每个分区上分别做局部聚合(可并行),最后再做一次整体聚合,可以参考德哥的分区表智能并行聚合、分组计算

postgres_fdw 和 下推

分区表和外部表下推优化有所增强,可以将更多的操作下推至外部表执行:

  • INSERT, UPDATE, 和 COPY 操作可以下推至外部表执行。
  • 有 JOIN 的 UPDATE 和 DELETE 可以下推至外部表执行,之前仅能下推没有 JOIN 的 UPDATE 和 DELETE。
  • 可以下推聚合操作至外部表执行。

性能增强

性能增强方面,除以上提到的下推优化之外,在并行方面也做了增强:

  • 部分 DDL 支持并行,如创建索引,CREATE TABLE .. AS, SELECT INTO, and CREATE MATERIALIZED VIEW,并行排序和排序可以参考德哥并行排序、并行索引的测试文章。
  • 允许 LIMIT 传递到 Parallel worker 上执行,进而减少返回的行数。
  • HASH JOIN 支持共享哈希表,之前每个 Parallel worker 有自己的一个哈希表副本。

值得一提的是,PostgreSQL 11 中增加了对 JIT 的支持,目前仅支持表达式计算,对于有复杂表达式计算的 OLAP 场景应该会有不小的性能提升。

用户体验

用户体验方面,有一些比较有意思的点:

  • psql 可以使用 exitquit 退出了,有多少用户第一次使用 psql 时不知道如何退出?与 MySQL 相比,PostgreSQL 还有很多命令不是很直观的,这个后续可以整理下常用命令的对应关系。
  • 执行 ALTER TABLE .. ADD COLUMN .. DEFAULT .. 使用常量(非 NULL)作为默认值时,不用在执行的时候重写整张表了,具体实现方法待学习验证。

总结

本文简单记录 PostgreSQL 11 中个人比较关注的点。总体来讲,PostgreSQL 在分区表的支持和性能的提升上都给我很大的惊喜,非常期待 PostgreSQL 在 HTAP 场景中的应用,后续会继续探索具体的实现机制。

PostgreSQL 最新的 feature 和 patch 可以在 commitfestgit 上查看,也可以订阅邮件列表来了解社区同仁的动态或者提出问题,参与到社区中;更多的咨询可以到官网查阅。

更多 PostgreSQL 11 的特性可以参考官网 release notes 和德哥的 PostgreSQL 11 preview 系列 文章(搜索 PostgreSQL 11 preview)。

Reference

  1. Happy Birthday, PostgreSQL!
  2. A Brief History of PostgreSQL
  3. https://www.postgresql.org/docs/11/static/release-11.html
  4. https://www.postgresql.org/about/news/1894/
  5. https://en.wikipedia.org/wiki/PostgreSQL
  6. https://en.wikipedia.org/wiki/Ingres_(database)
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
5月前
|
关系型数据库 PostgreSQL
postgresql中geom处理
pgsql中的geom格式处理
63 0
|
7月前
|
SQL 存储 关系型数据库
PostgreSQL
PostgreSQL 是一款功能强大的开源关系型数据库管理系统,它支持 SQL(结构化查询语言)并提供了许多高级功能,如存储过程、视图、触发器、自定义数据类型等。PostgreSQL 适用于许多场景,如 Web 应用、数据仓库、科学计算等。
58 3
|
8月前
|
存储 关系型数据库 数据库连接
PostgreSQL很多优秀的书籍
PostgreSQL很多优秀的书籍
370 1
|
存储 JSON 安全
PostgreSQL 13
背景         PostgreSQL 全球开发组于2020年9月24日宣布PostgreSQL 13正式发布,作为世界上最先进的开源数据库,PostgresSQL 13是目前的最新版本。         阿里云是中国地区第一家支持PostgreSQL 13的云厂商,在 RDS 和 专属集群 两条产品线都提供了
|
关系型数据库 PostgreSQL 数据库
|
关系型数据库 PostgreSQL
|
关系型数据库 PostgreSQL 存储
|
关系型数据库 PostgreSQL SQL