大致介绍

TPC-DS采用星型、雪花型等多维数据模式。它包含7张事实表,17张纬度表平均每张表含有18列。其工作负载包含99个SQL查询,覆盖SQL99和2003的核心部分以及OLAP。这个测试集包含对大数据集的统计、报表生成、联机查询、数据挖掘等复杂应用,测试用的数据和值是有倾斜的,与真实数据一致。可以说TPC-DS是与真实场景非常接近的一个测试集,也是难度较大的一个测试集。
Clickhouse是俄罗斯Yandex公司开源的一个非常快的数据管理系统,性能非常强悍。Apache Doris是百度开源的另一个基于 MPP 的交互式 SQL 数据仓库,主要用于解决报表和多维分析,成熟稳定。

下载编译

下载官方网址
也可以通过Git下载

git clone https://github.com/gregrahn/tpcds-kit.gitcd tpcds-kit/toolsmake OS=LINUX
  • 1

  • 2

  • 3

tpcds.sql是建表SQL[tools]$ ll *.sql-rw-r----- 1 prodadmin prodadmin 13875 Mar 12 03:44 tpcds_ri.sql-rw-r----- 1 prodadmin prodadmin 22153 Mar 12 03:44 tpcds_source.sql-rw-r----- 1 prodadmin prodadmin 30001 Mar 12 03:44 tpcds.sql
  • 1

  • 2

  • 3

  • 4

  • 5

dsdgen是生成数据的工具,dsqgen是生成Query的工具[tools]$ ll ds*-rwxr-x--- 1 prodadmin prodadmin 455880 Apr 16 19:15 dsdgen-rwxr-x--- 1 prodadmin prodadmin 292254 Apr 16 19:15 dsqgen
  • 1

  • 2

  • 3

  • 4

在query_templates中是query模板[tools]$ ls ../query_templates/ansi.tpl     query12.tpl  query18.tpl  query23.tpl  query29.tpl  query34.tpl  query3.tpl   query45.tpl  query50.tpl  query56.tpl  query61.tpl  query67.tpl  query72.tpl  query78.tpl  query83.tpl  query89.tpl  query94.tpl  query9.tpldb2.tpl      query13.tpl  query19.tpl  query24.tpl  query2.tpl   query35.tpl  query40.tpl  query46.tpl  query51.tpl  query57.tpl  query62.tpl  query68.tpl  query73.tpl  query79.tpl  query84.tpl  query8.tpl   query95.tpl  READMEnetezza.tpl  query14.tpl  query1.tpl   query25.tpl  query30.tpl  query36.tpl  query41.tpl  query47.tpl  query52.tpl  query58.tpl  query63.tpl  query69.tpl  query74.tpl  query7.tpl   query85.tpl  query90.tpl  query96.tpl  sqlserver.tploracle.tpl   query15.tpl  query20.tpl  query26.tpl  query31.tpl  query37.tpl  query42.tpl  query48.tpl  query53.tpl  query59.tpl  query64.tpl  query6.tpl   query75.tpl  query80.tpl  query86.tpl  query91.tpl  query97.tpl  templates.lstquery10.tpl  query16.tpl  query21.tpl  query27.tpl  query32.tpl  query38.tpl  query43.tpl  query49.tpl  query54.tpl  query5.tpl   query65.tpl  query70.tpl  query76.tpl  query81.tpl  query87.tpl  query92.tpl  query98.tplquery11.tpl  query17.tpl  query22.tpl  query28.tpl  query33.tpl  query39.tpl  query44.tpl  query4.tpl   query55.tpl  query60.tpl  query66.tpl  query71.tpl  query77.tpl  query82.tpl  query88.tpl  query93.tpl  query99.tpl
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

建表语句

请根据Hive、Doris、Clickhouse等组件特点,修改建表语句,请注意,列是否为空,列的顺序等和后面步骤的导入数据密切相关,请勿轻易修改。
1 Clickhouse数据类型
2 Doris建表和数据类型

create table dbgen_versioncreate table customer_addresscreate table customer_demographicscreate table date_dimcreate table warehousecreate table ship_modecreate table time_dimcreate table reasoncreate table income_bandcreate table itemcreate table storecreate table call_centercreate table customercreate table web_sitecreate table store_returnscreate table household_demographicscreate table web_pagecreate table promotioncreate table catalog_pagecreate table inventorycreate table catalog_returnscreate table web_returnscreate table web_salescreate table catalog_salescreate table store_sales
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

数据生成

