SSB Benchmark
SSBフラットテーブルベンチマーク
スタースキーマベンチマーク(SSB)は、OLAPデータベース製品の基本的なパフォーマンス指標をテストするために設計されています。SSBは、学界や産業界で広く使用されているスタースキーマテストセットを使用しています。詳細については、Star Schema Benchmarkの論文を参照してください。 ClickHouseは、スタースキーマをワイドなフラットテーブルに変換し、SSBを単一テーブルのベンチマークに再構築します。詳細については、「ClickHouseのスタースキーマベンチマーク」を参照してください。 このテストでは、SSB単一テーブルデータセットに対するStarRocks、Apache Druid、およびClickHouseのパフォーマンスを比較します。
テスト結論
- SSB標準データセット上で行われた13のクエリのうち、StarRocksの全体的なクエリパフォーマンスはClickHouseの2.1倍、Apache Druidの8.7倍でした。
- StarRocksのBitmapインデックスを有効にすると、パフォーマンスはこの機能を無効にした場合と比較して1.3倍向上します。StarRocksの全体的なパフォーマンスは、ClickHouseの2.8倍、Apache Druidの11.4倍です。
テストの準備
ハードウェア
| マシン | 3つのクラウドホスト | 
|---|---|
| CPU | 16コアのIntel(R) Xeon(R) Platinum 8269CY CPU @2.50GHz キャッシュサイズ:36608 KB | 
| メモリ | 64 GB | 
| ネットワーク帯域幅 | 5 Gbit/s | 
| ディスク | ESSD | 
ソフトウェア
StarRocks、Apache Druid、およびClickHouseは、同じ構成のホストに展開されます。
- StarRocks:1つのFEと3つのBE。FEは、BEとは別々にまたはハイブリッド展開されることができます。
- ClickHouse:分散テーブルを持つ3つのノード
- Apache Druid:3つのノード。1つはMasterサーバーとDataサーバーで展開され、1つはQueryサーバーとDataサーバーで展開され、3番目のノードはDataサーバーのみで展開されます。
カーネルバージョン:Linux 3.10.0-1160.59.1.el7.x86_64
OSバージョン:CentOS Linuxリリース7.9.2009
ソフトウェアバージョン:StarRocks Community Version 3.0、ClickHouse 23.3、Apache Druid 25.0.0
テストデータと結果
テストデータ
| テーブル | レコード数 | 説明 | 
|---|---|---|
| lineorder | 6億 | Lineorderファクトテーブル | 
| customer | 300万 | Customerディメンションテーブル | 
| part | 140万 | Partsディメンションテーブル | 
| supplier | 20万 | Supplierディメンションテーブル | 
| dates | 2,556 | 日付ディメンションテーブル | 
| lineorder_flat | 6億 | Lineorderフラットテーブル | 
テスト結果
以下のテーブルは、13のクエリのパフォーマンステスト結果を示しています。クエリのレイテンシの単位はミリ秒です。「表ヘッダーのClickHouse vs StarRocks」は、ClickHouseのクエリ応答時間をStarRocksのクエリ応答時間で割ったものです。値が大きいほど、StarRocksのパフォーマンスが良いことを示します。
| StarRocks-3.0 | StarRocks-3.0-index | ClickHouse-23.3 | ClickHouse vs StarRocks | Druid-25.0.0 | Druid vs StarRocks | |
|---|---|---|---|---|---|---|
| Q1.1 | 33 | 30 | 48 | 1.45 | 430 | 13.03 | 
| Q1.2 | 10 | 10 | 15 | 1.50 | 270 | 27.00 | 
| Q1.3 | 23 | 30 | 14 | 0.61 | 820 | 35.65 | 
| Q2.1 | 186 | 116 | 301 | 1.62 | 760 | 4.09 | 
| Q2.2 | 156 | 50 | 273 | 1.75 | 920 | 5.90 | 
| Q2.3 | 73 | 36 | 255 | 3.49 | 910 | 12.47 | 
| Q3.1 | 173 | 233 | 398 | 2.30 | 1080 | 6.24 | 
| Q3.2 | 120 | 80 | 319 | 2.66 | 850 | 7.08 | 
| Q3.3 | 123 | 30 | 227 | 1.85 | 890 | 7.24 | 
| Q3.4 | 13 | 16 | 18 | 1.38 | 750 | 57.69 | 
| Q4.1 | 203 | 196 | 469 | 2.31 | 1230 | 6.06 | 
| Q4.2 | 73 | 76 | 160 | 2.19 | 1020 | 13.97 | 
| Q4.3 | 50 | 36 | 148 | 2.96 | 820 | 16.40 | 
| sum | 1236 | 939 | 2645 | 2.14 | 10750 | 8.70 | 
テスト手順
ClickHouseテーブルの作成方法とデータのロード方法の詳細については、ClickHouse公式ドキュメントを参照してください。以下のセクションでは、StarRocksのデータ生成およびデータロードについて説明します。
データの生成
ssb-pocツールキットをダウンロードし、コンパイルします。
wget https://starrocks-public.oss-cn-zhangjiakou.aliyuncs.com/ssb-poc-1.0.zip
unzip ssb-poc-1.0.zip
cd ssb-poc-1.0/
make && make install
cd output/
コンパイル後、関連するすべてのツールがoutputディレクトリにインストールされ、以下の操作はすべてこのディレクトリで実行されます。
はじめに、SSB標準データセット スケールファクター=100 用のデータを生成します。
sh bin/gen-ssb.sh 100 data_dir
テーブルスキーマの作成
- 構成ファイル conf/starrocks.confを編集し、クラスターアドレスを指定します。特にmysql_hostとmysql_portに注意してください。
- 次のコマンドを実行してテーブルを作成します。
sh bin/create_db_table.sh ddl_100
データのクエリ
sh bin/benchmark.sh ssb-flat
Bitmapインデックスの有効化
StarRocksは、Bitmapインデックスを有効にするとより良いパフォーマンスを発揮します。特にQ2.2、Q2.3、およびQ3.3におけるStarRocksのパフォーマンスをテストしたい場合は、すべてのSTRING列に対してBitmapインデックスを作成できます。
- 
別の lineorder_flatテーブルを作成し、Bitmapインデックスを作成します。sh bin/create_db_table.sh ddl_100_bitmap_index
- 
すべてのBEの be.confファイルに以下の設定を追加し、BEを再起動して設定が有効になるようにします。bitmap_max_filter_ratio=1000
- 
データロードスクリプトを実行します。 sh bin/flat_insert.sh data_dir
データがロードされるまで待機し、データバージョンのコンパクションが完了した後、Bitmapインデックスが有効になった後のデータを再度問い合わせるために4.4を実行します。
select CANDIDATES_NUM from information_schema.be_compactions を実行してデータバージョンのコンパクションの進行状況を表示することができます。3つのBEノードに対して、以下の結果はコンパクショ ンが完了していることを示しています。
mysql> select CANDIDATES_NUM from information_schema.be_compactions;
+----------------+
| CANDIDATES_NUM |
+----------------+
|              0 |
|              0 |
|              0 |
+----------------+
3 rows in set (0.01 sec)
テストのSQLとテーブル作成文
テストのSQL
--Q1.1 
SELECT sum(lo_extendedprice * lo_discount) AS `revenue` 
FROM lineorder_flat 
WHERE lo_orderdate >= '1993-01-01' and lo_orderdate <= '1993-12-31'
AND lo_discount BETWEEN 1 AND 3 AND lo_quantity < 25; 
 
