MySQL---决策支持的基本测试标准TPC-DS测试数据的生成及导入

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: TPC-DS是tpc组织提供的官方决策支持基本测试标准,这个标准的数据对于决策支持的学习和测试很有帮助,怎样生成测试数据及将测试数据导入到MySQL数据库,可以参阅本文。

1 TPC-DS和TPC-H的区别

     说起数据库测试基准,第一个想到的tpc-c,tpc-c常常被用于在线事务处理(OLTP)数据库的性能测试,比如linux上常用的sysbench测试工具就支持oltp测试,开源工具sysbench-tpcc就基于sysbench的tpcc测试工具。

     oltp的测试基准是tpcc,olap(在线分析处理)的测试基准呢?广为人知的是tpc-H,TPC-H面向商品零售业,它定义了8张表,22个查询,遵循SQL92标准,它的表结构同oltp的表架构比较接近。

      另一个不太为人知的标准就是本文要提到的TPC-DS,这个标准表结构是典型的数据仓库的表结构,采用星型、雪花型等多维数据模式。它包含7张事实表,17张纬度表,跟大数据的分析挖掘应用非常类似。对于数据仓库的初学者来说,通过实际的例子来学习相对起来容易一些,这个数据集是不错的选择。

2  TPC-DS的下载和编译

     下载连接在这个位置

  https://www.tpc.org/tpc_documents_current_versions/current_specifications5.asp

     在这个页面填入信息后,点击下载,可能会出现下面这个错误

捕获.PNG

    这个错误并不是输入有误,用必应搜索一下得知可以在火狐浏览器上安装gooreplacer插件来解决,插件的地址是:

https://addons.mozilla.org/zh-CN/firefox/addon/gooreplacer/

      下载插件安装后,设置一下这个插件:

屏幕截图(1173).png

     设置完之后重启一下浏览器,打开TPC-DS的下载连接,输入信息,点击下载后。输入的电子邮件地址会收到下载连接。将这个连接复制粘贴到浏览器就可以下载了。

     这个工具的编译十分简单,进入/usr/local/tpcds/tools目录下运行make命令即可。

[root@ tools]# pwd    /usr/local/tpcds/tools
[root@ tools]# make

3 准备MySQL数据库

    MySQL数据库的准备也不复杂,创建一个数据库,在数据库内创建表就可以了。

3.1 创建并切换到数据库

mysql>create database tpcds DEFAULT CHARSET utf8 COLLATE utf8_general_ci;    Query OK,1 row affected (0.00 sec)mysql> use tpcds;    Database changed

3.2 创建表

  建表脚本比较长,就不在这里粘贴了,建表后的结果如下(一共是25个表):

mysql> show tables;+------------------------+| Tables_in_tpcds        |+------------------------+| call_center            || catalog_page           || catalog_returns        || catalog_sales          || customer               || customer_address       || customer_demographics  || date_dim               || dbgen_version          || household_demographics || income_band            || inventory              || item                   || promotion              || reason                 || ship_mode              || store                  || store_returns          || store_sales            || time_dim               || warehouse              || web_page               || web_returns            || web_sales              || web_site               |+------------------------+25 rows inset(0.00 sec)

4 生成测试数据

       生成测试数据之前先要创建测试数据存放的目录

[root@ tools]# mkdir -p /tmp/tpcds_data

      运行生成测试数据的命令

[root@ tools]# ./dsdgen -DIR /tmp/tpcds_data -SCALE 1 -TERMINATE N, tpcds.sql    dsdgen Population Generator (Version 3.2.0)
    Copyright Transaction Processing Performance Council (TPC) 2001-2021    Warning: This scale factor is valid for QUALIFICATION ONLY

    -SCALE 参数指定数据的大小,以G为单位。

5 生成导入数据的脚本

          tpc-ds生成的测试数据可以用load命令导入MySQL数据库,可以用文本编辑器编辑,也可以用shell脚本生成,这里给出一个shell脚本,只需要调整数据文件所在的位置就可以生成25个表的导入脚本。

