Бенчмаркинг SSB с плоской таблицей
Star schema benchmark (SSB) предназначен для тестирования базовых метрик производительности продуктов OLAP баз данных. SSB использует тестовый набор со схемой звезды, который широко применяется в академических кругах и промышленности. Для получения дополнительной информации см. статью Star Schema Benchmark. ClickHouse преобразует схему звезды в широкую плоскую таблицу и переписывает SSB в бенчмарк с одной таблицей. Для получения дополнительной информации см. Star schema benchmark of ClickHouse Этот тест сравнивает производительность Selena, Apache Druid и ClickHouse на наборах данных SSB с одной таблицей.
Заключение теста
- Среди 13 запросов, выполненных на стандартных наборах данных SSB, Selena показывает общую производительность запросов в 2.1 раза выше, чем у ClickHouse, и в 8.7 раза выше, чем у Apache Druid.
- После включения Bitmap Indexing в Selena производительность в 1.3 раза выше по сравнению с отключенной функцией. Общая производительность Selena в 2.8 раза выше, чем у ClickHouse, и в 11.4 раза выше, чем у Apache Druid.

Подготовка к тесту
Оборудование
| Машина | 4 облачных хоста |
|---|---|
| CPU | 16-Core Intel (R) Xeon (R) Platinum 8269CY CPU @2.50GHz Размер кэша: 36608 KB |
| Память | 64 GB |
| Пропускная способность сети | 5 Gbit/s |
| Диск | ESSD |
Программное обеспечение
Selena, Apache Druid и ClickHouse развернуты на хостах с одинаковыми конфигурациями.
- Selena: один FE и три BE. FE может быть развернут отдельно или гибридно с BE.
- ClickHouse: три узла с распределенными таблицами
- Apache Druid: три узла. Один развернут с Master Servers и Data Servers, один развернут с Query Servers и Data Servers, а третий развернут только с Data Servers.
Версия ядра: Linux 3.10.0-1160.59.1.el7.x86_64
Версия ОС: CentOS Linux release 7.9.2009
Версия программного обеспечения: Selena Community Version 3.0, ClickHouse 23.3, Apache Druid 25.0.0
Тестовые данные и результаты
Тестовые данные
| Таблица | Записи | Описание |
|---|---|---|
| lineorder | 600 миллионов | Таблица фактов Lineorder |
| customer | 3 миллиона | Таблица измерений Customer |
| part | 1.4 миллиона | Таблица измерений Parts |
| supplier | 200 тысяч | Таблица измерений Supplier |
| dates | 2,556 | Таблица измерений Date |
| lineorder_flat | 600 миллионов | плоская таблица lineorder |
Результаты тестов
В следующей таблице показаны результаты тестирования производительности по тринадцати запросам. Единица измерения задержки запроса - мс. Все запросы прогреваются 1 раз, а затем выполняются 3 раза для получения среднего значения в качестве результата. ClickHouse vs Selena в заголовке таблицы означает деление времени ответа запроса ClickHouse на время ответа запроса Selena. Большее значение указывает на лучшую производительность Selena.
| Selena-3.0 | Selena-3.0-index | ClickHouse-23.3 | ClickHouse vs Selena | Druid-25.0.0 | Druid vs Selena | |
|---|---|---|---|---|---|---|
| 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. В следующих разделах описывается генерация данных и загрузка данных в Selena.
Генерация данных
Загрузите набор инструментов 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
Создание схемы таблицы
-
Измените файл конфигурации
conf/starrocks.confи укажите адрес кластера. Обратите особое внимание наmysql_hostиmysql_port. -
Выполните следующую команду для создания таблицы:
sh bin/create_db_table.sh ddl_100
Запрос данных
sh bin/benchmark.sh ssb-flat
Включение Bitmap Indexing
Selena работает лучше с включенным Bitmap Indexing. Если вы хотите протестировать производительность Selena с включенным Bitmap Indexing, особенно на Q2.2, Q2.3 и Q3.3, вы можете создать Bitmap Indexes для всех столбцов STRING.
-
Создайте еще одну таблицу
lineorder_flatи создайте Bitmap Indexes.sh bin/create_db_table.sh ddl_100_bitmap_index -
Добавьте следующую конфигурацию в файл
be.confвсех BE и перезапустите BE для вступления конфигураций в силу.bitmap_max_filter_ratio=1000 -
Запустите скрипт загрузки данных.
sh bin/flat_insert.sh data_dir
После загрузки данных дождитесь завершения compaction версии данных, а затем снова выполните 4.4 для запроса данных после включения Bitmap Indexing.
Вы можете просмотреть прогресс compaction версии данных, выполнив select CANDIDATES_NUM from information_schema.be_compactions. Для трех узлов BE следующие результаты показывают, что compaction завершен:
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 по умолчанию
Следующий оператор соответствует текущему размеру кластера и размеру данных (три BE, scale factor = 100). Если ваш кластер имеет больше узлов BE или больший размер данных, вы можете настроить количество buckets, создать таблицу заново и загрузить данные заново для достижения лучших результатов тестирования.
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 с Bitmap Indexes
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");