--Q1.2 
SELECT sum(lo_extendedprice * lo_discount) AS revenue FROM lineorder_flat  
WHERE lo_orderdate >= '1994-01-01' and lo_orderdate <= '1994-01-31'
AND lo_discount BETWEEN 4 AND 6 AND lo_quantity BETWEEN 26 AND 35; 
 
--Q1.3 
SELECT sum(lo_extendedprice * lo_discount) AS revenue 
FROM lineorder_flat 
WHERE weekofyear(lo_orderdate) = 6
AND lo_orderdate >= '1994-01-01' and lo_orderdate <= '1994-12-31' 
AND lo_discount BETWEEN 5 AND 7 AND lo_quantity BETWEEN 26 AND 35; 
 
--Q2.1 
SELECT sum(lo_revenue), year(lo_orderdate) AS year,  p_brand 
FROM lineorder_flat 
WHERE p_category = 'MFGR#12' AND s_region = 'AMERICA' 
GROUP BY year, p_brand 
ORDER BY year, p_brand; 
 
--Q2.2
SELECT 
sum(lo_revenue), year(lo_orderdate) AS year, p_brand 
FROM lineorder_flat 
WHERE p_brand >= 'MFGR#2221' AND p_brand <= 'MFGR#2228' AND s_region = 'ASIA' 
GROUP BY year, p_brand 
ORDER BY year, p_brand; 
  