可以建一个脚本,来生成数据
1 数据分隔符是“|”,空值默认为空。Clickhouse支持的格式,Doris Load格式。
2 scale单位为G,指生成的数据量大小,paralle指分割多少个文件,child指第几个文件

[tools]$ cat build_data_tsv.hecho $1mkdir ../../data_tsv/nohup ./dsdgen  -scale 100 -dir ../../data_tsv/ -paralle 10 -child $1 > child$1.log &
  • 1

  • 2

  • 3

  • 4

数据导入

  • Clickhouse数据导入,一个例子,我写了一个convert.py的小脚本,处理分隔符、空值、列顺序等问题

if [ ! -f "./data_tsv/dbgen_version_$1_10.done" ]; thencat ./data_tsv/dbgen_version_$1_10.dat|python convert.py ck|clickhouse-client --query="INSERT INTO default.dbgen_version_dist FORMAT CSV"touch ./data_tsv/dbgen_version_$1_10.donefi
  • 1

  • 2

  • 3

  • 4

  • Doris数据导入

cat ./data_tsv/dbgen_version_$1_10.dat|python convert.py dr dbgen_version|curl --location-trusted -u root: -H "label:dbgen_version_$1_10_" -H "timeout:1200" -T - http://ip:port/api/testdb/dbgen_version/_stream_load
  • 1

生成Query

cat build_sql.sh./dsqgen \-DIRECTORY ../query_templates \-INPUT ../query_templates/templates.lst \-VERBOSE Y \-QUALIFY Y \-SCALE 100 \-DIALECT sqlserver \-OUTPUT_DIR ../../query/
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

Query改写

比如如下的SQL,在Doris中是可以正确的执行的,但是在Clickhouse中不行,CK中需要子查询嵌套或者用global inner join来显示指定broadcast的字表。

select  c_last_name,c_first_name,substr(s_city,1,30),ss_ticket_number,amt,profit  from   (select ss_ticket_number          ,ss_customer_sk          ,store.s_city          ,sum(ss_coupon_amt) amt          ,sum(ss_net_profit) profit    from store_sales,date_dim,store,household_demographics    where store_sales.ss_sold_date_sk = date_dim.d_date_sk    and store_sales.ss_store_sk = store.s_store_sk    and store_sales.ss_hdemo_sk = household_demographics.hd_demo_sk    and (household_demographics.hd_dep_count = 1 or household_demographics.hd_vehicle_count > -1)    and date_dim.d_dow = 1    and date_dim.d_year in (2000,2000+1,2000+2)    and store.s_number_employees between 200 and 295    group by ss_ticket_number,ss_customer_sk,ss_addr_sk,store.s_city) ms,customer    where ss_customer_sk = c_customer_sk order by c_last_name,c_first_name,substr(s_city,1,30), profit limit 10;
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

改写后

select c_last_name, c_first_name, substr(tbl1.s_city,1,30), ss_ticket_number, amt, profitfrom customer_distglobal inner join (   select ss_ticket_number, ss_customer_sk, s_city, sum(ss_coupon_amt) as amt, sum(ss_net_profit) as profit   from store_sales_dist   global inner join ( select d_date_sk from date_dim_dist where date_dim_dist.d_dow = 1 and d_year in (2000,2000+1,2000+2) ) on ss_sold_date_sk = d_date_sk   global inner join ( select s_store_sk, s_city from store_dist where s_number_employees between 200 and 295 ) on ss_store_sk = s_store_sk   global inner join ( select hd_demo_sk from household_demographics_dist where hd_dep_count = 1 or hd_vehicle_count > -1 ) on ss_hdemo_sk = hd_demo_sk   group by ss_ticket_number, ss_customer_sk, ss_addr_sk, s_city) tbl1 on ss_customer_sk = c_customer_skorder by c_last_name, c_first_name, substr(s_city,1,30), profitlimit 10;
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

测试结论

1 导入数据Clickhouse快
2 数据压缩率Clickhouse好
3 单表查询Clickhouse快
4 Join查询两者各有优劣,数据量小情况下Clickhouse好,数据量大Doris好
5 Doris对SQL支持情况要好

