翼度科技»论坛 编程开发 mysql 查看内容

使用TPC-H 进行GreatSQL并行查询测试

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
准备工作

数据库版本

GreatSQL-8.0.25-17
生成数据

使用 TPC-H 生成数据
  1. #TPC-H Population Generator (Version 3.0.0)
  2. #生成10G的数据
  3. $ ./dbgen -vf -s 10
复制代码
修改my.cnf
  1. vim /etc/my.cnf
  2. #设置IPB为8G
  3. innodb_buffer_pool_size = 8G
  4. #设置并行查询的使用最大内存(此处为8G,根据具体配置设置)
  5. parallel_memory_limit= 8G
  6. #打开并行查询
  7. force_parallel_execute=1
  8. #设置双1(方便导入数据)
  9. innodb_flush_log_at_trx_commit = 1
  10. sync_binlog = 1
  11. #关闭binlog
  12. skip-log_bin
  13. datadir    = /data/GreatSQL
  14. socket    = mysql.sock
复制代码
启动数据库后,可以检查配置是否生效
  1. mysql> show variables like '%double%';
  2. mysql> show variables like 'log_bin';
  3. mysql> show variables like 'sync_binlog';
  4. mysql> show variables like 'innodb_flush_log_at_trx_commit';
  5. mysql> show variables like 'innodb_buffer_pool_size';
复制代码
并行查询相关参数
  1. mysql> show global variables like '%parall%';
  2. +----------------------------------+----------------+
  3. | force_parallel_execute           | ON             |
  4. | innodb_parallel_dblwr_encrypt    | OFF            |
  5. | innodb_parallel_doublewrite_path | xb_doublewrite |
  6. | innodb_parallel_read_threads     | 4              |
  7. | parallel_cost_threshold          | 1000           |
  8. | parallel_default_dop             | 4              |
  9. | parallel_max_threads             | 64             |
  10. | parallel_memory_limit            | 8589934592     |
  11. | parallel_queue_timeout           | 0              |
  12. | slave_parallel_type              | LOGICAL_CLOCK  |
  13. | slave_parallel_workers           | 2              |
  14. +----------------------------------+----------------+
  15. 11 rows in set (0.01 sec)
复制代码
启动数据库

启动数据库:
  1. $ systemctl start greatsql.service
复制代码
文件准备

本次的工作在/data/tpch
可执行程序为dbgen,依赖一个数据分布文件dists.dss。可以将dbgen和dists.dss拷贝到同一目录使用
dss.ddl dss.ri 文件
准备表结构和索引文件 dss.ddl 和 dss.ri 到工作目录
  1. $ cd /data/tpch/tpch_2.18.0/dbgen
  2. $ cp dss.ri /data/tpch/
  3. $ cp dss.ddl /data/tpch/
复制代码
load.sql
修改 load.sql 文件 修改文件的路径
  1. $ cd /data/tpch/
  2. $ cp load.sql loadfix.sql
  3. $ vim loadfix.sql
复制代码
导入数据
  1. $ /usr/localGreatSQL-8.0.25-17/bin/mysql -uroot -S /data/GreatSQL/mysql.sock
  2. #创建数据库
  3. mysql> create database tpch;
  4. mysql> use tpch;
  5. #导入表结构
  6. mysql> source /data/tpch/dss.ddl;
  7. #导入数据(文件见附录)
  8. mysql> sh loadfile
  9. #导入索引、外键等
  10. mysql> source /data/tpch/dssfix.ri
复制代码
注:binlog要关再导入,否则binlog会爆
  1. Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage; increase this mysqld variable and try again
复制代码
查看导入的表(20G数据)
  1. mysql> select table_name,table_rows
  2. from information_schema.tables
  3. where table_name in
  4. ('customer','lineitem','nation','orders','part','partsupp','region','supplier');
  5. +------------+------------+
  6. | TABLE_NAME | TABLE_ROWS |
  7. +------------+------------+
  8. | region     |          5 |
  9. | nation     |         25 |
  10. | part       |    3860136 |
  11. | supplier   |     197853 |
  12. | customer   |    2884322 |
  13. | partsupp   |   17084176 |
  14. | orders     |   29678499 |
  15. | lineitem   |   87786966 |
  16. +------------+------------+
  17. 8 rows in set (0.00 sec)
