美文网首页收藏
779.【数据库评测】多表联合join零耗时——翰云数据库在国产

779.【数据库评测】多表联合join零耗时——翰云数据库在国产

作者: 七镜 | 来源:发表于2023-08-31 20:44 被阅读0次

一、评测结果

  • 64核256g内存的机器上,在ssb1000g数据集下,翰云数据库(cloudwave)在维度表与事实表之间做多表联合join时,查询耗时几乎为零,CPU占用几乎为零。

备注:

数据库 CPU 数据集 SQL1响应时间(ms) SQL2响应时间(ms) SQL1 CPU 最大占用率 SQL2 CPU 最大占用率
翰云数据库(cloudwave) 龙芯(loongson) ssb1000 32 41 0.31%(20%/6400%) 0.42%(27.4%/6400%)

二、评测环境

  • 硬件环境:4台 64核256g 龙芯服务器(组成4节点的集群),3.5TB nvme 固态硬盘
  • 软件环境
    1. 操作系统:Loongnix-Server Linux release 8.4.0


      内核版本
    2. 各个服务器节点ssh互信任

    3. openjdk17(龙芯cpu支持的最高推荐jdk,支持 vector api)、hadoop 3.2.2(作为cloudwave 的分布式存储,副本数=3)

  • 软件版本:Cloudwave 4.0(最新版在2023年5月份发版)
  • 评测数据集:ssb1000
表名 行数 说明
lineorder 60 亿 SSB 商品订单表
customer 3000 万 SSB 客户表
part 200 万 SSB 零部件表
supplier 200 万 SSB 供应商表
dates 2556 日期表

三、评测SQL

  • 评测SQL1:select count(*) from lineorder,customer where lo_custkey = c_custkey;
  • 评测SQL2:select count(*) from lineorder,customer,supplier where lo_custkey = c_custkey and lo_suppkey = s_suppkey;

第1条SQL是将lineorder这张事实表与customer这张维度表join,加count()是迫使数据库必须把所有的记录都join上。
第2条SQL是将lineorder这张事实表与customer、supplier 这两张维度join,加count(
)同样是迫使数据库必须把所有的记录都join上。

三、评测方法

  • 执行100轮SQL1和SQL2的测试脚本,获得sql的平均耗时
  • 观察最大CPU占用

四、开始评测

  1. 启动并导入ssb1000数据 到cloudwave


  2. 执行SQL1测试


./test_join1.sh 
## 脚本内容见附录
  • 可以看到cloudwave CPU最大占用是20%
  1. 分析SQL结果


./query_result.sh 
  • 可以看到cloudwave SQL1的耗时0.032秒左右。(天呐!lineorder(数据量60亿),join customer(数据量3000万),竟然只需要0.032秒)
  1. 执行SQL2测试


./test_join2.sh 
## 脚本内容见附录
  • 可以看到CPU最大占用是27.4%
  1. 分析SQL结果


./query_result.sh 
  • 可以看到cloudwave SQL2 的耗时也是0.041秒左右。(天呐!!!lineorder(数据量60亿),join customer(数据量3000万),再join supplier(数据量200万)竟然也只需要0.041秒。简直像开了挂——官方说:我们对于事实表与维度表多表联合join的时间应该为零

[附录]

  1. test_join1.sh脚本
#!/bin/bash
# Program:
#       test ssb
# History:
# 2023/03/17    junfenghe.cloud@qq.com  version:0.0.1


for ((i=1; i<30; i++))
do

    cat sql_join_1.sql |./cplus.sh > n${i}.txt

done
#cat sql_ssb.sql |./cplus.sh > n1.txt
  1. test_join2.sh脚本
#!/bin/bash
# Program:
#       test ssb
# History:
# 2023/03/17    junfenghe.cloud@qq.com  version:0.0.1


for ((i=1; i<30; i++))
do

    cat sql_join_2.sql |./cplus.sh > n${i}.txt

done
#cat sql_ssb.sql |./cplus.sh > n1.txt
  1. sql_join_1.sql文件内容
use ssb1000;
select count(*) from lineorder,customer where lo_custkey = c_custkey;
  1. sql_join_2.sql文件内容
select count(*) from lineorder,customer,supplier where lo_custkey = c_custkey and lo_suppkey = s_suppkey;
  1. query_result.sh脚本内容
#!/bin/bash
# Program:
#       list query time
# History:
# 2023/05/12    junfenghe.cloud@qq.com  version:0.0.1

path=/bin:/sbinz:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export path

./analysis.sh cloudwave "$(ls n*txt)" + > query_time.txt


echo "desc history;" | ./cplus.sh > jobinfo.txt
  1. analysis.sh脚本内容
#!/bin/bash
#Program:
#       analysis cloudwave/starrocks logs of base compute
#History:
#2023/02/20     junfenghe.cloud@qq.com  version:0.0.1

path=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/sbin:/usr/local/bin:~/bin
export path



suff="(s)#####"

if [ -z "${1}" ]
then

        echo "Please input database'name"
        exit -1

fi

if [ -z "$2" ]
then

        echo "Please input times of scanner"
        exit -f
fi

if [ -n "${3}" ]
then
        suff=${3}
fi

for current in ${2}
do
        result_time=""

        if [ "${1}" == "starrocks" ]
        then
            for time in $( cat ${current} | grep sec  | awk -F '('  '{print $2}' | awk -F ' ' '{print $1}' )
            do
                result_time="${result_time}${time}${suff}"
            done
        elif [ "${1}" == "cloudwave" ]
        then
            for time in $( cat ${current} | grep Elapsed | awk '{print $2}'| sed 's/:/*60+/g'| sed 's/+00\*60//g ; s/+0\*60//g ; s/^0\*60+//g' )
            do
                result_time="${result_time}${time}${suff}"
            done
        fi

        echo ${result_time%${suff}*}

done


exit 0
# echo $1
# echo $#
# echo $?
# echo $!
# echo $0

相关文章

  • mysql 基础知识

    3, 数据库的考点:多表联查,聚合函数和分组, 自查询 1. 简述数据库查询语句中,内连接inner join ,...

  • Hadoop中两表JOIN的处理方法

    1. 概述 在传统数据库(如:MYSQL)中,JOIN操作是非常常见且非常耗时的。而在HADOOP中进行JOIN操...

  • day38-mysql

    1、多表联合查询 2、索引 3、数据库导入导出 4、python操作数据库 5、redis安装和学习

  • thinkphp v5 视图查询

    视图查询可以实现不依赖数据库视图的多表查询,并不需要数据库支持视图 注意,视图查询无需调用table和join方法...

  • 2018-10-26数据库&多表关联&增删改&数据库备份

    数据库&多表关联&增删改&数据库备份

  • 2018-10-26

    数据库&多表关联&增删改&数据库备份 数据库关系图 数据库ID关联

  • Android-Room自定义类型

    Android-Room数据库(介绍) Android-Room数据库-多表查询 Android—Room 数据库...

  • MySQL基本原生常用语句

    常用操作数据库的命令 修改表的命令 对数据的操作 多表联合查询 DTL 数据事务语言

  • 思极有容简介

    思极有容事务型数据库 是由国网信通和创意信息联合研发的一款国产自主可控的分布式关系型数据库。支持国产CPU、操作系...

  • MySQL实战技巧-1:Join的使用技巧和优化

    join用于多表中字段之间的联系,在数据库的DML (数据操作语言,即各种增删改查操作)中有着重要的作用。 合理使...

网友评论

    本文标题:779.【数据库评测】多表联合join零耗时——翰云数据库在国产

    本文链接:https://www.haomeiwen.com/subject/bspgmdtx.html