このトピックでは、Wikipedia言語データベースのデータに基づいて、インデックスの作成、単項クエリ、複数項クエリなどのパフォーマンステストの結果について説明します。
テストインスタンスの仕様
エンジンのバージョン: AnalyticDB for PostgreSQL V7.0
マイナーバージョン: V7.1.0.0.
エディション: 高可用性エディション。
ノード仕様: 4コアと32 GBメモリ。
計算ノードの数: 4.
ノードストレージ容量: 200 GB。
ディスクタイプ: PL1 Enterprise SSD (ESSD) 。
コーディネータ・ノード・リソース: 8つの計算ユニット (CU) 。
テストデータセット
テストデータは、ウィキペディア言語データベースのスナップショットから取得され、5百万行のデータが含まれています。 GitHubのsofthuafei/wiki-datasetからパッケージ "wiki-articles-500w-aa" から "wiki-articles-500w-az" をダウンロードします。 この例では、テストデータを20回連続でインポートして、0.1億行のデータを含むデータセットを作成します。
データセットには、url、title、およびbodyフィールドが含まれます。
データセットはJSON形式です。
データセットのサイズは2.34 GBです。
cat wiki-articles-500w * > wiki-articles-500w.json.bz2コマンドを実行してテストデータファイルをマージし、bzip2 -dk wiki-articles-500w.json.bz2コマンドを実行してパッケージを解凍します。
性能テスト結果
BM25インデックスを作成するのに必要な時間は、GIN(tsvector) インデックスを作成するのに必要な時間の約63% です。
単項クエリに関して、BM25インデックスの1秒あたりのクエリ (QPS) パフォーマンスは、GIN(tsvector) インデックスのQPSパフォーマンスの6〜7倍です。
多項クエリに関して、BM25インデックスのQPS性能は、GIN(tsvector) インデックスのQPS性能の6〜11倍である。
単項ANDポイントクエリに関して、BM25インデックスのQPSパフォーマンスは、GIN(tsvector) およびBツリーインデックスのQPSパフォーマンスの6〜9倍です。
単項AND範囲クエリに関して、BM25インデックスのQPSパフォーマンスは、GIN(tsvector) およびBツリーインデックスのQPSパフォーマンスの1〜9倍です。
インデックスの作成
インデックス | データのインポートに必要な時間 | インデックスの作成に必要な時間 | ストリームインポートに必要な時間 (インデックス付き) |
BM25 | 24分 | 36分 | 84分 |
ジン (tsvector) | 137分 | 57分 | 非該当 |
単一用語クエリの実行
body列に用語を含む上位20件の結果を照会します。 例: body:Gabriel Basso 上位20件の結果の中で、項の平均発生率は56,685です。 次の表に、最大QPS値と対応する応答時間 (RT) 値を示します。
同時実行 | BM25 | ジン (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 | 1,234.45 | 39.64 | 203.91 | 616.93 |
多用語クエリの実行
body列に1つ以上の用語を含む上位20件の結果を照会します。 例: body:handsworth OR body:cern すべての用語はテストデータセットから抽出されます。 出現が100未満である用語は含まれない。 各クエリに含まれる用語の数は、重み分布パラメータ [0.03、0.15、0.25、0.25、0.15、0.08、0.04、0.03、0.02] に準拠しています。 この場合、クエリの3% は1つの用語を含み、クエリの15% は2つの用語を含む。
同時実行 | BM25 | ジン (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 | 1,161.79 | 8.58 | 112.89 | 87.40 |
20 | 1,332.61 | 15.03 | 118.87 | 159.25 |
30 | 1,380.56 | 21.66 | 120.93 | 264.10 |
40 | 1,470.47 | 26.73 | 131.87 | 341.69 |
単項ANDポイントクエリの実行
ポイントのクエリ条件に基づいて、1行のデータのみが一致します。
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 | ジン (tsvector) とBツリー | ||
QPS | RT (ms) | QPS | RT (ms) | |
1 | 342.92 | 2.81 | 2.00 | 985.66 |
5 | 1,434.90 | 3.30 | 4.99 | 2,401.95 |
10 | 2,293.54 | 4.21 | 6.99 | 4,306.61 |
20 | 3,084.70 | 6.32 | 13.98 | 8,536.26 |
30 | 2,835.97 | 10.38 | 19.98 | 12,565.44 |
40 | 3,081.71 | 12.78 | 24.97 | 17,342.22 |
単項AND範囲クエリの実行
1万行のデータが一致し、99.99% のデータが範囲クエリ条件に基づいて除外されます。
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 | ジン (tsvector) とBツリー | ||
QPS | RT (ms) | QPS | RT (ms) | |
1 | 9.99 | 110.55 | 1.00 | 1,189.95 |
5 | 22.97 | 229.57 | 4.99 | 2,074.63 |
10 | 25.97 | 451.81 | 8.99 | 4,236.33 |
20 | 32.97 | 951.86 | 14.99 | 8,674.06 |
30 | 29.97 | 1,366.22 | 19.98 | 13,458.88 |
40 | 39.97 | 2,071.66 | 32.96 | 18,251.81 |