复制代码
编写并运行测试脚本
  1. #测试脚本见附录
  2. #这里是在tmux中运行,避免因为终端关闭导致测试终止
  3. $ sh auto.sh&
  4. #测试结束后在当前脚本的目录查看生成的日志
  5. $ cat tpch-PQ-******.log
复制代码
测试运行时,观察相关指标。
  1. mysql> show global status like '%PQ%';
  2. +--------------------+-------+
  3. | Variable_name      | Value |
  4. +--------------------+-------+
  5. | PQ_memory_refused  | 0     |
  6. | PQ_memory_used     | 0     |
  7. | PQ_threads_refused | 0     |
  8. | PQ_threads_running | 0     |
  9. +--------------------+-------+
  10. 4 rows in set (0.00 sec)
  11. mysql> show processlist;
  12. mysql> explain for connection **;
复制代码
测试结果

开启并行查询(16线程)的执行时间,与不开启并行查询的执行时间如下:
SQL1SQL3SQL5SQL6SQL10SQL12SQL19PQ161m25.645s1m5.514s8m56.306s35.451s44.564s59.115s5.771sNOPQ6m1.724s5m19.083s37m42.078s2m16.331s1m57.998s2m39.672s24.907s注:本文章重点讲测试过程,具体的测试结果就不展开了。
**
**
附录-相关文件
导入脚本
  1. $ cat loadfile
  2. /usr/localGreatSQL-8.0.25-17/bin/mysql -S /data/GreatSQL/mysql.sock -Dtpch -f -e "set session foreign_key_checks=0;load data infile '/data/tpch/data/region.tbl' into table region FIELDS TERMINATED BY '|';" tpch &
  3. /usr/localGreatSQL-8.0.25-17/bin/mysql -S /data/GreatSQL/mysql.sock -Dtpch -f -e "set session foreign_key_checks=0;load data infile '/data/tpch/data/nation.tbl' into table nation FIELDS TERMINATED BY '|';" tpch &
  4. /usr/localGreatSQL-8.0.25-17/bin/mysql -S /data/GreatSQL/mysql.sock -Dtpch-f -e "set session foreign_key_checks=0;load data infile '/data/tpch/data/supplier.tbl' into table supplier FIELDS TERMINATED BY '|';" tpch &
  5. /usr/localGreatSQL-8.0.25-17/bin/mysql -S /data/GreatSQL/mysql.sock -Dtpch -f -e "set session foreign_key_checks=0;load data infile '/data/tpch/data/part.tbl' into table part FIELDS TERMINATED BY '|';" tpch &
  6. /usr/localGreatSQL-8.0.25-17/bin/mysql -S /data/GreatSQL/mysql.sock -Dtpch -f -e "set session foreign_key_checks=0;load data infile '/data/tpch/data/customer.tbl' into table customer FIELDS TERMINATED BY '|';" tpch &
  7. /usr/localGreatSQL-8.0.25-17/bin/mysql -S /data/GreatSQL/mysql.sock -Dtpch -f -e "set session foreign_key_checks=0;load data infile '/data/tpch/data/partsupp.tbl' into table partsupp FIELDS TERMINATED BY '|';" tpch &
  8. /usr/localGreatSQL-8.0.25-17/bin/mysql -S /data/GreatSQL/mysql.sock -Dtpch-f -e "set session foreign_key_checks=0;load data infile '/data/tpch/data/orders.tbl' into table orders FIELDS TERMINATED BY '|';" tpch &
  9. /usr/localGreatSQL-8.0.25-17/bin/mysql -S /data/GreatSQL/mysql.sock -Dtpch-f -e "set session foreign_key_checks=0;load data infile '/data/tpch/data/lineitem.tbl' into table lineitem FIELDS TERMINATED BY '|';" tpch &
复制代码
测试脚本:

