Este tópico descreve como executar um benchmark TPC-H em um cluster PolarDB for MySQL 8.0 Cluster Edition para medir o desempenho de consultas paralelas OLAP.
O TPC-H exercita os padrões de consulta que a consulta paralela acelera: JOINs entre múltiplas tabelas, subconsultas e agregações GROUP BY em grandes conjuntos de dados. A execução dessas 22 consultas com e sem a consulta paralela ativada fornece uma linha de base reproduzível para avaliar os ganhos de desempenho no seu ambiente.
Ambiente de teste
A instância ECS e o cluster PolarDB for MySQL estão implantados na mesma região, zona e VPC.
Cluster PolarDB for MySQL
|
Parâmetro |
Valor |
|
Número de clusters |
1 |
|
Mecanismo de banco de dados |
MySQL 8.0.1 ou MySQL 8.0.2 |
|
Edição do produto |
Enterprise Edition |
|
Edição |
Cluster Edition |
|
Tipo de especificação |
Dedicado |
|
Especificações do nó |
polar.mysql.x8.4xlarge (32 núcleos, 256 GB) |
|
Número de nós |
2 (1 nó primário, 1 nó somente leitura) |
O teste utiliza o endpoint primário para conexão ao cluster. Para mais informações, consulte Gerenciar os endpoints de um cluster .
Instância ECS
|
Parâmetro |
Valor |
|
Tipo de instância |
ecs.c5.4xlarge (16 vCPU, 32 GiB) |
|
Imagem |
CentOS 7.0 64 bits |
|
Disco do sistema |
ESSD, 1.000 GB |
Ferramenta de teste
O TPC-H é um benchmark desenvolvido pelo Transaction Processing Performance Council (TPC) para avaliar o desempenho de consultas analíticas em bancos de dados. Ele inclui 8 tabelas e 22 instruções SQL complexas. A maioria das consultas combina JOINs entre múltiplas tabelas, subconsultas e cláusulas GROUP BY — padrões de carga de trabalho que mais se beneficiam da execução paralela.
Este teste baseia-se no benchmark TPC-H, mas não atende a todos os requisitos do TPC-H. Os resultados não podem ser comparados com os resultados oficiais publicados do benchmark TPC-H.
Instale ferramentas TPC-H
Faça login na instância ECS como usuário root antes de executar os comandos a seguir.
Este tópico utiliza o TPC-H_Tools_v2.18.0. É necessário registrar-se antes de baixar.
Registre-se, baixe o pacote TPC-H e faça o upload para a instância ECS. Para mais informações, consulte Fazer upload de arquivos.
-
Descompacte o pacote. Substitua
TPC-H-Tool.zippelo nome real do arquivo.unzip TPC-H-Tool.zip -
Acesse o diretório
dbgen. SubstituaTPC-H-Tool/dbgenpelo caminho real.cd TPC-H-Tool/dbgen -
Copie o arquivo
makefile.suiteparamakefile.cp makefile.suite makefile -
Instale o GCC.
Este exemplo usa CentOS. No Ubuntu, execute
sudo apt install gcc.sudo yum install gcc -
Edite o arquivo
makefilee defina os parâmetrosCC,DATABASE,MACHINEeWORKLOAD.vim makefilePressione
ipara entrar no modo de edição e defina os seguintes 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 = TPCHPressione
Esc, digite:wqe pressioneEnterpara salvar e sair. -
Edite o arquivo
tpcd.he adicione as definições de macro do MySQL.vim tpcd.hPressione
ipara entrar no modo de edição, localize a seçãodatabase portability definese adicione o seguinte:#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" #endifPressione
Esc, digite:wqe pressioneEnterpara salvar e sair. -
Compile o código-fonte.
makeApós a compilação, dois executáveis são gerados no diretório:
dbgen: gera dados de testeqgen: gera instruções SQL (não utilizado neste teste; as 22 consultas padrão do TPC-H são usadas em seu lugar)
-
Gere os dados de teste com um Scale Factor de 100 (aproximadamente 100 GB).
O parâmetro
-sdefine o Scale Factor, que controla o tamanho do conjunto de dados.-s 100gera aproximadamente 100 GB de dados. O tamanho exato pode variar ligeiramente dependendo da estrutura da tabela e da distribuição dos dados../dbgen -s 100 -
(Opcional) Gere consultas usando o
qgen.-
Copie o
qgene odists.dsspara o diretórioqueries.cp qgen queries cp dists.dss queries -
Crie o script
generate_queries.sh.vim generate_queries.shPressione
ie adicione:#!/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 donePressione
Esc, digite:wqe pressioneEnter. -
Torne o script executável e execute-o.
chmod +x generate_queries.sh ./generate_queries.sh
Pule esta etapa para manter os resultados reproduzíveis. Baixe as 22 instruções SQL padrão do TPC-H aqui e use-as diretamente.
-
Execute o teste
Conecte-se ao cluster PolarDB for MySQL a partir da instância ECS, inicialize o esquema, carregue os dados e execute as 22 consultas TPC-H.
Configurar o esquema e carregar dados
-
Crie o arquivo
load.ddlno diretóriodbgenpara definir a sequência de carregamento de dados.vim load.ddlPressione
ie adicione: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 '|';Pressione
Esc, digite:wqe pressioneEnter. -
Modifique o
dss.ripara definir chaves primárias e estrangeiras. Faça backup do arquivo original e limpe-o:cp dss.ri dss_bk.ri > dss.riAbra o
dss.rie substitua seu conteúdo:vim dss.riPressione
ie adicione: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;Pressione
Esc, digite:wqe pressioneEnter. -
Instale o cliente MySQL.
Este exemplo usa CentOS. Ajuste o comando para o seu sistema operacional.
sudo yum install mysql -
Conecte-se ao cluster PolarDB for MySQL usando a privileged account e o primary endpoint. Para mais informações, consulte Criar uma conta privilegiada e Conectar-se a um banco de dados.
Se a mensagem
Access denied for user 'xxx'@'xxx' (using password: YES)for exibida, o nome de usuário ou a senha estará incorreto.mysql -h <primary-endpoint> -P <port> -u <username> -p <password> -
Crie o banco de dados
tpch100ge mude para ele.CREATE DATABASE tpch100g; use tpch100g; -
Crie as tabelas usando o arquivo de esquema
dss.ddlno diretóriodbgen.source ./dss.ddl -
Carregue os dados usando o arquivo
load.ddlcriado na etapa 1.source ./load.ddl -
Aplique as chaves primárias e estrangeiras usando o arquivo
dss.rimodificado na etapa 2.source ./dss.ri
Crie índices (opcional)
Os índices melhoram o desempenho de algumas das 22 consultas TPC-H. Execute exit; para sair do cliente MySQL e, em seguida, crie e execute o seguinte script na instância 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
Salve o script como create_indexes.sh, torne-o executável e execute-o:
chmod +x create_indexes.sh
./create_indexes.sh <host> <port> <user> <password> <database>
Substitua os espaços reservados pelos detalhes do seu cluster:
|
Espaço reservado |
Descrição |
|
|
Endpoint primário do cluster |
|
|
Número da porta |
|
|
Nome de usuário do banco de dados |
|
|
Senha do banco de dados |
|
|
Nome do banco de dados |
Se a mensagem[Warning] Using a password on the command line interface can be insecurefor exibida, isso é esperado. O comando passa a senha como argumento de linha de comando, visível para outros usuários no sistema por meio do comandops. O aviso não afeta a operação. Após o teste, altere a senha do banco de dados no console PolarDB.
Pré-carregar índices na memória
Para medir o benefício total da consulta paralela, pré-carregue todos os índices no buffer pool antes de executar as consultas.
A consulta paralela ignora o buffer pool durante a execução. Portanto, execuções consecutivas não se beneficiam de dados em cache, e cada execução incorre no custo total de E/S. Isso significa que você pode observar E/S de leitura elevada durante o teste; esse comportamento é esperado e não indica problema. Pré-carregar os índices estabelece um estado inicial consistente para que todas as 22 consultas comecem da mesma linha de base de E/S.
Execute exit; para sair do cliente MySQL e, em seguida, crie e execute o seguinte 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
Execute as 22 consultas TPC-H
Execute exit; para sair do cliente MySQL e, em seguida, crie e execute o seguinte script no diretório 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
Salve o script como run_queries.sh, torne-o executável e execute-o:
chmod +x run_queries.sh
./run_queries.sh <host> <port> <user> <password> <database> <resfile>
Substitua os espaços reservados pelos detalhes do seu cluster:
|
Espaço reservado |
Descrição |
|
|
Endpoint primário do cluster |
|
|
Número da porta |
|
|
Nome de usuário do banco de dados |
|
|
Senha do banco de dados |
|
|
Nome do banco de dados |
|
|
Nome do arquivo de resultados de saída |
Antes de executar o script, confirme o seguinte:
O script possui permissões de execução (
chmod +x run_queries.sh).O diretório atual é
dbgen. O script referencia./queries/Q${i}.sql. Se você executá-lo em um diretório diferente, atualize o caminhoqueryfileadequadamente. Um caminho incorreto causa o erroERROR at line 1: Failed to open file 'QXX.sql'.Os 22 arquivos de consulta TPC-H estão presentes no diretório
dbgen/queries. Baixe-os aqui caso ainda não o tenha feito.
Se a mensagem [Warning] Using a password on the command line interface can be insecure for exibida, isso é esperado. Consulte a nota na seção de criação de índices acima.
Resultados
Para obter os resultados completos do benchmark, consulte Desempenho de consulta paralela.