メインコンテンツまでスキップ
バージョン: Latest-3.4

SSB フラットテーブルベンチマーク

スタースキーマベンチマーク (SSB) は、OLAP データベース製品の基本的なパフォーマンス指標をテストするために設計されています。SSB は、学術界や産業界で広く適用されているスタースキーマのテストセットを使用します。詳細については、論文 Star Schema Benchmark を参照してください。 ClickHouse はスタースキーマを広いフラットテーブルに変換し、SSB を単一テーブルのベンチマークに書き換えます。詳細については、Star schema benchmark of ClickHouse を参照してください。 このテストでは、StarRocks、Apache Druid、および ClickHouse の SSB 単一テーブルデータセットに対するパフォーマンスを比較します。

テスト結論

  • SSB 標準データセットで実行された 13 のクエリのうち、StarRocks は全体的なクエリパフォーマンスが ClickHouse の 2.1 倍、Apache Druid の 8.7 倍 です。
  • StarRocks のビットマップインデックスが有効化されると、無効化時と比較してパフォーマンスが 1.3 倍になります。StarRocks の全体的なパフォーマンスは ClickHouse の 2.8 倍、Apache Druid の 11.4 倍 です。

overall comparison

テスト準備

ハードウェア

マシン4 クラウドホスト
CPU16-Core 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 つの BEs。FE は BEs と別々またはハイブリッドでデプロイできます。
  • ClickHouse: 分散テーブルを持つ 3 つのノード
  • Apache Druid: 3 つのノード。1 つはマスターサーバーとデータサーバーでデプロイされ、1 つはクエリサーバーとデータサーバーでデプロイされ、3 つ目はデータサーバーのみでデプロイされます。

カーネルバージョン: 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

テストデータと結果

テストデータ

テーブルレコード説明
lineorder6 億Lineorder ファクトテーブル
customer300 万Customer 次元テーブル
part140 万Parts 次元テーブル
supplier20 万Supplier 次元テーブル
dates2,556Date 次元テーブル
lineorder_flat6 億lineorder フラットテーブル

テスト結果

以下の表は、13 のクエリに対するパフォーマンステスト結果を示しています。クエリの遅延の単位は ms です。すべてのクエリは 1 回ウォームアップされ、その後 3 回実行され、平均値が結果として取られます。表のヘッダーにある ClickHouse vs StarRocks は、ClickHouse のクエリ応答時間を StarRocks のクエリ応答時間で割った値を意味します。値が大きいほど、StarRocks のパフォーマンスが優れていることを示します。

StarRocks-3.0StarRocks-3.0-indexClickHouse-23.3ClickHouse vs StarRocksDruid-25.0.0Druid vs StarRocks
Q1.13330481.4543013.03
Q1.21010151.5027027.00
Q1.32330140.6182035.65
Q2.11861163011.627604.09
Q2.2156502731.759205.90
Q2.373362553.4991012.47
Q3.11732333982.3010806.24
Q3.2120803192.668507.08
Q3.3123302271.858907.24
Q3.41316181.3875057.69
Q4.12031964692.3112306.06
Q4.273761602.19102013.97
Q4.350361482.9682016.40
sum123693926452.14107508.70

テスト手順

ClickHouse のテーブルを作成し、テーブルにデータをロードする方法の詳細については、ClickHouse official doc を参照してください。以下のセクションでは、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 標準データセット scale factor=100 のデータを生成します。

sh bin/gen-ssb.sh 100 data_dir

テーブルスキーマの作成

  1. 設定ファイル conf/starrocks.conf を変更し、クラスタのアドレスを指定します。特に mysql_hostmysql_port に注意してください。

  2. テーブルを作成するために、以下のコマンドを実行します。

    sh bin/create_db_table.sh ddl_100

データのクエリ

sh bin/benchmark.sh ssb-flat

ビットマップインデックスの有効化

StarRocks はビットマップインデックスが有効化されるとより良いパフォーマンスを発揮します。特に Q2.2、Q2.3、および Q3.3 でビットマップインデックスが有効化された StarRocks のパフォーマンスをテストしたい場合は、すべての STRING 列にビットマップインデックスを作成できます。

  1. 別の lineorder_flat テーブルを作成し、ビットマップインデックスを作成します。

    sh bin/create_db_table.sh ddl_100_bitmap_index
  2. すべての BEs の be.conf ファイルに以下の設定を追加し、設定が有効になるように BEs を再起動します。

    bitmap_max_filter_ratio=1000
  3. データロードスクリプトを実行します。

    sh bin/flat_insert.sh data_dir