[root@ tpcds_data]# for file in `ls -l |awk '{print $9}'`;    >  do    >      echo"LOAD DATA INFILE '/tmp/tpcds_data/"$file"' INTO TABLE"${file%%.*}" FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';";
    >  done


      脚本是一个for循环,ls -l |awk '{print $9}'打印出来是当前目录下的文件名,文件名是带有扩展名的,针对每一取到的文件名,利用linux字符串功能拼接成load语句,${file%%.*}截取文件名中'.'左边的部分,这时是花括号,不是括号。这个脚本的输出结果如下:

LOAD DATA INFILE '/tmp/tpcds_data/call_center.dat' INTO TABLE call_center  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/catalog_page.dat' INTO TABLE catalog_page  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/catalog_returns.dat' INTO TABLE catalog_returns  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/catalog_sales.dat' INTO TABLE catalog_sales  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/customer_address.dat' INTO TABLE customer_address  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/customer.dat' INTO TABLE customer  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/customer_demographics.dat' INTO TABLE customer_demographics  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/date_dim.dat' INTO TABLE date_dim  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/dbgen_version.dat' INTO TABLE dbgen_version  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/household_demographics.dat' INTO TABLE household_demographics  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/income_band.dat' INTO TABLE income_band  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/inventory.dat' INTO TABLE inventory  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/item.dat' INTO TABLE item  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/promotion.dat' INTO TABLE promotion  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/reason.dat' INTO TABLE reason  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/ship_mode.dat' INTO TABLE ship_mode  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/store.dat' INTO TABLE store  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/store_returns.dat' INTO TABLE store_returns  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/store_sales.dat' INTO TABLE store_sales  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/time_dim.dat' INTO TABLE time_dim  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/warehouse.dat' INTO TABLE warehouse  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/web_page.dat' INTO TABLE web_page  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/web_returns.dat' INTO TABLE web_returns  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/web_sales.dat' INTO TABLE web_sales  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';
LOAD DATA INFILE '/tmp/tpcds_data/web_site.dat' INTO TABLE web_site  FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n';

6 导入数据

      登录MySQL数据库,切换到tcpds数据库下,粘贴生成的脚本就可以导入数据了。导入时往往报下面这个错误。

