全部产品
Search
文档中心

PolarDB:Uji kinerja untuk kueri paralel

更新时间:Jul 02, 2025

Tema ini menjelaskan uji kinerja OLAP pada kluster Edisi Kluster dari PolarDB MySQL 8.0 berdasarkan TPC-H. Anda dapat memeriksa performa kluster menggunakan metode yang dijelaskan dalam tema ini.

Lingkungan pengujian

  • Instance ECS dan kluster PolarDB for MySQL ditempatkan di wilayah dan zona yang sama serta pada VPC yang sama.

  • Konfigurasi kluster PolarDB for MySQL:

    • Satu kluster

    • Mesin database: MySQL 8.0.1 atau MySQL 8.0.2

    • Edisi produk: Enterprise Edition

    • Edisi: Edisi Kluster

    • Tipe spesifikasi: Dedicated

    • Spesifikasi node: polar.mysql.x8.4xlarge (32 core dan 256 GB)

    • Jumlah node: 2 (1 node utama dan 1 node baca-saja)

    Catatan

    Titik akhir utama digunakan untuk menghubungkan ke kluster dalam pengujian. Untuk informasi lebih lanjut tentang cara melihat titik akhir utama dari kluster PolarDB for MySQL, lihat Kelola Titik Akhir Kluster.

  • Konfigurasi instance ECS:

    • Satu instance

    • Tipe instance: ecs.c5.4xlarge (16 vCPU dan 32 GiB)

    • Gambar: CentOS 7.0 64-bit

    • Disk sistem: ESSD dengan kapasitas 1.000 GB

Alat pengujian

TPC-H adalah tolok ukur umum yang dikembangkan dan dirilis oleh Transaction Processing Performance Council (TPC) untuk mengevaluasi kemampuan kueri analitik database. Tolok ukur TPC-H mencakup delapan tabel dan 22 pernyataan SQL kompleks. Sebagian besar kueri mengandung klausa JOIN pada beberapa tabel, subkueri, dan klausa GROUP BY.

Catatan

Uji kinerja TPC-H yang dijelaskan dalam tema ini diimplementasikan berdasarkan pengujian tolok ukur TPC-H tetapi tidak dapat memenuhi semua persyaratan pengujian tolok ukur TPC-H. Oleh karena itu, hasil pengujian tidak dapat dibandingkan dengan hasil yang dipublikasikan dari pengujian tolok ukur TPC-H.

Instal alat TPC-H

Penting
  • Masuk ke instance ECS sebagai pengguna root dan jalankan perintah berikut:

  • TPC-H yang digunakan dalam tema ini adalah TPC-H_Tools_v2.18.0. Anda harus mendaftarkan TPC-H sebelum dapat mengunduhnya.