clickhouse 子查询_TPCDS用于Clickhouse和Doris性能测试相关推荐

  1. clickhouse 子查询_clickHouse 常用命令

    ---客户端链接工具 clickhouse-client -m -u root -p root --大小写敏感的 CREATE TEMPORARY TABLE IF NOT EXISTS test.m ...

  2. clickhouse 子查询_Clickhouse 查询分布式表子查询 (Distributed Subqueries )

    官方文档:https://clickhouse.tech/docs/en/sql-reference/operators/in/#select-distributed-subqueries 在分布式表 ...

  3. MySQL 学习笔记(16)— 子查询(单行单列、一行多列、多行多列、 ALL、ANY、SOME 运算符、EXISTS 操作符)

    1. 子查询概念 子查询是指嵌套在其他语句(SELECT . INSERT . UPDATE . DELETE 等)中的 SELECT 语句:子查询也称为内查询( inner query )或者嵌套查 ...

  4. mysql子查询日期比较_数据分析系列 16/32 | MySQL中子查询与联合查询

    前面说了很多MySQL中的查询,比如条件查询.分组聚合查询.连接查询,今天来说一下另外两个非常的重要的查询,MySQL中的子查询和联合查询. PART01 子查询 子查询也称嵌套查询,是将一个查询语句 ...

  5. mysql+sql+子查询语句_SQL子查询

    子查询或内部查询或嵌套查询在另一个SQL查询的查询和嵌入式WHERE子句中. 子查询用于返回将被用于在主查询作为条件的数据,以进一步限制要检索的数据. 子查询可以在SELECT,INSERT,UPDA ...

  6. mysql rand() 子查询_MySQL ------ 子查询(十三)

    查询(query):任何SQL 都是查询,但此术语一般指select 语句 子查询(subquery):嵌套在查询中的查询,MySQL4.1 引入对子查询的支持. 接下来得就比较有意思了,需要你对于表 ...

  7. stotybord如何添加子视图_SQL复杂查询-子查询

    视图: 1.视图的概念引入: SQL数据库里面存放的是SQL语句,视图中查看到的SQL查询语句,当我们运用客户端连接到视图时候,视图会运行里面的查询语句,从库中查找出数据,保存在临时表里面.当客户端和 ...

  8. sql 子查询 嵌套查询_SQL子查询– SQL中的嵌套查询

    sql 子查询 嵌套查询 In the real world, there are times when we need a particular set of data but we don't h ...

  9. 子查询及其分类(标量子查询+列子查询+行子查询+表子查询)

    子查询 什么是子查询 子查询概念 子查询:sub query 子查询是一种常用计算机语言SELECT-SQL语言中嵌套查询下层的程序模块.当一个查询是另一个查询的条件时,称之为子查询. 子查询:指在一 ...

最新文章

  1. HDU1874(Dijstra算法)
  2. python爬虫和信息收集_python爬站长之家写一个信息搜集器
  3. C++显式隐式构造函数
  4. Flutter入门:dart基础
  5. 用python自制背单词程序_c++自制背单词应用
  6. CSS——设置第一个以外的元素样式:not(:first-child),设置最后一个除外的元素样式:not(:last-child)
  7. 不卖了?这家公司暂停门店销售iPhone!
  8. Systemd基础篇:systemd vs SysVinit
  9. 聊聊程序员的简历应该怎么写(帮修改简历)
  10. 视频截取程序matlab,通过matlab截取视频
  11. 最新1000道高频Java面试题,包含25个技术栈等面试攻略(多线程、JVM、高并发、spring、微服务、kafka,redis、分布式)从底层原理到架构
  12. Dreamweaver CS6下载及安装步骤
  13. 聚焦物流4大场景,RPA如何降低物流企业运营成本
  14. 关于罗德里格斯公式(Rodrigues‘sFormula)的详细推导过程
  15. 山沟沟里的技术脱贫:阿里工程师助平武蜂农物联网养蜂
  16. 第十五届吉林省大学生程序设计竞赛个人题解
  17. 2017 9 25翁凯html学习记录
  18. c#中继承和接口的区别与联系
  19. 有50级台阶,每次走一阶或两阶,有多少种走法?
  20. 机器学习实验之顾客购买服装的分析与预测

热门文章

  1. 逆向工程核心原理读书笔记-API钩取之计算器显示中文数字
  2. PostgreSQL学习笔记5之函数和操作符一
  3. C++ COM编程之什么是组件
  4. live555 源码分析:播放启动
  5. 大众点评app 数据解密和反序列化
  6. 原来这样调优可以攻破MySQL性能瓶颈
  7. BloomFilter算法概述
  8. 工具类用得好,下班下的早
  9. 多媒体技术 PI 第二期:OSS 圆桌预告
  10. 相芯科技蔡锐涛:AI虚拟形象——没有最完美,只有更完美