mysql> LOAD DATA INFILE '/tmp/tpcds_data/call_center.dat'INTOTABLE call_center  FIELDS TERMINATED BY'|' LINES TERMINATED BY'\n';    ERROR 1290(HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

出现这个错误的原因是secure_file_priv设置的问题,这个变量默认的设置为空

mysql> show variables like'%secure_file_priv%';+------------------+-------+| Variable_name    | Value |+------------------+-------+| secure_file_priv |NULL|+------------------+-------+1 row inset(0.00 sec)

需要将它设置为存放要导入文件的目录

mysql>set secure_file_priv="/tmp/tpcds_data/";    ERROR 1238(HY000): Variable 'secure_file_priv'is a read only variable

这个变量是只读变量,只能在数据库启动之前设置,关闭MySQL数据库,重启后带上这个选项

[root@ tpcds_data]# mysqld_safe --user=mysql --datadir=/mysqldata --secure_file_priv="/tmp/tpcds_data/"&    [1] 60061[root@ tpcds_data]# 2022-08-30T07:10:08.899244Z mysqld_safe Logging to '/mysqldata/iZ2ze0t8khaprrpfvmevjiZ.err'.2022-08-30T07:10:08.926603Z mysqld_safe Starting mysqld daemon with databases from /mysqldata

再次登录数据库就可以导入了。

mysql> LOAD DATA INFILE '/tmp/tpcds_data/call_center.dat'INTOTABLE call_center  FIELDS TERMINATED BY'|' LINES TERMINATED BY'\n';    ERROR 1292(22007): Incorrect date value:'' for column 'cc_rec_end_date' at row 1

这个错误可以通过设置sql模式来消除

mysql>set sql_mode ='NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';    Query OK,0 rows affected (0.00 sec)

再次导入

mysql> LOAD DATA INFILE '/tmp/tpcds_data/call_center.dat'INTOTABLE call_center  FIELDS TERMINATED BY'|' LINES TERMINATED BY'\n';    Query OK,6 rows affected,9 warnings (0.00 sec)    Records:6  Deleted:0  Skipped:0  Warnings:9

7 生成查询

# ./dsqgen -input ../query_templates/templates.lst -directory ../query_templates -output ./sql.ansi/ -DIALECT ansi -LOG ./sql.ansi/ansi.log

-directory是查询模板所在的目录,-DIALECT设置sql语言的版本

  生成查询的过程中也有可能报下面这个错误

qgen2 Query Generator (Version 3.2.0)
      Copyright Transaction Processing Performance Council (TPC) 2001-2021      Warning: This scale factor is valid for QUALIFICATION ONLY
      ERROR: Substitution'_END' is used before being initialized at line 63in ../query_templates/query1.tpl

需要处理一下查询模板文件,在每个文件的末尾加上一行

[root@ query_templates]# for i in `ls query*tpl`    > do    >     echo$i;
    >     echo"define _END = \"\";" >> $i    > done

生成查询之间仍然需要创建查询的存储目录

[root@ tools]# mkdir sql.ansi

生成查询

[root@ tools]# ./dsqgen -input ../query_templates/templates.lst -directory ../query_templates -output ./sql.ansi/ -DIALECT ansi -LOG ./sql.ansi/ansi.log    qgen2 Query Generator (Version 3.2.0)
    Copyright Transaction Processing Performance Council (TPC) 2001-2021    Warning: This scale factor is valid for QUALIFICATION ONLY

8 运行查询

找一个查询语句运行一下

selectcount(*)from store_sales
,household_demographics
,time_dim, store
where ss_sold_time_sk = time_dim.t_time_skand ss_hdemo_sk = household_demographics.hd_demo_skand ss_store_sk = s_store_sk
and time_dim.t_hour=8and time_dim.t_minute>=30and household_demographics.hd_dep_count=5and store.s_store_name='ese'orderbycount(*);

看一下这条语句的执行计划

mysql> explain selectcount(*)from store_sales     ,household_demographics     ,time_dim, store where ss_sold_time_sk
= time_dim.t_time_skand ss_hdemo_sk = household_demographics.hd_demo_skand ss_store_sk = s_store_sk     and time_dim.t_hour=8and time_dim.t_minute>=30and household_demographics.hd_dep_count=5and store.s_store_name='ese'orderbycount(*);+----+-------------+------------------------+------------+--------+---------------+---------+---------+-----------------------------------+---------+----------+----------------------------------------------------+| id | select_type |table| partitions | type   | possible_keys | key     | key_len | ref                               | rows    | filtered | Extra                                              |+----+-------------+------------------------+------------+--------+---------------+---------+---------+-----------------------------------+---------+----------+----------------------------------------------------+|1| SIMPLE      | store                  |NULL| ALL    | PRIMARY       |NULL|NULL|NULL|12|10.00| Using where||1| SIMPLE      | store_sales            |NULL| ALL    |NULL|NULL|NULL|NULL|3754283|10.00| Using where; Using join buffer (Block Nested Loop)||1| SIMPLE      | household_demographics |NULL| eq_ref | PRIMARY       | PRIMARY |4| tpcds.store_sales.ss_hdemo_sk|1|10.00| Using where||1| SIMPLE      | time_dim               |NULL| eq_ref | PRIMARY       | PRIMARY |4| tpcds.store_sales.ss_sold_time_sk|1|5.00| Using where|+----+-------------+------------------------+------------+--------+---------------+---------+---------+-----------------------------------+---------+----------+----------------------------------------------------+4 rows inset,1 warning (0.00 sec)




相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
0
0
0
25
分享
相关文章
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
67 28
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
本文探讨了在使用YMP 23.2.1.3迁移MySQL Server字符集为latin1的中文数据至YashanDB时出现乱码的问题。问题根源在于MySQL latin1字符集存放的是实际utf8编码的数据,而YMP尚未支持此类场景。文章提供了两种解决方法:一是通过DBeaver直接迁移表数据;二是将MySQL表数据转换为Insert语句后手动插入YashanDB。同时指出,这两种方法适合单张表迁移,多表迁移可能存在兼容性问题,建议对问题表单独处理。
【YashanDB知识库】字符集latin1的MySQL中文数据如何迁移到YashanDB
Redis和Mysql如何保证数据⼀致?
1. 先更新Mysql,再更新Redis,如果更新Redis失败,可能仍然不⼀致 2. 先删除Redis缓存数据,再更新Mysql,再次查询的时候在将数据添加到缓存中 这种⽅案能解决1 ⽅案的问题,但是在⾼并发下性能较低,⽽且仍然会出现数据不⼀致的问题,⽐如线程1删除了 Redis缓存数据,正在更新Mysql,此时另外⼀个查询再查询,那么就会把Mysql中⽼数据⼜查到 Redis中 1. 使用MQ异步同步, 保证数据的最终一致性 我们项目中会根据业务情况 , 使用不同的方案来解决Redis和Mysql的一致性问题 : 1. 对于一些一致性要求不高的场景 , 不做处理例如 : 用户行为数据 ,
【YashanDB知识库】MySQL迁移至崖山char类型数据自动补空格问题
**简介**:在MySQL迁移到崖山环境时,若字段类型为char(2),而应用存储的数据仅为'0'或'1',查询时崖山会自动补空格。原因是mysql的sql_mode可能启用了PAD_CHAR_TO_FULL_LENGTH模式,导致保留CHAR类型尾随空格。解决方法是与应用确认数据需求,可将崖山环境中的char类型改为varchar类型以规避补空格问题,适用于所有版本。
使用崖山YMP 迁移 Oracle/MySQL 至YashanDB 23.2 验证测试
这篇文章是作者尚雷关于使用崖山YMP迁移Oracle/MySQL至YashanDB 23.2的验证测试分享。介绍了YMP的产品信息,包括架构、版本支持等,还详细阐述了外置库部署、YMP部署、访问YMP、数据源管理、任务管理(创建任务、迁移配置、离线迁移、校验初始化、一致性校验)及MySQL迁移的全过程。
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
82 9
MySQL和SQLSugar百万条数据查询分页优化
在面对百万条数据的查询时,优化MySQL和SQLSugar的分页性能是非常重要的。通过合理使用索引、调整查询语句、使用缓存以及采用高效的分页策略,可以显著提高查询效率。本文介绍的技巧和方法,可以为开发人员在数据处理和查询优化中提供有效的指导,提升系统的性能和用户体验。掌握这些技巧后,您可以在处理海量数据时更加游刃有余。
218 9
【YashanDB 知识库】MySQL 迁移至崖山 char 类型数据自动补空格问题
问题分类】功能使用 【关键字】char,char(1) 【问题描述】MySQL 迁移至崖山环境,字段类型源端和目标端都为 char(2),但应用存储的数据为'0'、'1',此时崖山查询该表字段时会自动补充空格 【问题原因分析】mysql 有 sql_mode 控制,检查是否启用了 PAD_CHAR_TO_FULL_LENGTH SQL 模式。如果启用了这个模式,MySQL 才会保留 CHAR 类型字段的尾随空格,默认没有启动。 #查看sql_mode mysql> SHOW VARIABLES LIKE 'sql_mode'; 【解决/规避方法】与应用确认存储的数据,正确定义数据
MySQL进阶突击系列(09)数据磁盘存储模型 | 一行数据怎么存?
文中详细介绍了MySQL数据库中一行数据在磁盘上的存储机制,包括表空间、段、区、页和行的具体结构,以及如何设计和优化行数据存储以提高性能。
MySQL底层概述—4.InnoDB数据文件
本文介绍了InnoDB表空间文件结构及其组成部分,包括表空间、段、区、页和行。表空间是最高逻辑层,包含多个段;段由若干个区组成,每个区包含64个连续的页,页用于存储多条行记录。文章还详细解析了Page结构,分为通用部分(文件头与文件尾)、数据记录部分和页目录部分。此外,文中探讨了行记录格式,包括四种行格式(Redundant、Compact、Dynamic和Compressed),重点介绍了Compact行记录格式及其溢出机制。最后,文章解释了不同行格式的特点及应用场景,帮助理解InnoDB存储引擎的工作原理。
MySQL底层概述—4.InnoDB数据文件

推荐镜像

更多