Untuk menginstal TPC-H pada instance ECS, lakukan langkah-langkah berikut:

  1. Daftar dan unduh paket TPC-H. Unggah paket TPC-H ke instance ECS. Untuk informasi lebih lanjut, lihat Unggah File.

  2. Jalankan perintah berikut untuk mengekstrak paket TPC-H. Dalam contoh ini, file TPC-H-Tool.zip digunakan. Ganti dengan nama file aktual.

    unzip TPC-H-Tool.zip
  3. Setelah ekstraksi selesai, temukan lalu masuk ke folder dbgen. Dalam contoh ini, TPC-H-Tool/dbgen digunakan. Ganti dengan nama file aktual.

    cd TPC-H-Tool/dbgen
  4. Salin file makefile ke direktori ini.

    cp makefile.suite makefile
  5. Instal GCC.

    sudo yum install gcc
    Catatan

    Dalam contoh ini, sistem operasi CentOS digunakan. Jika Anda menggunakan sistem operasi lain, sesuaikan perintah instalasi sesuai dengan itu. Misalnya, di Ubuntu, jalankan perintah sudo apt install gcc.

  6. Ubah nilai parameter CC, DATABASE, MACHINE, dan WORKLOAD dalam file makefile.

    1. Buka file makefile.

      vim makefile
    2. Tekan tombol i untuk mengubah nilai parameter.

      ################
      ## CHANGE NAME OF ANSI COMPILER HERE
      ################
      CC      = gcc
      # Nilai saat ini untuk DATABASE adalah: INFORMIX, DB2, TDAT (Teradata)
      #                                  SQLSERVER, SYBASE, ORACLE, VECTORWISE
      # Nilai saat ini untuk MACHINE adalah:  ATT, DOS, HP, IBM, ICL, MVS, 
      #                                  SGI, SUN, U2200, VMS, LINUX, WIN32 
      # Nilai saat ini untuk WORKLOAD adalah:  TPCH
      DATABASE= MYSQL
      MACHINE = LINUX
      WORKLOAD = TPCH
    3. Tekan tombol Esc, masukkan :wq, lalu tekan Enter untuk menyimpan perubahan dan keluar dari mode edit.

  7. Ubah file tpcd.h dan tambahkan makro baru.

    1. Buka file tpcd.h.

      vim tpcd.h
    2. Tekan tombol i untuk menambahkan definisi makro berikut dalam database portability defines.

      #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
    3. Tekan tombol Esc, masukkan :wq, lalu tekan Enter untuk menyimpan dan menutup file.

  8. Kompilasi file.

    make

    Setelah file dikompilasi, file-file yang dapat dieksekusi berikut dihasilkan di direktori:

    • dbgen: alat yang digunakan untuk menghasilkan data. Jika Anda menggunakan skrip pengujian InfiniDB, Anda harus menggunakan alat ini untuk menghasilkan data untuk TPC-H.

    • qgen: alat yang digunakan untuk menghasilkan pernyataan SQL. Alat ini menghasilkan pernyataan awal untuk pengujian. Kueri yang dihasilkan menggunakan seed yang berbeda akan berbeda satu sama lain. Untuk memastikan hasil pengujian dapat diulang, gunakan 22 pernyataan SQL yang kompleks dari TPC-H. Anda dapat mengklik di sini untuk mengunduh 22 pernyataan tersebut.

  9. Gunakan dbgen untuk menghasilkan data pengujian.

    ./dbgen -s 100
    Catatan

    Parameter -s menentukan Scale Factor untuk menghasilkan data, yang menunjukkan ukuran dataset benchmark. -s 100 menunjukkan bahwa dataset pengujian sekitar 100 GB dihasilkan (ukuran spesifik mungkin sedikit bervariasi tergantung pada struktur tabel dan distribusi data).

  10. (Opsional) Gunakan TPC-H untuk menghasilkan kueri.

    Catatan

    Untuk memastikan hasil pengujian dapat diulang, lewati langkah ini dan gunakan 22 pernyataan SQL yang kompleks dari TPC-H. Anda dapat mengklik di sini untuk mengunduh 22 pernyataan tersebut.

    1. Salin qgen dan dists.dss ke direktori queries.

      cp qgen queries
      cp dists.dss queries
    2. Hasilkan kueri.

      1. Buat skrip generate_queries.sh.

        vim generate_queries.sh
      2. Tekan tombol i dan tambahkan konten berikut ke file:

        #!/usr/bin/bash
        
        # Pergi ke direktori query.
        cd queries
        
        # Hasilkan 22 kueri.
        for i in {1..22}
        do
          ./qgen -d $i -s 100 > db"$i".sql
        done
      3. Tekan tombol Esc, masukkan :wq, lalu tekan Enter untuk menyimpan dan menutup file.

      4. Atur izin eksekusi skrip.

        chmod +x generate_queries.sh
      5. Eksekusi skrip generate_queries.sh.

        ./generate_queries.sh

Prosedur pengujian

