总体感觉整个索引创建的比较慢,PostgreSQL10没有并行创建索引的功能,所以执行过程中,仅用到了服务器的一个核心来执行计算。索引创建是一个高CPU消耗的工作,CPU基本会跑满,会用到backend的两个work_mem进行排序,并没有什么实质的IO操作,读写操作会在中间和最后分段批量执行。
背景:我现在手头有一个表,原始数据有6000万,表大小为6GB,用来做测试。发现查询效率不高,故增加索引提高查询性能。
环境:Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz, 128GB DDR3,3块1w转做的RAID5。
过程:
1.数据库初始化的时候,所有参数都做了优化,创建索引时,单独在session级别临时调整maintanance_work_mem,work_mem和temp buffer。
2.执行语句
alter table xxx add PRIMARY KEY (col1, col2);
3.这个表添加完主键后,全表大小由6G变成10G,可见索引列比较大。
4.创建索引共花费100分钟,有点慢。
创建索引过程中,观察后台资源产生波动的规律为:单核CPU占用100%没有IO-->中间穿插两次IO出现读并且由单核切换为多核心计算-->最后出现多核与单核交替忙碌+IO读写,猜测应该是计算完成后写入索引到磁盘。阶段截图如下:
结语:总体来讲大的字段创建索引相当慢,拿这个表来说,6G的表数据入库用了10几分钟,但是创建一个4G的索引竟然用了100分钟,PG10并没有什么更好的办法解决这个问题。
本文由【闻术苑】发布于开源中国,原文链接:https://my.oschina.net/javacy/blog/3019438