データがロードされた後、データバージョンのコンパクションが完了するのを待ち、ビットマップインデックスが有効化された後にデータをクエリするために再度 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;

テーブル作成ステートメント

デフォルトの lineorder_flat テーブル

以下のステートメントは、現在のクラスタサイズとデータサイズ (3 つの BEs、スケールファクター = 100) に一致します。クラスタにより多くの BE ノードがある場合や、データサイズが大きい場合は、バケットの数を調整し、テーブルを再作成し、データを再ロードすることで、より良いテスト結果を得ることができます。

CREATE TABLE `lineorder_flat` (
`LO_ORDERDATE` date NOT NULL COMMENT "",
`LO_ORDERKEY` int(11) NOT NULL COMMENT "",
`LO_LINENUMBER` tinyint(4) NOT NULL COMMENT "",
`LO_CUSTKEY` int(11) NOT NULL COMMENT "",
`LO_PARTKEY` int(11) NOT NULL COMMENT "",
`LO_SUPPKEY` int(11) NOT NULL COMMENT "",
`LO_ORDERPRIORITY` varchar(100) NOT NULL COMMENT "",
`LO_SHIPPRIORITY` tinyint(4) NOT NULL COMMENT "",
`LO_QUANTITY` tinyint(4) NOT NULL COMMENT "",
`LO_EXTENDEDPRICE` int(11) NOT NULL COMMENT "",
`LO_ORDTOTALPRICE` int(11) NOT NULL COMMENT "",
`LO_DISCOUNT` tinyint(4) NOT NULL COMMENT "",
`LO_REVENUE` int(11) NOT NULL COMMENT "",
`LO_SUPPLYCOST` int(11) NOT NULL COMMENT "",
`LO_TAX` tinyint(4) NOT NULL COMMENT "",
`LO_COMMITDATE` date NOT NULL COMMENT "",
`LO_SHIPMODE` varchar(100) NOT NULL COMMENT "",
`C_NAME` varchar(100) NOT NULL COMMENT "",
`C_ADDRESS` varchar(100) NOT NULL COMMENT "",
`C_CITY` varchar(100) NOT NULL COMMENT "",
`C_NATION` varchar(100) NOT NULL COMMENT "",
`C_REGION` varchar(100) NOT NULL COMMENT "",
`C_PHONE` varchar(100) NOT NULL COMMENT "",
`C_MKTSEGMENT` varchar(100) NOT NULL COMMENT "",
`S_NAME` varchar(100) NOT NULL COMMENT "",
`S_ADDRESS` varchar(100) NOT NULL COMMENT "",
`S_CITY` varchar(100) NOT NULL COMMENT "",
`S_NATION` varchar(100) NOT NULL COMMENT "",
`S_REGION` varchar(100) NOT NULL COMMENT "",
`S_PHONE` varchar(100) NOT NULL COMMENT "",
`P_NAME` varchar(100) NOT NULL COMMENT "",
`P_MFGR` varchar(100) NOT NULL COMMENT "",
`P_CATEGORY` varchar(100) NOT NULL COMMENT "",
`P_BRAND` varchar(100) NOT NULL COMMENT "",
`P_COLOR` varchar(100) NOT NULL COMMENT "",
`P_TYPE` varchar(100) NOT NULL COMMENT "",
`P_SIZE` tinyint(4) NOT NULL COMMENT "",
`P_CONTAINER` varchar(100) NOT NULL COMMENT ""
) ENGINE=OLAP
DUPLICATE KEY(`LO_ORDERDATE`, `LO_ORDERKEY`)
COMMENT "OLAP"
PARTITION BY date_trunc('year', `LO_ORDERDATE`)
DISTRIBUTED BY HASH(`LO_ORDERKEY`) BUCKETS 48
PROPERTIES ("replication_num" = "1");

ビットマップインデックス付きの lineorder_flat テーブル

