gevel是一个查看GiST以及SP-GiST索引内部结构的一个插件, gevel官网的教程写的不是非常清楚,这里写一下我安装的过程。

下面的安装过程基于干净的Ubuntu20.04系统,其它linux系统安装的步骤应该也大同小异。

从源码安装Postgres

首先更新一下系统中的软件包

1
apt update -y

然后下载postgres的最新代码

1
git clone https://github.com/postgres/postgres.git

安装编译代码所需要的依赖,目前主要是下面几个

1
sudo apt install -y zlib1g-dev libreadline-dev gcc libc6-dev

依赖安装成功以后,到postgres源码目录中运行编译的命令

1
2
3
./configure
make
make install

编译contrib文件夹

1
2
3
cd contrib
make
make install

启动Postgres

用root权限创建用户

1
adduser postgres

然后创建数据库文件夹

1
2
3
mkdir -p /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data

切换到postgres用户,并初始化数据库文件夹以及启动数据库

1
2
3
su postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data -E UNICODE --locale=C
/usr/local/pgsql/bin/pg_ctl -D /usr/local/pgsql/data -l /home/postgres/logfile start

看到下面的输出说明启动成功

1
2
waiting for server to start.... done
server started

创建测试数据库

切换回root用户,连接数据库

1
2
3
4
export PATH=$PATH:/usr/local/pgsql/bin  #这一步可以配置到~/.bashrc来使其永久生效

psql -U postgres

创建测试数据库

1
postgres=# create database testdb;

编译安装gevel

回到postgres源码的/contrib目录下,下载gevel

1
git clone git://sigaev.ru/gevel

进入到gevel并编译安装

1
2
3
cd gevel

make USE_PGXS=1

这时候编译会报错

报错信息中也告诉应该怎么修改了,根据错误信息来修改

主要修改的地方是 gevel.c的1660行和2004行,都是将BTreeInnerTupleGetDownLink修改为BTreeTupleGetDownLink

修改完后重新编译和安装gevel

1
make USE_PGXS=1

这时候仍然会有出错信息,如下图所示

无视此信息,将此目录下编译出的的gevel.so复制到/usr/local/pgsql/lib目录下

1
cp gevel.so /usr/local/pgsql/lib

然后运行下面命令在testdb数据库中创建相应的函数

1
psql -U postgres -d testdb < gevel.sql

看到下面的输出,说明安装成功了

1
2
3
4
5
6
7
8
9
10
11
12
13
SET
BEGIN
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
CREATE FUNCTION
COMMIT

测试gevel

最后我们来测试一下gevel是否生效

连接到testdb数据库,运行下面命令创建表,再插入测试数据后建立gist索引

1
2
3
4
5
6
7
8
create table reservations(during tsrange);

insert into reservations(during) values
('[2016-12-30, 2017-01-09)'),
('[2017-02-23, 2017-02-27)'),
('[2017-04-29, 2017-05-02)');

create index on reservations using gist(during);

然后查看索引的内部结构

1
2
select level, a from gist_print('reservations_during_idx') as t(level int, valid bool, a tsrange);

可以看到索引的内部信息了