【物联网工程课设】高性能分析型连接查询设计与实现

本文介绍了如何在分布式环境下实现高性能的连接查询优化算法,包括数据导入Mysql数据库、测试数据处理、查重和数据结构设计,重点是针对特定规模的数据集进行功能性和非功能性要求的实现。


一、实现要求

  • 整体要求

基于指定的数据规模、数据集,实现一种分布式数据库领域的高性能连接查询优化算法,完成要求的性能测试,并进行效果演示。

  • 功能性要求

1、在单台机器上启动参赛者程序,共启动4个实例
2、4个实例各自加载50万零件数据和大约1500万行订单数据到内存中(每个实例加载不同的部分,记录加载时间)。
3、程序可以指定有效的零件品牌参数,非法的零件品牌报错。对于有效的零件品牌参数,完成如下要求的功能并计算时间:
(1)计算每个零件的销售总量所有零件的销售总量并得出零件平均销售量
(2)对于满足用户指定的零件品牌的零件,如果该零件销售总量小于(1)中的平均销售量的30%,则认定为非畅销零件
注意:零件品牌的格式为Brand#MN,其中M、N都是在1-5中任意选择,如Brand#12。
(3)计算并输出该品牌的所有非畅销零件的销售总额

  • 非功能性要求

实例间通过IP+端口方式进行通信(模拟多个节点),不得采用共享内存方式进行通信。

  • 演示要求

1、 启动4个实例后,在任意一个实例的控制台界面输入load表示开始加载数据,然后在各控制台界面显示各实例自己加载的2个表的各自的数据量和数据加载的时间
2、 然后输入select,表示开始执行查询,Brand#MN总共有25种情况,程序自动依次从Brand#11开始到Brand#55结束,显示这25种情况下的查询结果消耗的查询时间,最后显示出总的执行时间

二、测试数据

测试数据生成下载地址
运行如下命令生成比例因子为10的part表和lineitem表的文本测试数据:

.\dbgen.exe -s 10 -T P
.\dbgen.exe -s 10 -T L

上述命令生成part.tbl和lineitem.tbl这两个文本文件,文本文件总大小约为8G左右,其中part.tbl包括200万行零件数据,lineitem.tbl包含接近6000万条订单数据
注意:dists.dss需要和dbgen.exe在相同目录下
在linux操作系统中,dbgen.exe无法运行且没找到合适解决办法,因此在windows操作系统中生成测试数据,拷贝到linux系统中使用。

cd /dbgen
vim makefile.suite

生成后如下:
在这里插入图片描述
其中,只有箭头指向的两个文件才是我们所需要的。

  • part表(零件数据):

P_PARTKEY:零件号,唯一,整数类型
P_NAME:零件名称,唯一,字符串长度不超过55字节
P_MFGR:制造商名称,字符串长度不超过25字节
P_BRAND:零件品牌,字符串长度不超过10字节
P_TYPE:零件类型, 字符串长度不超过25字节
P_SIZE:零件尺寸,整数
P_CONTAINER:容器名称,字符串长度不超过10字节
P_RETAILPRICE:零件价格,浮点数
P_COMMENT:备注,字符串长度不超过23字节

在这里插入图片描述
其中的每一列数据用 | 符号隔开

  • lineitem表

L_ORDERKEY:订单号,整数
L_PARTKEY:零件号,整数,引用part表d的P_PARTKEY
L_SUPPKEY:供应商号,整数
L_LINENUMBER:订单细目号,整数
L_QUANTITY:零件数量,整数
L_EXTENDEDPRICE:零件价格,浮点数
L_DISCOUNT:零件折扣,浮点数,本课题不考虑折扣
L_TAX:税率,浮点数,本课题不考虑税
L_RETURNFLAG:订单退回标志,字符串,1字节
L_LINESTATUS:订单状态,字符串,1字节
L_SHIPDATE:发货日期,日期类型
L_COMMITDATE:提交日期,日期类型
L_RECEIPTDATE:接收日期,日期类型
L_SHIPINSTRUCT:发货指令,字符串不超过25字节
L_SHIPMODE:发货方式,字符串不超过10字节
L_COMMENT:备注,字符串不超过44字节