CREATE TABLE `lineorder_flat` (
`LO_ORDERDATE` date NOT NULL COMMENT "",
`LO_ORDERKEY` int(11) NOT NULL COMMENT "",
`LO_LINENUMBER` tinyint(4) NOT NULL COMMENT "",
`LO_CUSTKEY` int(11) NOT NULL COMMENT "",
`LO_PARTKEY` int(11) NOT NULL COMMENT "",
`LO_SUPPKEY` int(11) NOT NULL COMMENT "",
`LO_ORDERPRIORITY` varchar(100) NOT NULL COMMENT "",
`LO_SHIPPRIORITY` tinyint(4) NOT NULL COMMENT "",
`LO_QUANTITY` tinyint(4) NOT NULL COMMENT "",
`LO_EXTENDEDPRICE` int(11) NOT NULL COMMENT "",
`LO_ORDTOTALPRICE` int(11) NOT NULL COMMENT "",
`LO_DISCOUNT` tinyint(4) NOT NULL COMMENT "",
`LO_REVENUE` int(11) NOT NULL COMMENT "",
`LO_SUPPLYCOST` int(11) NOT NULL COMMENT "",
`LO_TAX` tinyint(4) NOT NULL COMMENT "",
`LO_COMMITDATE` date NOT NULL COMMENT "",
`LO_SHIPMODE` varchar(100) NOT NULL COMMENT "",
`C_NAME` varchar(100) NOT NULL COMMENT "",
`C_ADDRESS` varchar(100) NOT NULL COMMENT "",
`C_CITY` varchar(100) NOT NULL COMMENT "",
`C_NATION` varchar(100) NOT NULL COMMENT "",
`C_REGION` varchar(100) NOT NULL COMMENT "",
`C_PHONE` varchar(100) NOT NULL COMMENT "",
`C_MKTSEGMENT` varchar(100) NOT NULL COMMENT "",
`S_NAME` varchar(100) NOT NULL COMMENT "",
`S_ADDRESS` varchar(100) NOT NULL COMMENT "",
`S_CITY` varchar(100) NOT NULL COMMENT "",
`S_NATION` varchar(100) NOT NULL COMMENT "",
`S_REGION` varchar(100) NOT NULL COMMENT "",
`S_PHONE` varchar(100) NOT NULL COMMENT "",
`P_NAME` varchar(100) NOT NULL COMMENT "",
`P_MFGR` varchar(100) NOT NULL COMMENT "",
`P_CATEGORY` varchar(100) NOT NULL COMMENT "",
`P_BRAND` varchar(100) NOT NULL COMMENT "",
`P_COLOR` varchar(100) NOT NULL COMMENT "",
`P_TYPE` varchar(100) NOT NULL COMMENT "",
`P_SIZE` tinyint(4) NOT NULL COMMENT "",
`P_CONTAINER` varchar(100) NOT NULL COMMENT "",
index bitmap_lo_orderpriority (lo_orderpriority) USING BITMAP,
index bitmap_lo_shipmode (lo_shipmode) USING BITMAP,
index bitmap_c_name (c_name) USING BITMAP,
index bitmap_c_address (c_address) USING BITMAP,
index bitmap_c_city (c_city) USING BITMAP,
index bitmap_c_nation (c_nation) USING BITMAP,
index bitmap_c_region (c_region) USING BITMAP,
index bitmap_c_phone (c_phone) USING BITMAP,
index bitmap_c_mktsegment (c_mktsegment) USING BITMAP,
index bitmap_s_region (s_region) USING BITMAP,
index bitmap_s_nation (s_nation) USING BITMAP,
index bitmap_s_city (s_city) USING BITMAP,
index bitmap_s_name (s_name) USING BITMAP,
index bitmap_s_address (s_address) USING BITMAP,
index bitmap_s_phone (s_phone) USING BITMAP,
index bitmap_p_name (p_name) USING BITMAP,
index bitmap_p_mfgr (p_mfgr) USING BITMAP,
index bitmap_p_category (p_category) USING BITMAP,
index bitmap_p_brand (p_brand) USING BITMAP,
index bitmap_p_color (p_color) USING BITMAP,
index bitmap_p_type (p_type) USING BITMAP,
index bitmap_p_container (p_container) USING BITMAP
) ENGINE=OLAP
DUPLICATE KEY(`LO_ORDERDATE`, `LO_ORDERKEY`)
COMMENT "OLAP"
PARTITION BY date_trunc('year', `LO_ORDERDATE`)
DISTRIBUTED BY HASH(`LO_ORDERKEY`) BUCKETS 48
PROPERTIES ("replication_num" = "1");