PostgreSQL:测试 Maintenance_work_mem 参数对索引创建的影响

索引创建是数据库管理员的基础工作之一,有时由于业务需求需要对生产库的大表新建索引,Oracle 创建索引时可以开启并行 目前 PostgreSQL 本身并不提供并行创建索引功能,如何能加快索引的创建呢?本文测试 maintenance_work_mem 参数对索引创建的影响。

创建测试表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
francs=> create table test_1(id int4 primary key, name character varying(64),create_time timestamp without time zone);
NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_1_pkey" for table "test_1"
CREATE TABLE

francs=> insert into test_1 select generate_series(1,10000000),generate_series(1,10000000)||'_francs',clock_timestamp();
INSERT 0 10000000

francs=> select * From test_1 limit 3;
id | name | create_time
----+----------+----------------------------
1 | 1_francs | 2013-04-27 16:28:11.465584
2 | 2_francs | 2013-04-27 16:28:11.465928
3 | 3_francs | 2013-04-27 16:28:11.465943
(3 rows)

备注:创建一张 1 千万数据的表做测试。

测试一 设置 maintenance_work_mem 为 1MB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
francs=> show maintenance_work_mem;
maintenance_work_mem
----------------------
256MB
(1 row)

francs=> set maintenance_work_mem='1MB';
SET

francs=> show maintenance_work_mem;
maintenance_work_mem
----------------------
1MB
(1 row)

创建索引

1
2
3
4
5
6
7
francs=> create index concurrently idx_test_1_name on test_1 using btree (name);
CREATE INDEX
Time: 72676.986 ms

francs=> create index concurrently idx_test_1_ctime on test_1 using btree (create_time);
CREATE INDEX
Time: 40593.181 ms

测试二 设置 maintenance_work_mem 为 10 MB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
francs=> show maintenance_work_mem ;
maintenance_work_mem
----------------------
1MB
(1 row)

francs=> set maintenance_work_mem ='10MB';
SET

francs=> show maintenance_work_mem ;
maintenance_work_mem
----------------------
10MB
(1 row)

创建索引(先删除之前的两个索引)

1
2
3
4
5
6
francs=> create index concurrently idx_test_1_name on test_1 using btree (name);
Time: 83767.538 ms

francs=> create index concurrently idx_test_1_ctime on test_1 using btree (create_time);
CREATE INDEX
Time: 47679.868 ms

测试三 设置 maintenance_work_mem 为 1 GB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
francs=> show maintenance_work_mem ;
maintenance_work_mem
----------------------
10MB
(1 row)

francs=> set maintenance_work_mem ='1GB';
SET

francs=> show maintenance_work_mem ;
maintenance_work_mem
----------------------
1GB
(1 row)

创建索引(先删除之前的两个索引)

1
2
3
4
5
6
7
francs=> create index concurrently idx_test_1_name on test_1 using btree (name);
CREATE INDEX
Time: 47657.969 ms

francs=> create index concurrently idx_test_1_ctime on test_1 using btree (create_time);
CREATE INDEX
Time: 18953.915 ms

测试四 设置 maintenance_work_mem 为 2 GB

1
2
3
4
5
6
7
8
9
10
11
francs=> show maintenance_work_mem;
maintenance_work_mem
----------------------
1GB
(1 row)

francs=> show maintenance_work_mem;
maintenance_work_mem
----------------------
2047MB
(1 row)

创建索引(先删除之前的两个索引)

francs=> create index concurrently idx_test_1_name on test_1 using btree (name);
CREATE INDEX
Time: 50843.263 ms

francs=> create index concurrently idx_test_1_ctime on test_1 using btree (create_time);
CREATE INDEX
Time: 13304.179 ms

总结

PostgreSQL:测试 Maintenance_work_mem 参数对索引创建的影响
备注:从以上看出,增加 maintenance_work_mem 参数能够加速索引创建,当然不建议在 postgresql.conf 中设置较大的 maintenance_work_mem,因为 autovacuum 进程消耗的内存受这个参数影响, 一般仅在创建索引的 session 设置 session 级maintenance_work_mem 参数。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/237956.html

(0)
上一篇 2022年1月29日
下一篇 2022年1月29日

相关推荐

发表回复

登录后才能评论