--Q2.3
SELECT sum(lo_revenue), year(lo_orderdate) AS year, p_brand 
FROM lineorder_flat 
WHERE p_brand = 'MFGR#2239' AND s_region = 'EUROPE' 
GROUP BY year, p_brand 
ORDER BY year, p_brand; 
 
--Q3.1
SELECT
    c_nation,
    s_nation,
    year(lo_orderdate) AS year,
    sum(lo_revenue) AS revenue FROM lineorder_flat 
WHERE c_region = 'ASIA' AND s_region = 'ASIA' AND lo_orderdate >= '1992-01-01'
AND lo_orderdate <= '1997-12-31' 
GROUP BY c_nation, s_nation, year 
ORDER BY  year ASC, revenue DESC; 
 
--Q3.2 
SELECT c_city, s_city, year(lo_orderdate) AS year, sum(lo_revenue) AS revenue
FROM lineorder_flat 
WHERE c_nation = 'UNITED STATES' AND s_nation = 'UNITED STATES'
AND lo_orderdate  >= '1992-01-01' AND lo_orderdate <= '1997-12-31' 
GROUP BY c_city, s_city, year 
ORDER BY year ASC, revenue DESC; 
 
--Q3.3 
SELECT c_city, s_city, year(lo_orderdate) AS year, sum(lo_revenue) AS revenue 
FROM lineorder_flat 
WHERE c_city in ( 'UNITED KI1' ,'UNITED KI5') AND s_city in ('UNITED KI1', 'UNITED KI5')
AND lo_orderdate  >= '1992-01-01' AND lo_orderdate <= '1997-12-31' 
GROUP BY c_city, s_city, year 
ORDER BY year ASC, revenue DESC; 
 
--Q3.4 
SELECT c_city, s_city, year(lo_orderdate) AS year, sum(lo_revenue) AS revenue 
FROM lineorder_flat 
WHERE c_city in ('UNITED KI1', 'UNITED KI5') AND s_city in ('UNITED KI1', 'UNITED KI5')
AND lo_orderdate  >= '1997-12-01' AND lo_orderdate <= '1997-12-31' 
GROUP BY c_city, s_city, year 
ORDER BY year ASC, revenue DESC; 
 
--Q4.1 
SELECT year(lo_orderdate) AS year, c_nation, sum(lo_revenue - lo_supplycost) AS profit
FROM lineorder_flat 
WHERE c_region = 'AMERICA' AND s_region = 'AMERICA' AND p_mfgr in ('MFGR#1', 'MFGR#2') 
GROUP BY year, c_nation 
ORDER BY year ASC, c_nation ASC; 
 
--Q4.2 
SELECT year(lo_orderdate) AS year, 
    s_nation, p_category, sum(lo_revenue - lo_supplycost) AS profit 
FROM lineorder_flat 
WHERE c_region = 'AMERICA' AND s_region = 'AMERICA'
AND lo_orderdate >= '1997-01-01' and lo_orderdate <= '1998-12-31'
AND p_mfgr in ( 'MFGR#1' , 'MFGR#2') 
GROUP BY year, s_nation, p_category 
ORDER BY year ASC, s_nation ASC, p_category ASC; 
 
--Q4.3 
SELECT year(lo_orderdate) AS year, s_city, p_brand, 
    sum(lo_revenue - lo_supplycost) AS profit 
FROM lineorder_flat 
WHERE s_nation = 'UNITED STATES'
AND lo_orderdate >= '1997-01-01' and lo_orderdate <= '1998-12-31'
AND p_category = 'MFGR#14' 
GROUP BY year, s_city, p_brand 
ORDER BY year ASC, s_city ASC, p_brand ASC;