它表面上是个单机的关系型数据库,但它也是个文档数据库,key-value 数据库,时序数据库,流式计算引擎,搜索引擎,空间位置数据库;它几乎可以直接访问任意其他类型数据库,例如 Oracle,Mysql,Mongodb,Redis,ElasticSearch 等;它还可以直接变身为分布式数据库。 PostgreSQL 不仅仅是个数据库,它还是个和数据相关技术的生态系统。
1.1 PostgreSQL 介绍
- 关系型数据库 PostgreSQL
作为一个关系型数据库,PostgreSQL 支持 SQL:2016 的大部分主要特性。在 179 个完整核心符合所要求的强制特性中,PostgreSQL 至少符合 160 个。Note ,这里之所以强调 SQL 标准而不是将具体的 SQL 语句,是想表达,我们经常使用,或者我们不常使用,但已经在 SQL 标准中定义了的语法,基本都已经在 PostgreSQL 中支持了。
- 丰富的数据类型
除了一些标准的类型,PostgresSQL 内部还提供了丰富的数据类型,下面列了几类。- 枚举类型
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy'); CREATE TABLE person ( name text, current_mood mood ); - 几何类型
支持点、线、线段、方框,路径、多边形,圆。 线的类型是line,用{A,B,C}表示,代表方程Ax + By + C = 0 - 网络地址类型
ipv4,ipv6 或者 mac 地址。 比如 IPv4 和 IPv6 网络的地址或者掩码类型是 inet,比如192.168.0.1/24 - 文本搜索类型
PostgreSQL 提供两种数据类型,它们被设计用来支持全文搜索,全文搜索是一种在自然语言的文档集合中搜索以定位那些最匹配一个查询的文档的活动。tsvector 类型表示一个为文本搜索优化的形式下的文档,tsquery 类型表示一个文本查询.SELECT to_tsquery('testzhcfg', '保障房资金压力'); to_tsquery ------------------------------------ '保障' & '房' & '资金' & '压力' - UUID
- xml
xml 数据类型可以被用来存储 XML 数据。它比直接在一个 text 域中存储 XML 数据的优势在于,它会检查输入值的结构是不是良好,并且有支持函数用于在其上执行类型安全的操作 - json
SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::json; json ------------------------------------------------- {"bar": "baz", "balance": 7.77, "active":false} (1 row) SELECT '{"bar": "baz", "balance": 7.77, "active":false}'::jsonb; jsonb -------------------------------------------------- {"bar": "baz", "active": false, "balance": 7.77} (1 row) - 数组
CREATE TABLE sal_emp ( name text, pay_by_quarter integer[], schedule text[][] ); - 自定义组合类型
CREATE TYPE complex AS ( r double precision, i double precision ); CREATE TYPE inventory_item AS ( name text, supplier_id integer, price numeric ); - range
SELECT int4range(10, 20) @> 3; ?column? ---------- f (1 row)
- 枚举类型
- 虚拟列( 12 增加)
CREATE TABLE people ( ..., height_cm numeric, height_in numeric GENERATED ALWAYS AS (height_cm / 2.54) STORED ); - PostgreSQL 为每一种数据类型创建了大量的函数
- 每一种数据类型还有对应的索引
数据类型,函数,索引,就覆盖了数据类型的存储、计算和查询。 - 完善的并发控制
使用 MVCC(多版本并发控制)实现了并发控制模型,支持读未提交,读未提交,可重复读,可序列化四个隔离级别。读已提交是 PostgreSQL 中的默认隔离级别。支持表锁、行锁。页级锁,咨询所(乐观锁) - 基于代价以及遗传查询优化器
生成的执行计划更加高效,能更好地处理 join 查询。支持 nest loop,merge sort,hash join。 - 并行执行
查询,With 中间表,创建索引都可以多进程并行执行。
1.2 PostgreSQL Extension 介绍
PostgreSQL 在数据库的基本功能之外,也允许你使用其它语言编写程序来扩展数据库的功能,这些被称之为extensions,这种扩展能力大大扩大了数据库的能力范围,下面选取了一些比较典型的 extension 列出来。
- 存储过程 /函数
支持 PL/pgSQL,PL/Tcl,PL/Perl,PL/Python - FDW(foreign-data wrapper)
支持在 PostgreSQL 中直接访问 jdbc,odbc,其他关系型,NOSQL 数据库,本地或者网络文件,大数据相关系统的表或者数据 - PostGIS
PostGIS 提供如下空间信息服务功能:空间对象、空间索引、空间操作函数和空间操作符。同时,PostGIS 遵循 OpenGIS 的规范。 - PipelineDB
使用流式 SQL 的流计算引擎 - timescaleDB
基于 PostgreSQL 数据库开发的一款时序数据库 - Citus
基于最新 PostgreSQL 构建的分布式数据库。CitusDB 可对 PostgreSQL 数据库进行伸缩以适合大数据的处理。可在集群中进行自动分片和碎片复制.CitusDB 可提升 PostgreSQL 的高并发性和 JSON 支持,可用作事务以及分析数据库场景。 - Hstore
提供存储 Key-Value 数据的功能 - 中文分词
zhparser,结巴 - pg_stat_statements
追踪一个服务器所执行的所有 SQL 语句的执行统计信息 - madlib 基于 SQL 的机器学习插件
1.3 PostgreSQL 相关数据库介绍
基于 PostgreSQL 开发的数据库也很多,下面选取了其中几个。
- Greenplum MPP 数据库。
- PostgreSQL XL
Postgres-XL 是一个完全满足 ACID 的、开源的、可方便进行水平扩展的、多租户安全的、基于 PostgreSQL 的数据库解决方案。支持 OLAP,OLTP。 - 阿里云 POLARDB
- 华为 GaussDB