Hubungkan ke kluster PolarDB for MySQL dari instance ECS untuk menginisialisasi data dan menguji data.

  1. Buat skrip eksekusi untuk memuat data.

    1. Buat file load.ddl di folder dbgen dari TPC-H.

      vim load.ddl
    2. Tekan tombol i dan tambahkan konten berikut ke file:

      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 '|';
    3. Tekan tombol Esc, masukkan :wq, lalu tekan Enter untuk menyimpan dan menutup file.

  2. Ubah file dss.ri untuk membuat kunci primer dan kunci asing tabel.

    1. Salin file dss.ri dan kosongkan file dss.ri.

      cp dss.ri dss_bk.ri
      > dss.ri
    2. Buka file dss.ri.

      vim dss.ri
    3. Tekan tombol i dan tambahkan konten berikut ke file:

      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;
      -- Untuk tabel REGION
      ALTER TABLE REGION
      ADD PRIMARY KEY (R_REGIONKEY);
      -- Untuk tabel 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;
      -- Untuk tabel PART
      ALTER TABLE PART
      ADD PRIMARY KEY (P_PARTKEY);
      COMMIT WORK;
      -- Untuk tabel 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;
      -- Untuk tabel PARTSUPP
      ALTER TABLE PARTSUPP
      ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
      COMMIT WORK;
      -- Untuk tabel 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;
      -- Untuk tabel LINEITEM
      ALTER TABLE LINEITEM
      ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
      COMMIT WORK;
      -- Untuk tabel ORDERS
      ALTER TABLE ORDERS
      ADD PRIMARY KEY (O_ORDERKEY);
      COMMIT WORK;
      -- Untuk tabel 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;
      -- Untuk tabel ORDERS
      ALTER TABLE ORDERS
      ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references CUSTOMER(C_CUSTKEY);
      COMMIT WORK;
      -- Untuk tabel 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;
    4. Tekan tombol Esc, masukkan :wq, lalu tekan Enter untuk menyimpan dan menutup file.

  3. Instal klien MySQL.

    sudo yum install mysql
    Catatan

    Dalam contoh ini, sistem operasi CentOS digunakan. Jika Anda menggunakan sistem operasi lain, sesuaikan perintah instalasi sesuai dengan itu.

  4. Gunakan akun privileged account dan primary endpoint dari kluster untuk menghubungkan ke kluster PolarDB for MySQL. Untuk informasi lebih lanjut, lihat Buat Akun Privileged dan Hubungkan ke Database.

    mysql -h <Primary endpoint of the PolarDB cluster> -P <Port> -u <Username of the database> -p <Password of the database>
    Catatan

    Jika pesan kesalahan "Access denied for user 'xxx'@'xxx' (using password: YES)" muncul, nama pengguna atau kata sandi salah. Periksa apakah informasi yang dimasukkan benar.

  5. Buat database tpch100g dan pindah ke database saat ini.

    CREATE DATABASE tpch100g;
    
    use tpch100g;
  6. Buat tabel.

    source ./dss.ddl
    Catatan

    dss.ddl ada di direktori dbgen.

  7. Muat data.

    source ./load.ddl
    Catatan

    load.ddl ada di direktori dbgen dan dibuat pada langkah pertama.

  8. Buat kunci primer dan kunci asing.

    source ./dss.ri
    Catatan

    dss.ri ada di direktori dbgen dan dimodifikasi pada langkah kedua.

  9. (Opsional) Buat indeks.

    Anda harus menjalankan perintah exit; untuk keluar dari klien MySQL. Lalu, buat skrip di instance ECS dan eksekusi. Contoh skrip:

    #!/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
    Catatan
    • Saat membuat skrip, pastikan skrip memiliki izin yang diperlukan. Dalam contoh ini, skrip create_indexes.sh digunakan. Anda dapat menggunakan perintah chmod +x create_indexes.sh untuk menambahkan izin ke skrip.

    • Saat mengeksekusi skrip, Anda harus melewati parameter yang sesuai. Dalam contoh ini, skrip create_indexes.sh dijalankan sebagai perintah ./create_indexes.sh <host> <port <port> <user> <password> <database>. Parameter dalam skrip di atas:

      • <host>: titik akhir kluster.

      • <port>: port.

      • <user>: nama pengguna database.

      • <password>: kata sandi database.

      • <database>: nama database.

    • Jika pesan peringatan "[Warning] Using a password on the command line interface can be insecure" muncul saat skrip dieksekusi, skrip menggunakan perintah mysql -h <database connection address> -P <database port> -u <database account> -p <database password> -e<SQL>. Oleh karena itu, sistem akan meminta Anda memasukkan kata sandi di baris perintah, yang dapat menyebabkan pengguna lain di sistem melihat kata sandi dengan menjalankan perintah seperti ps. Pesan ini tidak memengaruhi operasi Anda. Setelah operasi selesai, Anda dapat pergi ke konsol PolarDB untuk mengubah kata sandi database.

    • Untuk mengukur peningkatan kinerja yang dibawa oleh kueri paralel, eksekusi kueri berikut untuk memuat indeks ke dalam memory pool:

      #!/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
  10. Jalankan kueri.

    Anda harus menjalankan perintah exit; untuk keluar dari klien MySQL. Lalu, buat skrip di instance ECS dan eksekusi. Contoh skrip:

    #!/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
    Catatan
    • Sebelum Anda mengeksekusi skrip, konfirmasikan item berikut:

      • Pastikan skrip memiliki izin yang diperlukan. Dalam contoh ini, skrip run_queries.sh digunakan. Anda dapat menggunakan perintah chmod +x run_queries.sh untuk menambahkan izin ke skrip.

      • Periksa direktori tempat Anda saat ini berada. Skrip dalam contoh dijalankan di direktori dbgen. Ubah queryfile="./queries/Q"${i}".sql" sesuai dengan itu. Jika tidak, pesan kesalahan "ERROR at line 1: Failed to open file 'QXX.sql'" akan muncul.

      • Pastikan Anda telah mengunggah dan mengekstrak 22 kueri dalam file terlampir ke direktori dbgen/queries. Jika Anda menggunakan pernyataan kueri lainnya, ubah queryfile="./queries/Q"${i}".sql" sesuai kebutuhan. Jika tidak, pesan kesalahan "ERROR at line 1: Failed to open file 'QXX.sql'" akan muncul.

    • Saat mengeksekusi skrip, Anda harus melewati parameter yang sesuai. Dalam contoh ini, skrip run_queries.sh dijalankan sebagai perintah ./run_queries.sh <host> <port> <user> <password> <database> <resfile>. Parameter dalam skrip di atas:

      • <host>: titik akhir kluster.

      • <port>: port.

      • <user>: nama pengguna database.

      • <password>: kata sandi database.

      • <database>: nama database.

      • <resfile>: nama file hasil.

    • Jika pesan peringatan "[Warning] Using a password on the command line interface can be insecure" muncul saat skrip dieksekusi, skrip menggunakan perintah mysql -h <database connection address> -P <database port> -u <database account> -p <database password> -e<SQL>. Oleh karena itu, sistem akan meminta Anda memasukkan kata sandi di baris perintah, yang dapat menyebabkan pengguna lain di sistem melihat kata sandi dengan menjalankan perintah seperti ps. Pesan ini tidak memengaruhi operasi Anda. Setelah operasi selesai, Anda dapat pergi ke konsol PolarDB untuk mengubah kata sandi database.

Hasil

Untuk informasi lebih lanjut, lihat Kinerja Kueri Paralel.