本文介绍用维基百科英语语料库的数据做性能测试的结果,包含索引构建、单Term查询、多Term查询等多项性能测试结果。
测试实例规格
引擎版本:AnalyticDB PostgreSQL 7.0版。
内核小版本:v7.1.0.0。
实例系列:高可用版。
节点规格:4 C 32 GB。
节点数量:4 Segment。
节点存储容量:200 GB。
存储磁盘类型:ESSD云盘PL1。
Master资源:8 CU。
测试数据集
数据来源为维基百科英语语料库的快照,包含500万条数据。下载数据,请参见测试数据。本次测试了1亿条数据(将本次测试数据重复导入20次)下的性能情况。
数据由url、title和body组成。
数据格式为JSON。
数据大小为2.34 GB。
性能测试结果
BM25索引构建耗时约为Gin(tsvector)索引耗时的63%。
在单Term查询方面,BM25索引的QPS性能为Gin(tsvector)索引的6-7倍。
在多Term查询方面,BM25索引的QPS性能为Gin(tsvector)索引的6-11倍。
在单Term AND点查询方面,BM25索引的QPS性能为Gin(tsvector)+btree索引的6-9倍。
在单Term AND范围查询方面,BM25索引的QPS性能为Gin(tsvector)+btree索引的1-9倍。
索引构建
索引 | 数据导入耗时 | 构建索引耗时 | 带索引流式导入耗时 |
BM25 | 24 min | 36 min | 84 min |
Gin(tsvector) | 137 min | 57 min | - |
查询单个Term
在body列上查询包含某个Term的TOP 20结果,例如body:"Gabriel Basso"
。这些Term的平均出现频率为56685(单位:次)。结果取最大的QPS以及对应时间点的RT。
并发数 | BM25 | Gin(tsquery) | ||
QPS | RT (ms) | QPS | RT (ms) | |
1 | 158.86 | 6.45 | 25.97 | 38.35 |
5 | 544.43 | 9.19 | 73.92 | 64.35 |
10 | 738.21 | 12.63 | 89.90 | 128.65 |
20 | 863.07 | 20.69 | 172.83 | 262.89 |
30 | 925.02 | 31.05 | 239.74 | 378.18 |
40 | 1234.45 | 39.64 | 203.91 | 616.93 |
查询多个Term
在body列上查询包含多个Term中任意一个或多个的TOP20结果,例如body:handsworth OR body:cern
。所有的Term都是从数据集中提取的,本次结果排除了罕见的Term(出现次数少于100次)。每个查询所包含的Term数量符合权重分布[0.03, 0.15, 0.25, 0.25, 0.15, 0.08, 0.04, 0.03, 0.02]。即有3%的查询包含1个Term、15%的查询包含2个Term等。
并发数 | BM25 | GIN(tsvector) | ||
QPS | RT (ms) | QPS | RT (ms) | |
1 | 216.88 | 4.54 | 31.97 | 31.49 |
5 | 842.12 | 5.86 | 104.89 | 47.27 |
10 | 1161.79 | 8.58 | 112.89 | 87.40 |
20 | 1332.61 | 15.03 | 118.87 | 159.25 |
30 | 1380.56 | 21.66 | 120.93 | 264.10 |
40 | 1470.47 | 26.73 | 131.87 | 341.69 |
查询单Term AND点查
点查条件只命中一条数据。
SELECT * FROM articles ORDER BY body @@@ pgsearch.config('body:"David" AND id:80000000');
SELECT * FROM articles_gin WHERE body_ts @@ to_tsquery('David') AND id = '80000000';
并发数 | BM25 | GIN(tsvector)+Btree | ||
QPS | RT (ms) | QPS | RT (ms) | |
1 | 342.92 | 2.81 | 2.00 | 985.66 |
5 | 1434.90 | 3.30 | 4.99 | 2401.95 |
10 | 2293.54 | 4.21 | 6.99 | 4306.61 |
20 | 3084.70 | 6.32 | 13.98 | 8536.26 |
30 | 2835.97 | 10.38 | 19.98 | 12565.44 |
40 | 3081.71 | 12.78 | 24.97 | 17342.22 |
查询单Term AND范围查询
范围查询过滤掉99.99%的数据,命中1万条数据。
SELECT * FROM articles WHERE body @@ pgsearch.config('body:"David" AND id:[110000 TO 120000]');
SELECT * FROM articles_gin WHERE body_ts @@ to_tsquery('David') AND id >= '110000' AND id <= '120000';
并发数 | BM25 | GIN(tsvector)+Btree | ||
QPS | RT (ms) | QPS | RT (ms) | |
1 | 9.99 | 110.55 | 1.00 | 1189.95 |
5 | 22.97 | 229.57 | 4.99 | 2074.63 |
10 | 25.97 | 451.81 | 8.99 | 4236.33 |
20 | 32.97 | 951.86 | 14.99 | 8674.06 |
30 | 29.97 | 1366.22 | 19.98 | 13458.88 |
40 | 39.97 | 2071.66 | 32.96 | 18251.81 |