1 测试环境
1.1 硬件环境
CPU | 内存 | 数据盘 |
2路Intel(R) Xeon(R) CPU E5-2620 v3 @ 2.40GHz 共24个逻辑核 | 64G | 2T sata*8 |
1.2 软件环境
操作系统:Red Hat Enterprise Linux Server release 7.4 (Maipo) 内核:3.10.0-693.el7.x86_64
PG:PostgreSQL 10.6
1.3 测试表
基础表结构:
CREATE TABLE test (
a varchar(64),
b varchar(64),
c varchar(64),
d varchar(64),
e varchar(64),
f varchar(64),
g varchar(64),
h varchar(64),
i varchar(64),
j varchar(64),
k varchar(64),
l TIMESTAMP
) ;
索引:
create index idx_1 on test(a);
create index idx_2 on test(b);
create index idx_3 on test(f);
create index idx_4 on test(i);
create index idx_5 on test(l);
数据样例:
9dfdd3a8-b65a-4705-a0ff-daf1819861d2 1111111111111111111 阿大 13888888888 陕H11111 546687257794821 460073102018579 a7:8e:c5:d3:2d:6c 4212922510 T1n5C9011216 2018-10-08 10:55:47
2 入库性能
2.1 总体结果
使用copy命令入库,每个文件1000W条,行长约180B。分别测试无索引、1个索引、3个索引、5个索引的导入性能。
2.1.1 测试结果
表中存量数据(千万) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
no index | 22 | 22 | 22 | 23 | 22 | 23 | 25 | 22 | 25 | 22 | 23 | 22 | 22 | 22 | 22 | 22 | 23 | 23 | 23 | 23 |
1 index(raid0*8) | 61 | 79 | 71 | 72 | 74 | 124 | 76 | 78 | 156 | 78 | 130 | 129 | 79 | 202 | 80 | 221 | 209 | 113 | 247 | 259 |
3 index(raid0*8) | 153 | 214 | 182 | 275 | 192 | 324 | 192 | 362 | 390 | 419 | 562 | 1214 | 1914 | 2539 | 3283 | 4169 | 4548 | 5000 | 5463 | 8309 |
5 index(raid0*8) | 226 | 225 | 327 | 255 | 387 | 430 | 467 | 989 | 2600 | 2670 | 2958 | 2786 | 3452 | 4264 | 6482 | 11236 | 19992 | |||
3 index(单盘) | 136 | 176 | 185 | 223 | 177 | 363 | 202 | 321 | 207 | 341 | 3095 | 6332 | 9504 | |||||||
5 index(单盘) | 185 | 264 | 282 | 335 | 242 | 376 | 419 | 456 | 3552 | 11663 |
续:
表中存量数据(千万) | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
no index | 22 | 22 | 22 | 22 | 22 | 22 | 23 | 22 | 22 | 22 | 23 | 23 | 23 | 22 | 23 | 22 | 23 |
1 index(raid0*8) | 271 | 389 | 396 | 509 | 567 | 719 | 875 | 1036 | 974 | 1016 | 1435 | 1584 | 1973 | 1860 | 2079 | 2118 | 7809 |
2.1.2 总结
- 索引对PG导入性能影响非常大。
- 在表数据量到达拐点之后(根据索引数及磁盘IO能力决定,即使只有1个索引),导入时间呈指数级增长。
- 更好的磁盘IO只能延缓拐点的到来,无法避免性能急剧降低。
- 根据上述实验结果,单表的数据量在小于7000W时,导入性能略有下降,但基本还算稳定。所以建议:
- 实际使用时如果索引小于等于5个,单表数据量大于5000W条就必须采取如分区、分库、分表等措施,同时每个分区也不得超过5000W。
- 如果索引大于5个,优先考虑降低索引个数,如过实在不能降低,则单个分区数据量不得大于2000W条。