Todos los productos
Search
Centro de documentos

PolarDB:Performance test for parallel queries

Última actualización: Sep 05, 2026

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

Importante
  • 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.

  1. Regístrese, descargue el paquete de TPC-H y cárguelo en la instancia ECS. Para obtener más información, consulte Upload files.

  2. Descomprima el paquete. Reemplace TPC-H-Tool.zip con el nombre real del archivo.

    unzip TPC-H-Tool.zip
  3. Acceda al directorio dbgen. Reemplace TPC-H-Tool/dbgen con la ruta real.

    cd TPC-H-Tool/dbgen
  4. Copie el archivo makefile.suite como makefile.

    cp makefile.suite makefile
  5. Instale GCC.

    Este ejemplo utiliza CentOS. En Ubuntu, ejecute sudo apt install gcc en su lugar.
    sudo yum install gcc
  6. Edite el archivo makefile y establezca los parámetros CC, DATABASE, MACHINE y WORKLOAD.

    vim makefile

    Presione i para 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 = TPCH

    Presione Esc, escriba :wq y presione Enter para guardar y salir.

  7. Edite el archivo tpcd.h y agregue las definiciones de macros de MySQL.

    vim tpcd.h

    Presione i para entrar al modo de edición, busque la sección database portability defines y 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"
    #endif

    Presione Esc, escriba :wq y presione Enter para guardar y salir.

  8. Compile el código fuente.

    make

    Una 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).

  9. Genere los datos de prueba con un factor de escala (Scale Factor) de 100 (aproximadamente 100 GB).

    El parámetro -s define el factor de escala, el cual controla el tamaño del conjunto de datos. -s 100 genera 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
  10. (Opcional) Genere las consultas mediante qgen.

    1. Copie qgen y dists.dss en el directorio queries.

      cp qgen queries
      cp dists.dss queries
    2. Cree el script generate_queries.sh.

      vim generate_queries.sh

      Presione i y 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
      done

      Presione Esc, escriba :wq y presione Enter.

    3. 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

  1. Cree el archivo load.ddl en el directorio dbgen para definir la secuencia de carga de datos.

    vim load.ddl

    Presione i y 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 :wq y presione Enter.

  2. Modifique dss.ri para 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.ri

    Abra dss.ri y reemplace su contenido:

    vim dss.ri

    Presione i y 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 :wq y presione Enter.

  3. Instale el cliente de MySQL.

    Este ejemplo utiliza CentOS. Ajuste el comando según su sistema operativo.
    sudo yum install mysql
  4. 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>
  5. Cree la base de datos tpch100g y acceda a ella.

    CREATE DATABASE tpch100g;
    use tpch100g;
  6. Cree las tablas utilizando el archivo de esquema dss.ddl ubicado en el directorio dbgen.

    source ./dss.ddl
  7. Cargue los datos con el archivo load.ddl creado en el paso 1.

    source ./load.ddl
  8. Aplique las claves primarias y foráneas mediante el archivo dss.ri modificado 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

<host>

Endpoint principal del clúster

<port>

Número de puerto

<user>

Nombre de usuario de la base de datos

<password>

Contraseña de la base de datos

<database>

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 ejecutar ps . 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

<host>

Endpoint principal del clúster

<port>

Número de puerto

<user>

Nombre de usuario de la base de datos

<password>

Contraseña de la base de datos

<database>

Nombre de la base de datos

<resfile>

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 de queryfile según corresponda. Una ruta incorrecta provoca el error ERROR 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.