作者:瀚高PG实验室 (Highgo PG Lab)- Kalath
本文继续介绍五个实用的PostgreSQL特性。
一、数组类型
PostgreSQL已经支持数组类型很长时间了。数组类型可以降低样板应用代码的数量和简化查询。
PostgreSQL数组带有运算符和函数,包括聚合函数。还可以在数组表达式上创建索引。
举个例子,创建一张表blogs,其中tags列为数组类型。
postgres=# CREATE TABLE blogs (
postgres(# title text NOT NULL PRIMARY KEY,
postgres(# tags text[]
postgres(# );
CREATE TABLE
然后向这张表中插入多条数据,每行代表一篇博客的数据,包括标题和标签。
然后,就可以通过标签来查找对应的博客有哪些了。
postgres=# SELECT title, tags FROM blogs WHERE '{"database", "array"}' <@ tags;
title | tags
---------------------+-----------------------------
PostgreSQL features | {Postgresql,database,array}
(1 row)
这里我们查找了包含“database”和“array”标签的博客信息。
二、触发器
触发器是一种由事件自动触发执行的特殊的存储过程。当从表中插入,更新或删除行时,可以要求PostgreSQL执行特定的函数。它甚至可以在插入操作的过程中更改数据的值。
关于触发器的使用,有几个需要注意的地方:
1、创建触发器时,先创建触发器的执行函数,再创建这个触发器。
2、语句级触发器是指执行每个SQL时,只执行一次。行触发器指每行会执行一次。
3、删除触发器时,触发器的函数不会被删除。但当表删除时,表上的触发器也会被删除。
4、如果同一事件有多个触发器,则按触发器名字的顺序来触发。
三、pg_stat_statements扩展
pg_stat_statements是PostgreSQL发行版中默认存在的扩展。 此扩展记录了有关每个执行语句的大量信息,包括所用的时间,使用的内存和启动的磁盘I / O. 它对于理解和调试查询性能问题是不可或缺的。
安装和启用此扩展的开销很小,使用起来非常简单,非常建议在生产服务器上运行它!
四、Hash,GIN和BRIN索引
PostgreSQL中的默认索引类型是B-Tree,但也有其他的索引类型。其他索引类型在某些情况下非常有用。 特别是,设置Hash,GIN和BRIN类型的索引可能恰好是能解决性能问题的方法。
与具有固有排序的B-Tree索引不同,哈希索引是无序的,只能进行等值匹配(查找)。 但是,对于等值匹配,哈希索引占用的空间要小得多,并且速度比B-Trees快。注意,在PostgreSQL 10之前,无法复制哈希索引,它们是未被记录的(unlogged)。
GIN是一个反向索引,它本质上允许单个键的多个值。 GIN索引可用于索引数组,JSON,范围,全文搜索等。
如果数据具有特定的自然顺序(例如,时间序列数据),并且查询通常仅适用于小范围的数据,那么BRIN索引可以以非常小的开销加速查询。 BRIN索引维护每个数据块的范围,允许优化器跳过包含查询不会选择的行的块。
五、全文检索
PostgreSQL可以很好地进行全文检索,包括英语以外的语言。全文索引允许文档被预处理并且保存一个索引用于以后快速的搜索。PostgreSQL提供了一种数据类型tsvector来存储预处理后的文档,还提供了一种类型tsquery来表示处理过的查询。有很多函数和操作符可以用于这些数据类型,其中最重要的是匹配操作符@@。