Este tema describe cómo ejecutar una prueba de referencia TPC-H contra un clúster Cluster Edition de PolarDB for MySQL 8.0 para medir el rendimiento de las consultas en paralelo de tipo OLAP.
La prueba TPC-H somete a carga los patrones de consulta que la consulta en paralelo está diseñada para acelerar: operaciones JOIN entre múltiples tablas, subconsultas y agregaciones GROUP BY sobre grandes volúmenes de datos. Al ejecutar estas 22 consultas con la consulta en paralelo habilitada y deshabilitada, se obtiene una línea base reproducible para evaluar las mejoras de rendimiento en su propio entorno.
Entorno de prueba
La instancia ECS y el clúster de PolarDB for MySQL se despliegan en la misma región, zona y VPC.
Clúster de PolarDB for MySQL
|
Parámetro |
Valor |
|
Número de clústeres |
1 |
|
Motor de base de datos |
MySQL 8.0.1 o MySQL 8.0.2 |
|
Edición del producto |
Enterprise Edition |
|
Edición |
Cluster Edition |
|
Tipo de especificación |
Dedicated |
|
Especificaciones del nodo |
polar.mysql.x8.4xlarge (32 núcleos, 256 GB) |
|
Número de nodos |
2 (1 nodo principal, 1 nodo de solo lectura) |
La prueba utiliza el endpoint principal para conectarse al clúster. Para obtener más información, consulte Manage the endpoints of a cluster .
Instancia ECS
|
Parámetro |
Valor |
|
Tipo de instancia |
ecs.c5.4xlarge (16 vCPU, 32 GiB) |
|
Imagen |
CentOS 7.0 de 64 bits |
|
Disco del sistema |
ESSD, 1000 GB |
Herramienta de prueba
TPC-H es una prueba de referencia desarrollada por el Transaction Processing Performance Council (TPC) para evaluar el rendimiento de las consultas analíticas en bases de datos. Incluye 8 tablas y 22 instrucciones SQL complejas. La mayoría de las consultas combinan operaciones JOIN entre múltiples tablas, subconsultas y cláusulas GROUP BY, que son los patrones de carga de trabajo que más se benefician de la ejecución en paralelo.
Esta prueba se basa en la referencia TPC-H, pero no cumple con todos sus requisitos. Por lo tanto, los resultados no se pueden comparar con los resultados oficiales publicados de TPC-H.
Instalar las herramientas de TPC-H
Inicie sesión en la instancia ECS como usuario root antes de ejecutar los siguientes comandos.
Este tema utiliza TPC-H_Tools_v2.18.0. Es obligatorio registrarse antes de descargar el paquete.
Regístrese, descargue el paquete de TPC-H y cárguelo en la instancia ECS. Para obtener más información, consulte Upload files.
-
Descomprima el paquete. Reemplace
TPC-H-Tool.zipcon el nombre real del archivo.unzip TPC-H-Tool.zip -
Acceda al directorio
dbgen. ReemplaceTPC-H-Tool/dbgencon la ruta real.cd TPC-H-Tool/dbgen -
Copie el archivo
makefile.suitecomomakefile.cp makefile.suite makefile -
Instale GCC.
Este ejemplo utiliza CentOS. En Ubuntu, ejecute
sudo apt install gccen su lugar.sudo yum install gcc -
Edite el archivo
makefiley establezca los parámetrosCC,DATABASE,MACHINEyWORKLOAD.vim makefilePresione
ipara entrar al modo de edición e introduzca los siguientes valores:################ ## CHANGE NAME OF ANSI COMPILER HERE ################ CC = gcc # Current values for DATABASE are: INFORMIX, DB2, TDAT (Teradata) # SQLSERVER, SYBASE, ORACLE, VECTORWISE # Current values for MACHINE are: ATT, DOS, HP, IBM, ICL, MVS, # SGI, SUN, U2200, VMS, LINUX, WIN32 # Current values for WORKLOAD are: TPCH DATABASE= MYSQL MACHINE = LINUX WORKLOAD = TPCHPresione
Esc, escriba:wqy presioneEnterpara guardar y salir. -
Edite el archivo
tpcd.hy agregue las definiciones de macros de MySQL.vim tpcd.hPresione
ipara entrar al modo de edición, busque la seccióndatabase portability definesy agregue lo siguiente:#ifdef MYSQL #define GEN_QUERY_PLAN "EXPLAIN PLAN" #define START_TRAN "START TRANSACTION" #define END_TRAN "COMMIT" #define SET_OUTPUT "" #define SET_ROWCOUNT "limit %d;\n" #define SET_DBASE "use %s;\n" #endifPresione
Esc, escriba:wqy presioneEnterpara guardar y salir. -
Compile el código fuente.
makeUna vez finalizada la compilación, se generan dos archivos ejecutables en el directorio:
dbgen: genera los datos de prueba.qgen: genera instrucciones SQL (no se usa en esta prueba; en su lugar, se utilizan las 22 consultas estándar de TPC-H).
-
Genere los datos de prueba con un factor de escala (Scale Factor) de 100 (aproximadamente 100 GB).
El parámetro
-sdefine el factor de escala, el cual controla el tamaño del conjunto de datos.-s 100genera aproximadamente 100 GB de datos. El tamaño exacto puede variar ligeramente según la estructura de las tablas y la distribución de los datos../dbgen -s 100 -
(Opcional) Genere las consultas mediante
qgen.-
Copie
qgenydists.dssen el directorioqueries.cp qgen queries cp dists.dss queries -
Cree el script
generate_queries.sh.vim generate_queries.shPresione
iy agregue lo siguiente:#!/usr/bin/bash # Go to the query directory. cd queries # Generate 22 queries. for i in {1..22} do ./qgen -d $i -s 100 > db"$i".sql donePresione
Esc, escriba:wqy presioneEnter. -
Otorgue permisos de ejecución al script y ejecútelo.
chmod +x generate_queries.sh ./generate_queries.sh
Omita este paso si desea mantener los resultados reproducibles. Descargue las 22 instrucciones SQL estándar de TPC-H aquí y utilícelas directamente.
-
Ejecutar la prueba
Conéctese al clúster de PolarDB for MySQL desde la instancia ECS, inicialice el esquema, cargue los datos y ejecute las 22 consultas de TPC-H.
Configurar el esquema y cargar los datos
-
Cree el archivo
load.ddlen el directoriodbgenpara definir la secuencia de carga de datos.vim load.ddlPresione
iy agregue lo siguiente:load data local INFILE 'customer.tbl' INTO TABLE customer FIELDS TERMINATED BY '|'; load data local INFILE 'region.tbl' INTO TABLE region FIELDS TERMINATED BY '|'; load data local INFILE 'nation.tbl' INTO TABLE nation FIELDS TERMINATED BY '|'; load data local INFILE 'supplier.tbl' INTO TABLE supplier FIELDS TERMINATED BY '|'; load data local INFILE 'part.tbl' INTO TABLE part FIELDS TERMINATED BY '|'; load data local INFILE 'partsupp.tbl' INTO TABLE partsupp FIELDS TERMINATED BY '|'; load data local INFILE 'orders.tbl' INTO TABLE orders FIELDS TERMINATED BY '|'; load data local INFILE 'lineitem.tbl' INTO TABLE lineitem FIELDS TERMINATED BY '|';Presione
Esc, escriba:wqy presioneEnter. -
Modifique
dss.ripara definir las claves primarias y foráneas. Haga una copia de seguridad del archivo original y vacíelo:cp dss.ri dss_bk.ri > dss.riAbra
dss.riy reemplace su contenido:vim dss.riPresione
iy agregue lo siguiente:use tpch100g; -- ALTER TABLE REGION DROP PRIMARY KEY; -- ALTER TABLE NATION DROP PRIMARY KEY; -- ALTER TABLE PART DROP PRIMARY KEY; -- ALTER TABLE SUPPLIER DROP PRIMARY KEY; -- ALTER TABLE PARTSUPP DROP PRIMARY KEY; -- ALTER TABLE ORDERS DROP PRIMARY KEY; -- ALTER TABLE LINEITEM DROP PRIMARY KEY; -- ALTER TABLE CUSTOMER DROP PRIMARY KEY; -- For table REGION ALTER TABLE REGION ADD PRIMARY KEY (R_REGIONKEY); -- For table NATION ALTER TABLE NATION ADD PRIMARY KEY (N_NATIONKEY); ALTER TABLE NATION ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references REGION(R_REGIONKEY); COMMIT WORK; -- For table PART ALTER TABLE PART ADD PRIMARY KEY (P_PARTKEY); COMMIT WORK; -- For table SUPPLIER ALTER TABLE SUPPLIER ADD PRIMARY KEY (S_SUPPKEY); ALTER TABLE SUPPLIER ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references NATION(N_NATIONKEY); COMMIT WORK; -- For table PARTSUPP ALTER TABLE PARTSUPP ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY); COMMIT WORK; -- For table CUSTOMER ALTER TABLE CUSTOMER ADD PRIMARY KEY (C_CUSTKEY); ALTER TABLE CUSTOMER ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references NATION(N_NATIONKEY); COMMIT WORK; -- For table LINEITEM ALTER TABLE LINEITEM ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER); COMMIT WORK; -- For table ORDERS ALTER TABLE ORDERS ADD PRIMARY KEY (O_ORDERKEY); COMMIT WORK; -- For table PARTSUPP ALTER TABLE PARTSUPP ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references SUPPLIER(S_SUPPKEY); COMMIT WORK; ALTER TABLE PARTSUPP ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references PART(P_PARTKEY); COMMIT WORK; -- For table ORDERS ALTER TABLE ORDERS ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references CUSTOMER(C_CUSTKEY); COMMIT WORK; -- For table LINEITEM ALTER TABLE LINEITEM ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY) references ORDERS(O_ORDERKEY); COMMIT WORK; ALTER TABLE LINEITEM ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references PARTSUPP(PS_PARTKEY,PS_SUPPKEY); COMMIT WORK;Presione
Esc, escriba:wqy presioneEnter. -
Instale el cliente de MySQL.
Este ejemplo utiliza CentOS. Ajuste el comando según su sistema operativo.
sudo yum install mysql -
Conéctese al clúster de PolarDB for MySQL mediante la privileged account y el primary endpoint. Para obtener más información, consulte Create a privileged account y Connect to a database.
Si aparece el mensaje
Access denied for user 'xxx'@'xxx' (using password: YES), significa que el nombre de usuario o la contraseña son incorrectos.mysql -h <primary-endpoint> -P <port> -u <username> -p <password> -
Cree la base de datos
tpch100gy acceda a ella.CREATE DATABASE tpch100g; use tpch100g; -
Cree las tablas utilizando el archivo de esquema
dss.ddlubicado en el directoriodbgen.source ./dss.ddl -
Cargue los datos con el archivo
load.ddlcreado en el paso 1.source ./load.ddl -
Aplique las claves primarias y foráneas mediante el archivo
dss.rimodificado en el paso 2.source ./dss.ri
Crear índices (opcional)
Los índices mejoran el rendimiento de algunas de las 22 consultas de TPC-H. Ejecute exit; para salir del cliente de MySQL y luego cree y ejecute el siguiente script en la instancia ECS.
#!/usr/bin/bash
host=$1
port=$2
user=$3
password=$4
db=$5
sqls=("create index i_s_nationkey on supplier (s_nationkey);"
"create index i_ps_partkey on partsupp (ps_partkey);"
"create index i_ps_suppkey on partsupp (ps_suppkey);"
"create index i_c_nationkey on customer (c_nationkey);"
"create index i_o_custkey on orders (o_custkey);"
"create index i_o_orderdate on orders (o_orderdate);"
"create index i_l_orderkey on lineitem (l_orderkey);"
"create index i_l_partkey on lineitem (l_partkey);"
"create index i_l_suppkey on lineitem (l_suppkey);"
"create index i_l_partkey_suppkey on lineitem (l_partkey, l_suppkey);"
"create index i_l_shipdate on lineitem (l_shipdate);"
"create index i_l_commitdate on lineitem (l_commitdate);"
"create index i_l_receiptdate on lineitem (l_receiptdate);"
"create index i_n_regionkey on nation (n_regionkey);"
"analyze table supplier"
"analyze table part"
"analyze table partsupp"
"analyze table customer"
"analyze table orders"
"analyze table lineitem"
"analyze table nation"
"analyze table region")
for sql in "${sqls[@]}"
do
mysql -h$host -P$port -u$user -p$password -D$db -e "$sql"
done
Guarde el script como create_indexes.sh, otórguele permisos de ejecución y ejecútelo:
chmod +x create_indexes.sh
./create_indexes.sh <host> <port> <user> <password> <database>
Reemplace los marcadores de posición con los datos de su clúster:
|
Marcador de posición |
Descripción |
|
|
Endpoint principal del clúster |
|
|
Número de puerto |
|
|
Nombre de usuario de la base de datos |
|
|
Contraseña de la base de datos |
|
|
Nombre de la base de datos |
Si aparece la advertencia[Warning] Using a password on the command line interface can be insecure, es un comportamiento esperado. El comando pasa la contraseña como argumento de la línea de comandos, por lo que otros usuarios del sistema podrían verla al ejecutarps. Esta advertencia no afecta la operación. Una vez terminada la prueba, cambie la contraseña de la base de datos en la consola de PolarDB.
Precargar los índices en memoria
Para medir el beneficio total de la consulta en paralelo, precargue todos los índices en el buffer pool antes de ejecutar las consultas.
La consulta en paralelo omite el buffer pool durante la ejecución. Por ello, las ejecuciones consecutivas no aprovechan los datos almacenados en caché y cada ejecución asume el costo completo de E/S. Esto significa que podría observar un aumento en la E/S de lectura durante la prueba; dicho comportamiento es normal y no representa un problema. Precargar los índices establece un estado inicial consistente para que las 22 consultas partan de la misma línea base de E/S.
Ejecute exit; para salir del cliente de MySQL y luego cree y ejecute el siguiente script:
#!/bin/bash
host=$1
port=$2
user=$3
password=$4
dbname=$5
MYSQL="mysql -h$host -P$port -u$user -p$password -D$dbname"
if [ -z ${dbname} ]; then
echo "dbname not defined."
exit 1
fi
table_indexes=(
"supplier PRIMARY"
"supplier i_s_nationkey"
"part PRIMARY"
"partsupp PRIMARY"
"partsupp i_ps_partkey"
"partsupp i_ps_suppkey"
"customer PRIMARY"
"customer i_c_nationkey"
"orders PRIMARY"
"orders i_o_custkey"
"orders i_o_orderdate"
"lineitem PRIMARY"
"lineitem i_l_orderkey"
"lineitem i_l_partkey"
"lineitem i_l_suppkey"
"lineitem i_l_partkey_suppkey"
"lineitem i_l_shipdate"
"lineitem i_l_commitdate"
"lineitem i_l_receiptdate"
"nation i_n_regionkey"
"nation PRIMARY"
"region PRIMARY"
)
for table_index in "${table_indexes[@]}"
do
ti=($table_index)
table=${ti[0]}
index=${ti[1]}
SQL="select count(*) from ${table} force index(${index})"
echo "$MYSQL -e '$SQL'"
$MYSQL -e "$SQL"
done
Ejecutar las 22 consultas de TPC-H
Ejecute exit; para salir del cliente de MySQL y luego cree y ejecute el siguiente script desde el directorio dbgen:
#!/usr/bin/env bash
host=$1
port=$2
user=$3
password=$4
database=$5
resfile=$6
echo "start test run at"`date "+%Y-%m-%d %H:%M:%S"`|tee -a ${resfile}.out
for (( i=1; i<=22;i=i+1 ))
do
queryfile="./queries/Q"${i}".sql"
start_time=`date "+%s.%N"`
echo "run query ${i}"|tee -a ${resfile}.out
mysql -h ${host} -P${port} -u${user} -p${password} $database -e" source $queryfile;" |tee -a ${resfile}.out
end_time=`date "+%s.%N"`
start_s=${start_time%.*}
start_nanos=${start_time#*.}
end_s=${end_time%.*}
end_nanos=${end_time#*.}
if [ "$end_nanos" -lt "$start_nanos" ];then
end_s=$(( 10#$end_s -1 ))
end_nanos=$(( 10#$end_nanos + 10 ** 9))
fi
time=$(( 10#$end_s - 10#$start_s )).`printf "%03d\n" $(( (10#$end_nanos - 10#$start_nanos)/10**6 ))`
echo ${queryfile} "the "${j}" run cost "${time}" second start at"`date -d @$start_time "+%Y-%m-%d %H:%M:%S"`" stop at"`date -d @$end_time "+%Y-%m-%d %H:%M:%S"` >> ${resfile}.time
done
Guarde el script como run_queries.sh, otórguele permisos de ejecución y ejecútelo:
chmod +x run_queries.sh
./run_queries.sh <host> <port> <user> <password> <database> <resfile>
Reemplace los marcadores de posición con los datos de su clúster:
|
Marcador de posición |
Descripción |
|
|
Endpoint principal del clúster |
|
|
Número de puerto |
|
|
Nombre de usuario de la base de datos |
|
|
Contraseña de la base de datos |
|
|
Nombre de la base de datos |
|
|
Nombre del archivo de resultados de salida |
Antes de ejecutar el script, compruebe lo siguiente:
El script cuenta con permisos de ejecución (
chmod +x run_queries.sh).El directorio actual es
dbgen. El script hace referencia a./queries/Q${i}.sql. Si lo ejecuta desde otro directorio, actualice la ruta dequeryfilesegún corresponda. Una ruta incorrecta provoca el errorERROR at line 1: Failed to open file 'QXX.sql'.Los 22 archivos de consulta de TPC-H están presentes en el directorio
dbgen/queries. Si aún no lo ha hecho, descárguelos aquí.
Si aparece la advertencia [Warning] Using a password on the command line interface can be insecure , es un comportamiento esperado. Consulte la nota en la sección anterior sobre la creación de índices.
Resultados
Para consultar los resultados completos de la prueba de referencia, vea Parallel query performance.