三、两个.tbl测试文件导入Mysql数据库

Linux下Mysql安装与使用

  1. 开启mysql服务:
sudo service mysql start
  1. 登陆mysql:
mysql -u root -p #然后根据提示输入用户密码
  1. 创建数据库
create database tpch; #tpch是数据库的名字

查看创建成功没(查看所有建立的数据库):

show databases;

在这里插入图片描述
进入创建的这个数据库:

use tpch;
  1. 创建表

part表的建表语句:

CREATE TABLE part  ( P_PARTKEY     INTEGER NOT NULL,
                     P_NAME        VARCHAR(55) NOT NULL,
                     P_MFGR        CHAR(25) NOT NULL,
                     P_BRAND       CHAR(10) NOT NULL,
                     P_TYPE        VARCHAR(25) NOT NULL,
                     P_SIZE        INTEGER NOT NULL,
                     P_CONTAINER   CHAR(10) NOT NULL,
                     P_RETAILPRICE DECIMAL(15,2) NOT NULL,
                     P_COMMENT     VARCHAR(23) NOT NULL );

lineitem表的建表语句:

CREATE TABLE lineitem ( L_ORDERKEY    INTEGER NOT NULL,
                        L_PARTKEY     INTEGER NOT NULL,
                        L_SUPPKEY     INTEGER NOT NULL,
                        L_LINENUMBER  INTEGER NOT NULL,
                        L_QUANTITY    DECIMAL(15,2) NOT NULL,
                        L_EXTENDEDPRICE  DECIMAL(15,2) NOT NULL,
                        L_DISCOUNT    DECIMAL(15,2) NOT NULL,
                        L_TAX         DECIMAL(15,2) NOT NULL,
                        L_RETURNFLAG  CHAR(1) NOT NULL,
                        L_LINESTATUS  CHAR(1) NOT NULL,
                        L_SHIPDATE    DATE NOT NULL,
                        L_COMMITDATE  DATE NOT NULL,
                        L_RECEIPTDATE DATE NOT NULL,
                        L_SHIPINSTRUCT CHAR(25) NOT NULL,
                        L_SHIPMODE     CHAR(10) NOT NULL,
                        L_COMMENT      VARCHAR(44) NOT NULL);

检查一下创建成功没有:

show tables;

在这里插入图片描述

  1. 将本地文件导入mysql

查看文件路径(part.tbl和lineitem.tbl):

pwd

根据上述指令的结果,执行导入数据库命令,其中的文件路径就是刚刚的两个表的绝对路径:

load data local infile '/home/cherry/IOT-finall-work/part.tbl' into table part fields terminated by '|' lines terminated by '|\n';

会发现报错:
在这里插入图片描述

  • 解决:
    查看是否开启加载本地文件
show variables like 'local_infile';

在这里插入图片描述
看到果然是off,再开启全局本地文件设置:

set global local_infile=on;

再查看已经打开了。
在这里插入图片描述
再执行一遍load指令,如果发现还是解决不了,出现新问题(在为on的前提下):
在这里插入图片描述
则exit退出mysql,通过如下命令重新登录:

mysql -u root -p --local-infile 

然后选择tpch数据库,再执行一遍load指令,发现导入成功(200万行),花费时间是15.21秒:

同样方法导入lineitem表:
在执行过程中,出现了根目录已满的情况,于是百度扩展根目录,发现自己的磁盘空间未分配的与根目录空间不连续,因此无法扩展。没办法删除ubuntu废了九牛二胡之力重新下载,给根目录分配了70G的空间,在回来执行一遍以上命令。
并且回来执行的时候,发现改load part表时

评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值