reindexdb
命令用于重建一个或多个库中表的索引,可以是schema
级索引重建,也可以是database
级索引重建。
reindexdb
是REINDEX INDEX
命令的的封装,两者在本质上没有区别。
13版本前reindexdb
不支持并行选项,13版本此命令新增-j选项,支持全库并行索引重建,手册说明如下:
手册说明
Allow reindexdb to operate in parallel (Julien Rouhaud)
Parallel mode is enabled with the new –jobs option.
关于-j选项
reindexdb
命令的-j
选项,手册说明如下:
1 | -j njobs |
Reindexdb测试
测试环境为笔记本的的一台4C/1GB虚机,计划对mydb
库进行全库索引重建,并行度分别为1、2、3、4。
为测试数据相对准确,首先对mydb
库做一次全库索引重建,如下:
1 | [pg13@ydtf01 ~]$ time reindexdb -h 127.0.0.1 -p 1922 -U postgres mydb |
将并行度-j
分别设置为1、2、3、4进行索引重建,如下:
1 | [pg13@ydtf01 ~]$ time reindexdb -h 127.0.0.1 -p 1922 -U postgres mydb |
time
命令的输出取real
时间,以上索引重建时间汇总如下:
命令 | 并行度 | 执行时间 |
---|---|---|
reindexdb | 1 | 39.287s |
reindexdb | 2 | 29.080s |
reindexdb | 3 | 29.886s |
reindexdb | 4 | 38.539s |
当并行度为4时,可看到系统层面有4个并行REINDEX
进程,如下:
以上看出,当并行度为2时执行时间最短,说明并不是将并行度设置成设备的CPU逻辑核数时效率最高,由于硬件环境为笔记本虚机,测试数据仅供参考。
同时,pg_stat_activity
视图可查询到多个REINDEX TABLE
命令,如下:
1 | mydb=# SELECT pid,query,state FROM pg_stat_activity where state='active' and usename<>'repuser' and pid<>pg_backend_pid(); |
总结
尽管reindexdb
命令在生产运维过程中并不常用,了解下reindexdb
命令的-j
选项对PostgreSQL的运维工作是有帮助的。
reindexdb
命令设置-j
选项后给数据库主机带来较大压力,需根据服务器配置设置并行度,并在业务低谷期操作。