脚本是东拼西凑的,写的不好,希望有大佬能指导一下
  1. $ cat auto.sh
  2. #include <iostream>TH=$PATH:/usr/local/bin
  3. export PATH
  4. #set -u
  5. #set -x
  6. #set -e
  7. . ~/.bash_profile > /dev/null 2>&1
  8. exec 3>&1 4>&2 1>> tpch-PQ-`date +'%Y%m%d%H%M%S'`.log 2>&1
  9. # 定义要执行的SQL文件存放的目录
  10. SQL_DIR="/data/tpch/SQLs"
  11. # 判断目录是否存在
  12. if [ ! -d "$SQL_DIR" ]; then
  13.     echo "SQL文件目录不存在!"
  14.     exit 1
  15. fi
  16. # 进入SQL文件目录
  17. cd $SQL_DIR
  18. I=1
  19. II=3
  20. while [ $I -le $II ]
  21. do
  22.     # 执行SQL文件
  23.     for file in `ls *.sql`
  24.     do
  25.         echo "正在执行:$file"
  26.         time /usr/localGreatSQL-8.0.25-17/bin/mysql -uroot -S /data/GreatSQL/mysql.sock -Dtpch < $file
  27.         
  28.         echo "SQL:$file,执行完成"
  29.         echo -e
  30.         echo "休息100s"
  31.         sleep 100
  32.         echo -e
  33.     done
  34.     echo "第$I次循环执行完成!"
  35. I=`expr $I + 1`
  36. done
  37. echo "脚本结束"
