PostgreSQL 的extension是需要仔细说说,如果说MYSQL 有plug-in的话让数据库变得灵活,可也是一个配角。POSTGRESQL 的 extension 经常可以反客为主,把postgresql 变成POSTGIS 数据库就是一个extension的功劳。
这一个系列主要就是为了要总结一些必须的extension, 让postgresql 使用的更流畅和丰富多彩。
可以先通过下面的语句来查看自己的PG上有多少可以使用的extension
代码语言:javascript复制SELECT name FROM pg_available_extensions;
1 citext
为什么要先说这个extension,主要是一个数据库要想获得更多的使用率,必须要好用,POSTGRESQL大小写的敏感的问题是要首要解决的问题,当然我们可以通过规范和提高使用者的成本来解决这个问题,但这里我们通过citext来通过数据库的方式来解决这个问题,可以看做是一个好的选择。
2 pg_repack
Postgresql 被攻击的最多的就是他的表膨胀问题,但实际上谁造成了表膨胀,设计不好的大事务以及设计不好的 HOT TABLE ,当然除了指责设计的问题,我们怎么在遇到这些问题的时候,管好自己的数据库,才是pg_repack的重点。
其主要的功能
在线进行vacuum full 的造作,并且对于一个表重新建立索引,条件是表必须有主键,或者唯一索引并且这个索引不为空。
需要注意的地方
在操作时如果对表进行操作,需要考虑在执行期间,需要此表的2倍以上的磁盘空间。
pg_repack 是安装后,在外部执行的命令,不是在postgresql 内部执行的命令
pg_repack --no-order -d postgres -t test.test_1 -N -j 5 -Z
上面的命令的意思是执行vacuum 但操作中不进行重排序,对于postgres数据库中的 test schema 中的test 表进行 try 的操作,并开启5个线程,但不对表进行分析
具体的操作命令
https://reorg.github.io/pg_repack/
3 pageinspect
pageinspect是POSTGRESQL 对于普通用户与底层数据页之间的一个查看和交流的extensions 想深入的了解postgresql 的一些存储数据的原理可以通过pageinspect 来操作。
下面的命令就可以来查看相关的POSTGRESQL 存储的原理的验证
下面的网址会有更多关于pageinspect的命令组合和例子
https://cloud.tencent.com/developer/article/1625989
4 pg_stat_statements
postgresql 怎么看历史执行过的SQL的信息,那就必须通过pg_stat_statements 来进行。pg_stat_statements 提供了这个功能,但此扩展需要在shared_preload_libraries 中加载,主要原因是需要进行额外的共享内存的使用。
需要在上图的位置,加载pg_stat_statements
在pg_stat_statements.max 中设置需要保留的语句的条数,超过就会将最早的语句覆盖掉
pg_stat_statements.track = all
all - 是包含所有的sql 语句其中包含了函数
top -仅仅跟踪执行的语句其中包含的函数不会被跟踪,
none - (不跟踪)
pg_stat_statements.track_utility = off
是否跟踪非DML语句 ,on表示跟踪, off表示不跟踪
pg_stat_statements.save = on
详细的命令解释和使用
https://www.postgresql.org/docs/12/pgstatstatements.html
5 pg_prewarm
pg_prewarm 主要的功能在于系统重启后,自动加用户认为重要的表加载的缓存share buffer中, 减少系统重启后对于查询的影响。
在应用中,尤其在OLAP的情况下,对于大表的分析等等是非常耗费查询的时间的,而即使我们使用select table 的方式,这张表也并不可能将所有的数据都装载到内存中,而pg_prewarm的功能就是完成一个张表全部进入到内存中的功能。
pg_prewarm早期支持手动的方式加载表,后面支持了更多的功能例如提供一种方便的方式来将表加载到操作系统的缓冲区缓存或PostgreSQL的缓冲区缓存中。预暖可以通过使用pg_prewarm函数手动执行,也可以通过在shared_preload_libraries中包含pg_prewarm函数自动执行。
当然postGIS 应该被列到第一名,虽然他是extension, 但他的工作范围远远大于一个extension的范围,应该把她列为一种数据库的类型,所以这里就略过了。