云数据库 SelectDB 版致力于提供极致性能、简单易用的数据分析服务,在宽表聚合、多表关联和高并发点查等场景下均具有优异的性能表现。本文将介绍如何通过 SSB 标准测试及 SSB flat 测试评估 SelectDB 在 SSB 1000 GB 测试集上的性能表现。
概述
星型模式基准测试(SSB,Star Schema Benchmark)是一个轻量级的数仓场景下的性能测试集。SSB基于TPC-H提供了一个简化版的星型模型数据集,主要用于测试在星型模型下,多表关联查询的性能表现。另外,业界内通常也会将 SSB 打平为宽表模型(以下简称:SSB Flat),来测试查询引擎的性能。
包括SSB在内的标准测试集通常和实际业务场景差距较大,并且部分测试会针对测试集进行参数调优。所以标准测试集的测试结果仅能反映数据库在特定场景下的性能表现。建议您使用实际业务数据进行进一步的测试。
准备工作
步骤一:准备目标实例
准备实例。
如果您已有目标实例,您需根据以下要求检查实例配置。
如果您还没有目标实例,您需创建实例。
本文中进行性能测试所用实例需满足以下要求。
内核版本大于等于4.0。
如果您已有目标实例,但版本小于4.0,您可升级实例达到版本要求。具体操作,请参见升级内核版本。
规格需高于或等于96核 384 GB。本文中的测试基于96核 384 GB的规格进行。
集群缓存空间需大于等于1200 GB。本文中的测试基于1200 GB的缓存空间进行。
修改
streaming_load_max_mb
参数至最大值。在测试过程中,工具通过Stream load方式将测试数据上传至SelectDB。由于本次测试数据量较大,已超过默认的Stream load最大导入限制10240MB,因此您需要将BE的参数streaming_load_max_mb调整至最大值10240000MB。如何修改参数,请参见参数配置。
创建待导入测试数据的目标库。
如果您已有目标库,跳过此操作。
连接实例,具体操作,请参见通过MySQL客户端连接云数据库SelectDB版实例。
建库。
本次测试的目标库为test_db。建表语句如下。
CREATE DATABASE test_db;
步骤二:准备测试服务器
下述安装依赖工具的脚本适用于操作系统为Linux的服务器。如果您的服务器操作系统非Linux,您需自行修改安装脚本,以使其适应您的操作系统。
注意事项
您的服务器需注意以下事项。
如果您准备在服务器使用Git下载SSB测试工具。您需开通公网。
新购ECS实例:需购买ECS时,公网 IP勾选分配公网 IPv4 地址。
已有ECS实例但未开通公网:ECS开通公网,请参见开通公网。
此次测试数据集生成的数据文件约1000GB,需确保服务器的内存足够大。
操作步骤
创建目标服务器。
如果您已有目标服务器,跳过此步骤。
如果您还没有目标服务器,您可自定义购买ECS实例,镜像选择Alibaba Cloud Linux。
安装测试中的依赖工具MySQL客户端。
yum install mysql
(可选)安装Git。
本次测试中,使用Git下载SSB工具。若已通过其他方式获取SSB工具并准备手动上传至服务器,可跳过此步骤。
yum install git
步骤三:确保网络互通
确保将安装SSB测试工具的目标服务器与SelectDB实例网络互通:
步骤四:了解本次测试数据集
本次测试SSB会生成1000GB的数据,并将其导入SelectDB,以进行SelectDB的性能测试。以下是关于测试数据集为1000GB数据表的相关说明。
SSB表名 | 行数 | 备注 |
lineorder | 5999989709 | 商品订单明细表。 |
customer | 30000000 | 客户信息表。 |
part | 2000000 | 零件信息表。 |
supplier | 2000000 | 供应商信息表。 |
dates | 2556 | 日期表。 |
lineorder_flat | 5999989709 | 数据展平后的宽表。 |
操作步骤
下述脚本适用于操作系统为Linux的服务器。如果您的服务器操作系统非Linux,您需自行修改安装脚本,以使其适应您的操作系统。
步骤一:登录目标服务器
如果您的服务是阿里云ECS,如何登录请参见连接ECS。
其他服务器如何登录,参见各自产品。
步骤二:下载安装SSB数据生成工具
下载工具。
本次测试使用Git下载工具,具体脚本如下。
git clone https://github.com/apache/doris.git && cd ./doris/tools/ssb-tools
您也可以通过ssb-tools链接下载工具后,手动上传至目标服务器。
编译工具。
执行以下脚本,编译工具。
sh bin/build-ssb-dbgen.sh
步骤三:生成SSB测试数据集
数据量越大,生成时间越长,具体取决于服务器的性能。
您需在测试工具安装目录下执行生成测试数据集的脚本。
语法如下。
sh bin/gen-ssb-data.sh -s <yourAimDataNum>
参数说明如下。
yourAimDataNum:
含义:需要使用SSB生成的数据大小。
单位:GB
此次测试为中规模测试,需要生成1000 GB(即 1 TB)的测试数据集。该步骤所需时间可能较长,建议您将该任务置于后台执行,语句如下。
nohup sh bin/gen-ssb-data.sh -s 1000 > gen-ssb-data.log 2>&1 &
执行结果会保存在测试工具安装目录下的gen-ssb-data.log文件中,可通过查看该文件获取执行过程是否正常。
测试数据结果集将保存在测试工具安装目录的bin目录下的ssb-data
目录中,数据文件后缀为.tbl
。
若在数据生成过程中报“bang!”警告,且已确认生成测试数据所在的磁盘空间充足,则可能是生成工具的并发控制问题,可以忽略。
步骤四:使用脚本为SelectDB创建SSB测试表
配置SelectDB实例信息
在执行建表脚本前,需要在
doris-cluster.conf
文件中,配置SelectDB实例的相关信息。该文件位于测试工具安装目录ssb-tools/conf/
下。示例如下。# Any of FE host export FE_HOST='selectdb-cn-****.selectdbfe.rds.aliyuncs.com' # http_port in fe.conf export FE_HTTP_PORT=8080 # query_port in fe.conf export FE_QUERY_PORT=9030 # Doris username export USER='admin' # Doris password export PASSWORD='****' # The database where SSB tables located export DB='test_db'
参数说明如下。
参数名称
参数描述
FE_HOST
SelectDB实例的访问地址。
您可以从SelectDB控制台的实例详情中的网络信息中获取实例的VPC地址或公网地址。
FE_HTTP_PORT
SelectDB实例的HTTP协议端口。
您可以从SelectDB控制台的实例详情中的网络信息中获取实例的HTTP协议端口。
FE_QUERY_PORT
您可以从SelectDB控制台的实例详情中的网络信息中获取实例的MySQL协议端口
USER
SelectDB实例账号。
创建SelectDB实例后,系统会默认为您创建admin账号。
PASSWORD
SelectDB实例账号的密码。
如果您的USER配置的是admin账号,但您忘记了此账号的密码,您可以在控制台上重置账号密码。
DB
SelectDB实例中待导入数据的库名。
建表
在测试工具安装目录下,执行以下脚本,创建用以测试的表。脚本执行完成后,SelectDB的目标库中,会生成上述测试数据集中的表。
sh bin/create-ssb-tables.sh -s 1000
步骤五:导入数据至SelectDB
测试数据量越大,导入时间越长,具体取决于服务器的性能。
在测试工具安装目录下,执行以下脚本,将SSB测试集所有数据以及SSB flat宽表数据合成的数据导入至SelectDB。
sh bin/load-ssb-data.sh
此次测试为中规模测试,需要将生成的1000 GB(即 1 TB)的测试数据集导入至SelectDB中。该步骤所需时间可能较长,建议您将该任务置于后台执行,语句如下。
nohup sh bin/load-ssb-data.sh > load-ssb-data.log 2>&1 &
执行结果保存到测试工具安装目录下的load-ssb-data.log文件中,可通过查看该文件获取执行过程是否正常。
步骤六:测试查询性能
测试数据量越大,批量测试时间越长,具体取决于服务器的性能。
SSB 标准测试主要用于评估数据库在 复杂星型模型查询 中的性能,如多表连接、聚合、过滤等。
SSB Flat 测试主要用于可能用于评估数据库在 宽表结构 下的性能,或测试扁平化数据模型对查询效率的影响。
批量测试查询SQL性能
SSB标准测试
您可以执行SSB标准测试的SQL相关脚本,批量执行测试集的SQL。
语法如下。
sh bin/run-ssb-queries.sh -s <yourAimDataNum>
参数说明如下。
yourAimDataNum:确保查询针对正确规模的数据集运行,与生成数据时的规模一致(即生成数据时若用
-s 1000
,运行查询时也需使用-s 1000
)。脚本执行完毕后,控制台窗口将显示测试集中每个SQL在SelectDB中的性能情况。
此次测试为中规模测试,需要测试查询的1000 GB(即 1 TB)的测试数据集。该步骤所需时间可能较长,建议您将该任务置于后台执行,语句如下。
nohup sh bin/run-ssb-queries.sh -s 1000 > run-ssb-queries.log 2>&1 &
批量测试的SQL详情请参见ssb-queries。
查询性能结果将会保存到到测试工具安装目录下的run-ssb-queries.log文件中,可通过查看该文件获取查询过程是否正常的信息以及查询测试的结果。本文档针对1000GB数据的测试结果,请参见测试结果。
SSB-flat测试
您可以执行SSB-Flat测试SQL的相关脚本,批量执行测试集的SQL。
语法如下。
sh bin/run-ssb-flat-queries.sh -s <yourAimDataNum>
参数说明如下。
yourAimDataNum:确保查询针对正确规模的数据集运行,与生成数据时的规模一致(即生成数据时若用
-s 1000
,运行查询时也需使用-s 1000
)。脚本执行完毕后,控制台窗口将显示测试集中每个SQL在SelectDB中的性能情况。
此次测试为中规模测试,需要测试查询的1000 GB(即 1 TB)的测试数据集。该步骤所需时间可能较长,建议您将该任务置于后台执行,语句如下。
nohup sh bin/run-ssb-flat-queries.sh -s 1000 > run-ssb-flat-queries.log 2>&1 &
批量测试的SQL详情请参见ssb-flat-queries。
查询性能结果将会保存到到测试工具安装目录下的run-ssb-flat-queries.log文件中,可通过查看该文件获取查询过程是否正常的信息以及查询测试的结果。本文档针对1000GB数据的测试结果,请参见测试结果。
单条查询SQL性能测试
您也可以对SelectDB执行某个SQL的性能进行测试,具体操作如下:
连接SelectDB实例。具体操作,请参见通过DMS连接云数据库SelectDB版实例。
执行目标SQL。
SSB标准测试
您可以在SSB标准测试查询语句中获取目标SQL,进行执行。
您也可以在本次测试时使用的SQL语句,选取某一条语句进行执行。
--Q1.1 SELECT SUM(lo_extendedprice * lo_discount) AS REVENUE FROM lineorder, dates WHERE lo_orderdate = d_datekey AND d_year = 1993 AND lo_discount BETWEEN 1 AND 3 AND lo_quantity < 25; --Q1.2 SELECT SUM(lo_extendedprice * lo_discount) AS REVENUE FROM lineorder, dates WHERE lo_orderdate = d_datekey AND d_yearmonth = 'Jan1994' 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, dates WHERE lo_orderdate = d_datekey AND d_weeknuminyear = 6 AND d_year = 1994 AND lo_discount BETWEEN 5 AND 7 AND lo_quantity BETWEEN 26 AND 35; --Q2.1 SELECT SUM(lo_revenue), d_year, p_brand FROM lineorder, dates, part, supplier WHERE lo_orderdate = d_datekey AND lo_partkey = p_partkey AND lo_suppkey = s_suppkey AND p_category = 'MFGR#12' AND s_region = 'AMERICA' GROUP BY d_year, p_brand ORDER BY p_brand; --Q2.2 SELECT SUM(lo_revenue), d_year, p_brand FROM lineorder, dates, part, supplier WHERE lo_orderdate = d_datekey AND lo_partkey = p_partkey AND lo_suppkey = s_suppkey AND p_brand BETWEEN 'MFGR#2221' AND 'MFGR#2228' AND s_region = 'ASIA' GROUP BY d_year, p_brand ORDER BY d_year, p_brand; --Q2.3 SELECT SUM(lo_revenue), d_year, p_brand FROM lineorder, dates, part, supplier WHERE lo_orderdate = d_datekey AND lo_partkey = p_partkey AND lo_suppkey = s_suppkey AND p_brand = 'MFGR#2239' AND s_region = 'EUROPE' GROUP BY d_year, p_brand ORDER BY d_year, p_brand; --Q3.1 SELECT c_nation, s_nation, d_year, SUM(lo_revenue) AS REVENUE FROM customer, lineorder, supplier, dates WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND lo_orderdate = d_datekey AND c_region = 'ASIA' AND s_region = 'ASIA' AND d_year >= 1992 AND d_year <= 1997 GROUP BY c_nation, s_nation, d_year ORDER BY d_year ASC, REVENUE DESC; --Q3.2 SELECT c_city, s_city, d_year, SUM(lo_revenue) AS REVENUE FROM customer, lineorder, supplier, dates WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND lo_orderdate = d_datekey AND c_nation = 'UNITED STATES' AND s_nation = 'UNITED STATES' AND d_year >= 1992 AND d_year <= 1997 GROUP BY c_city, s_city, d_year ORDER BY d_year ASC, REVENUE DESC; --Q3.3 SELECT c_city, s_city, d_year, SUM(lo_revenue) AS REVENUE FROM customer, lineorder, supplier, dates WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND lo_orderdate = d_datekey AND ( c_city = 'UNITED KI1' OR c_city = 'UNITED KI5' ) AND ( s_city = 'UNITED KI1' OR s_city = 'UNITED KI5' ) AND d_year >= 1992 AND d_year <= 1997 GROUP BY c_city, s_city, d_year ORDER BY d_year ASC, REVENUE DESC; --Q3.4 SELECT c_city, s_city, d_year, SUM(lo_revenue) AS REVENUE FROM customer, lineorder, supplier, dates WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND lo_orderdate = d_datekey AND ( c_city = 'UNITED KI1' OR c_city = 'UNITED KI5' ) AND ( s_city = 'UNITED KI1' OR s_city = 'UNITED KI5' ) AND d_yearmonth = 'Dec1997' GROUP BY c_city, s_city, d_year ORDER BY d_year ASC, REVENUE DESC; --Q4.1 SELECT d_year, c_nation, SUM(lo_revenue - lo_supplycost) AS PROFIT FROM dates, customer, supplier, part, lineorder WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND lo_partkey = p_partkey AND lo_orderdate = d_datekey AND c_region = 'AMERICA' AND s_region = 'AMERICA' AND ( p_mfgr = 'MFGR#1' OR p_mfgr = 'MFGR#2' ) GROUP BY d_year, c_nation ORDER BY d_year, c_nation; --Q4.2 SELECT d_year, s_nation, p_category, SUM(lo_revenue - lo_supplycost) AS PROFIT FROM dates, customer, supplier, part, lineorder WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND lo_partkey = p_partkey AND lo_orderdate = d_datekey AND c_region = 'AMERICA' AND s_region = 'AMERICA' AND ( d_year = 1997 OR d_year = 1998 ) AND ( p_mfgr = 'MFGR#1' OR p_mfgr = 'MFGR#2' ) GROUP BY d_year, s_nation, p_category ORDER BY d_year, s_nation, p_category; --Q4.3 SELECT d_year, s_city, p_brand, SUM(lo_revenue - lo_supplycost) AS PROFIT FROM dates, customer, supplier, part, lineorder WHERE lo_custkey = c_custkey AND lo_suppkey = s_suppkey AND lo_partkey = p_partkey AND lo_orderdate = d_datekey AND s_nation = 'UNITED STATES' AND ( d_year = 1997 OR d_year = 1998 ) AND p_category = 'MFGR#14' GROUP BY d_year, s_city, p_brand ORDER BY d_year, s_city, p_brand;
SSB-flat测试
您可以在SSB-Flat测试查询语句中获取目标SQL,进行执行。
您也可以在本次测试时使用的SQL语句,选取某一条语句进行执行。
--Q1.1 SELECT SUM(LO_EXTENDEDPRICE * LO_DISCOUNT) AS revenue FROM lineorder_flat WHERE LO_ORDERDATE >= 19930101 AND LO_ORDERDATE <= 19931231 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 >= 19940101 AND LO_ORDERDATE <= 19940131 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 >= 19940101 AND LO_ORDERDATE <= 19941231 AND LO_DISCOUNT BETWEEN 5 AND 7 AND LO_QUANTITY BETWEEN 26 AND 35; --Q2.1 SELECT SUM(LO_REVENUE), (LO_ORDERDATE DIV 10000) 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), (LO_ORDERDATE DIV 10000) 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), (LO_ORDERDATE DIV 10000) 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, (LO_ORDERDATE DIV 10000) AS YEAR, SUM(LO_REVENUE) AS revenue FROM lineorder_flat WHERE C_REGION = 'ASIA' AND S_REGION = 'ASIA' AND LO_ORDERDATE >= 19920101 AND LO_ORDERDATE <= 19971231 GROUP BY C_NATION, S_NATION, YEAR ORDER BY YEAR ASC, revenue DESC; --Q3.2 SELECT C_CITY, S_CITY, (LO_ORDERDATE DIV 10000) AS YEAR, SUM(LO_REVENUE) AS revenue FROM lineorder_flat WHERE C_NATION = 'UNITED STATES' AND S_NATION = 'UNITED STATES' AND LO_ORDERDATE >= 19920101 AND LO_ORDERDATE <= 19971231 GROUP BY C_CITY, S_CITY, YEAR ORDER BY YEAR ASC, revenue DESC; --Q3.3 SELECT C_CITY, S_CITY, (LO_ORDERDATE DIV 10000) 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 >= 19920101 AND LO_ORDERDATE <= 19971231 GROUP BY C_CITY, S_CITY, YEAR ORDER BY YEAR ASC, revenue DESC; --Q3.4 SELECT C_CITY, S_CITY, (LO_ORDERDATE DIV 10000) 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 >= 19971201 AND LO_ORDERDATE <= 19971231 GROUP BY C_CITY, S_CITY, YEAR ORDER BY YEAR ASC, revenue DESC; --Q4.1 SELECT (LO_ORDERDATE DIV 10000) 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 (LO_ORDERDATE DIV 10000) 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 >= 19970101 AND LO_ORDERDATE <= 19981231 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 (LO_ORDERDATE DIV 10000) AS YEAR, S_CITY, P_BRAND, SUM(LO_REVENUE - LO_SUPPLYCOST) AS profit FROM lineorder_flat WHERE S_NATION = 'UNITED STATES' AND LO_ORDERDATE >= 19970101 AND LO_ORDERDATE <= 19981231 AND P_CATEGORY = 'MFGR#14' GROUP BY YEAR, S_CITY, P_BRAND ORDER BY YEAR ASC, S_CITY ASC, P_BRAND ASC;
测试结果
以下为在规格为96核384GB、集群缓存空间为1200GB的SelectDB实例上进行的SSB标准测试1000GB查询性能测试以及SSB-Flat 1000GB查询性能测试的结果。
Query | SSB 1000 | SSB-Flat 1000 |
Q1.1 | 0.21 | 0.11 |
Q1.2 | 0.1 | 0.02 |
Q1.3 | 0.1 | 0.14 |
Q2.1 | 1.28 | 0.59 |
Q2.2 | 1.42 | 0.56 |
Q2.3 | 0.99 | 0.37 |
Q3.1 | 3.33 | 1.31 |
Q3.2 | 1.27 | 0.85 |
Q3.3 | 0.95 | 0.32 |
Q3.4 | 0.21 | 0.03 |
Q4.1 | 4.36 | 3.13 |
Q4.2 | 1.1 | 0.27 |
Q4.3 | 0.56 | 0.19 |
合计 | 15.88 | 7.89 |