复制代码
dss.ddl
  1. -- Sccsid:     @(#)dss.ddl    2.1.8.1
  2. drop database tpch;
  3. create database tpch;
  4. use tpch;
  5. CREATE TABLE NATION  ( N_NATIONKEY  INTEGER NOT NULL,
  6.                             N_NAME       CHAR(25) NOT NULL,
  7.                             N_REGIONKEY  INTEGER NOT NULL,
  8.                             N_COMMENT    VARCHAR(152));
  9. CREATE TABLE REGION  ( R_REGIONKEY  INTEGER NOT NULL,
  10.                             R_NAME       CHAR(25) NOT NULL,
  11.                             R_COMMENT    VARCHAR(152));
  12. CREATE TABLE PART  ( P_PARTKEY     INTEGER NOT NULL,
  13.                           P_NAME        VARCHAR(55) NOT NULL,
  14.                           P_MFGR        CHAR(25) NOT NULL,
  15.                           P_BRAND       CHAR(10) NOT NULL,
  16.                           P_TYPE        VARCHAR(25) NOT NULL,
  17.                           P_SIZE        INTEGER NOT NULL,
  18.                           P_CONTAINER   CHAR(10) NOT NULL,
  19.                           P_RETAILPRICE DECIMAL(15,2) NOT NULL,
  20.                           P_COMMENT     VARCHAR(23) NOT NULL );
  21. CREATE TABLE SUPPLIER ( S_SUPPKEY     INTEGER NOT NULL,
  22.                              S_NAME        CHAR(25) NOT NULL,
  23.                              S_ADDRESS     VARCHAR(40) NOT NULL,
  24.                              S_NATIONKEY   INTEGER NOT NULL,
  25.                              S_PHONE       CHAR(15) NOT NULL,
  26.                              S_ACCTBAL     DECIMAL(15,2) NOT NULL,
  27.                              S_COMMENT     VARCHAR(101) NOT NULL);
  28. CREATE TABLE PARTSUPP ( PS_PARTKEY     INTEGER NOT NULL,
  29.                              PS_SUPPKEY     INTEGER NOT NULL,
  30.                              PS_AVAILQTY    INTEGER NOT NULL,
  31.                              PS_SUPPLYCOST  DECIMAL(15,2)  NOT NULL,
  32.                              PS_COMMENT     VARCHAR(199) NOT NULL );
  33. CREATE TABLE CUSTOMER ( C_CUSTKEY     INTEGER NOT NULL,
  34.                              C_NAME        VARCHAR(25) NOT NULL,
  35.                              C_ADDRESS     VARCHAR(40) NOT NULL,
  36.                              C_NATIONKEY   INTEGER NOT NULL,
  37.                              C_PHONE       CHAR(15) NOT NULL,
  38.                              C_ACCTBAL     DECIMAL(15,2)   NOT NULL,
  39.                              C_MKTSEGMENT  CHAR(10) NOT NULL,
  40.                              C_COMMENT     VARCHAR(117) NOT NULL);
  41. CREATE TABLE ORDERS  ( O_ORDERKEY       INTEGER NOT NULL,
  42.                            O_CUSTKEY        INTEGER NOT NULL,
  43.                            O_ORDERSTATUS    CHAR(1) NOT NULL,
  44.                            O_TOTALPRICE     DECIMAL(15,2) NOT NULL,
  45.                            O_ORDERDATE      DATE NOT NULL,
  46.                            O_ORDERPRIORITY  CHAR(15) NOT NULL,  
  47.                            O_CLERK          CHAR(15) NOT NULL,
  48.                            O_SHIPPRIORITY   INTEGER NOT NULL,
  49.                            O_COMMENT        VARCHAR(79) NOT NULL);
  50. CREATE TABLE LINEITEM ( L_ORDERKEY    INTEGER NOT NULL,
  51.                              L_PARTKEY     INTEGER NOT NULL,
  52.                              L_SUPPKEY     INTEGER NOT NULL,
  53.                              L_LINENUMBER  INTEGER NOT NULL,
  54.                              L_QUANTITY    DECIMAL(15,2) NOT NULL,
  55.                              L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL,
  56.                              L_DISCOUNT    DECIMAL(15,2) NOT NULL,
  57.                              L_TAX         DECIMAL(15,2) NOT NULL,
  58.                              L_RETURNFLAG  CHAR(1) NOT NULL,
  59.                              L_LINESTATUS  CHAR(1) NOT NULL,
  60.                              L_SHIPDATE    DATE NOT NULL,
  61.                              L_COMMITDATE  DATE NOT NULL,
  62.                              L_RECEIPTDATE DATE NOT NULL,
  63.                              L_SHIPINSTRUCT CHAR(25) NOT NULL,
  64.                              L_SHIPMODE     CHAR(10) NOT NULL,
  65.                              L_COMMENT      VARCHAR(44) NOT NULL);
复制代码
dss.ri
  1. -- Sccsid:     @(#)dss.ri    2.1.8.1
  2. -- tpch Benchmark Version 8.0
  3. -- For table REGION
  4. ALTER TABLE tpch.REGION
  5. ADD PRIMARY KEY (R_REGIONKEY);
  6. -- For table NATION
  7. ALTER TABLE tpch.NATION
  8. ADD PRIMARY KEY (N_NATIONKEY);
  9. ALTER TABLE tpch.NATION
  10. ADD FOREIGN KEY NATION_FK1 (N_REGIONKEY) references tpch.REGION(R_REGIONKEY);
  11. COMMIT WORK;
  12. -- For table PART
  13. ALTER TABLE tpch.PART
  14. ADD PRIMARY KEY (P_PARTKEY);
  15. COMMIT WORK;
  16. -- For table SUPPLIER
  17. ALTER TABLE tpch.SUPPLIER
  18. ADD PRIMARY KEY (S_SUPPKEY);
  19. ALTER TABLE tpch.SUPPLIER
  20. ADD FOREIGN KEY SUPPLIER_FK1 (S_NATIONKEY) references tpch.NATION(N_NATIONKEY);
  21. COMMIT WORK;
  22. -- For table PARTSUPP
  23. ALTER TABLE tpch.PARTSUPP
  24. ADD PRIMARY KEY (PS_PARTKEY,PS_SUPPKEY);
  25. COMMIT WORK;
  26. -- For table CUSTOMER
  27. ALTER TABLE tpch.CUSTOMER
  28. ADD PRIMARY KEY (C_CUSTKEY);
  29. ALTER TABLE tpch.CUSTOMER
  30. ADD FOREIGN KEY CUSTOMER_FK1 (C_NATIONKEY) references tpch.NATION(N_NATIONKEY);
  31. COMMIT WORK;
  32. -- For table LINEITEM
  33. ALTER TABLE tpch.LINEITEM
  34. ADD PRIMARY KEY (L_ORDERKEY,L_LINENUMBER);
  35. COMMIT WORK;
  36. -- For table ORDERS
  37. ALTER TABLE tpch.ORDERS
  38. ADD PRIMARY KEY (O_ORDERKEY);
  39. COMMIT WORK;
  40. -- For table PARTSUPP
  41. ALTER TABLE tpch.PARTSUPP
  42. ADD FOREIGN KEY PARTSUPP_FK1 (PS_SUPPKEY) references tpch.SUPPLIER(S_SUPPKEY);
  43. COMMIT WORK;
  44. ALTER TABLE tpch.PARTSUPP
  45. ADD FOREIGN KEY PARTSUPP_FK2 (PS_PARTKEY) references tpch.PART(P_PARTKEY);
  46. COMMIT WORK;
  47. -- For table ORDERS
  48. ALTER TABLE tpch.ORDERS
  49. ADD FOREIGN KEY ORDERS_FK1 (O_CUSTKEY) references tpch.CUSTOMER(C_CUSTKEY);
  50. COMMIT WORK;
  51. -- For table LINEITEM
  52. ALTER TABLE tpch.LINEITEM
  53. ADD FOREIGN KEY LINEITEM_FK1 (L_ORDERKEY)  references tpch.ORDERS(O_ORDERKEY);
  54. COMMIT WORK;
  55. ALTER TABLE tpch.LINEITEM
  56. ADD FOREIGN KEY LINEITEM_FK2 (L_PARTKEY,L_SUPPKEY) references
  57.         tpch.PARTSUPP(PS_PARTKEY,PS_SUPPKEY);
  58. COMMIT WORK;
复制代码
SQL语句

[code]--SQL1 select /*+ PQ(16) */    l_returnflag,    l_linestatus,    sum(l_quantity) as sum_qty,    sum(l_extendedprice) as sum_base_price,    sum(l_extendedprice * (1 - l_discount)) as sum_disc_price,    sum(l_extendedprice * (1 - l_discount) * (1 + l_tax)) as sum_charge,    avg(l_quantity) as avg_qty,    avg(l_extendedprice) as avg_price,    avg(l_discount) as avg_disc,    count(*) as count_orderfrom    lineitemwhere    l_shipdate  date '1995-03-01'group by    l_orderkey,    o_orderdate,    o_shippriorityorder by    revenue desc,    o_orderdate limit 10;--SQL6select /*+ PQ(16) */    sum(l_extendedprice * l_discount) as revenuefrom    lineitemwhere    l_shipdate >= date '1993-01-01'    and l_shipdate < date '1993-01-01' + interval '1' year    and l_discount between 0.02 - 0.01 and 0.02 + 0.01    and l_quantity < 24 limit 1;    --SQL10select /*+ PQ(16) */    c_custkey,    c_name,    sum(l_extendedprice * (1 - l_discount)) as revenue,    c_acctbal,    n_name,    c_address,    c_phone,    c_commentfrom    customer,    orders,    lineitem,    nationwhere    c_custkey = o_custkey    and l_orderkey = o_orderkey    and o_orderdate >= date '1994-05-01'    and o_orderdate < date '1994-05-01' + interval '3' month    and l_returnflag = 'R'    and c_nationkey = n_nationkeygroup by    c_custkey,    c_name,    c_acctbal,    c_phone,    n_name,    c_address,    c_commentorder by    revenue desc limit 20;--SQL12select /*+ PQ(16) */    l_shipmode,    sum(case        when o_orderpriority = '1-URGENT'            or o_orderpriority = '2-HIGH'            then 1        else 0    end) as high_line_count,    sum(case        when o_orderpriority  '1-URGENT'            and o_orderpriority  '2-HIGH'            then 1        else 0    end) as low_line_countfrom    orders,    lineitemwhere    o_orderkey = l_orderkey    and l_shipmode in ('TRUCK', 'FOB')    and l_commitdate < l_receiptdate    and l_shipdate < l_commitdate    and l_receiptdate >= date '1996-01-01'    and l_receiptdate < date '1996-01-01' + interval '1' yeargroup by    l_shipmodeorder by    l_shipmode limit 1 ;--SQL19select /*+ PQ(16) */    sum(l_extendedprice* (1 - l_discount)) as revenuefrom    lineitem,    partwhere    (        p_partkey = l_partkey        and p_brand = 'Brand#12'        and p_container in ('SM CASE', 'SM BOX', 'SM PACK', 'SM PKG')        and l_quantity >= 10 and l_quantity = 15 and l_quantity = 22 and l_quantity

举报 回复 使用道具