• DuckDB学习-初识tpcds


    DuckDB编译

    跑TPC-DS

    编译DuckDB支持TPC-DS扩展

    下载代码,然后进源码目录,执行下面两个步骤。

    export BUILD_TPCDS=1
    make debug
    
    • 1
    • 2

    执行数据生成及查询

    在build/debug下可以看到duckdb二进制,直接执行它

    ./duckdb tpcds.db 
    
    • 1

    这样可以让数据持久化
    在这里插入图片描述
    接着执行call dsdgen(sf=0.01) 生成10MB的tpcds测试数据。

    可以开始执行tpcds语句测试了,执行pragma tpcds(1)执行第一条query语句,参数是查询语句的序号,范围是1~99。

    如果想看语句的原始语句,可以通过翻源码,在extension/tpcds/include/queries下有99条语句的duckdb改写版。

    TPC-DS简单分析(v3.2.0)

    事实表

    Store_Sales
    表中每行代表一个单独的订单项,这些订单项都是通过店铺渠道销售的,并且记录在事实表store_sales中。

    Store_returns
    表中每行代表一个单独的退货项,这些退货项都是通过店铺渠道销售的,并且记录在事实表store_returns中。

    Catalog_sales
    表中每行代表一个单独的订单项,这些订单项都是通过目录渠道销售的,并且记录在事实表catalog_sales中。

    Catalog_returns
    表中每行代表一个单独的退货项,这些退货项都是通过目录渠道销售的,并且记录在事实表catalog_returns中。

    Web_sales
    表中每行代表一个单独的订单项,这些订单项都是通过网络渠道销售的,并且记录在事实表web_sales中。

    Web_returns
    表中每行代表一个单独的退货项,这些退货项都是通过网络渠道销售的,并且记录在事实表web_returns中。

    Inventory
    表中每行表示指定周特定仓库中某商品的数量。

    维度表

    Stores
    该维度表中每行显示一个商店的细节信息。
    Call Center
    该维度表中每行显示一个呼叫中心的细节信息。
    Catalog_page
    该维度表中每行显示一个目录页的细节信息。
    Web_site
    该维度表中每行显示一个网站的细节信息。
    Web_page
    该维度表中每行显示一个网页的细节信息。
    Warehouse
    该维度表中代表显示一个存货仓库的信息。
    Customer
    该维度表中每行代表一个顾客的信息。
    Customer_address
    该维度表中每行代表一个唯一的顾客地址信息(有些顾客会有不止一个地址)。
    Customer_demographics
    顾客人群统计表中,有一行是用来显示特定的人群信息组合。
    Date_dim
    该表中,每一行代表一个公历日。该行的儒略日可以用作代理关键字(d_date_sk)
    Household_demographics
    该表中,每一行表示一个家庭人群状况。
    Item
    该表中,每一行表示一个特定产品的构成(例如,尺寸,颜色,制造商等)。
    Income_band
    该表中的每一行表示一个收入范围的信息。
    Promotion
    该表中,每行表示一个特定商品的促销信息(例如广告,销售,公关)。
    Reason
    此表中的每一行表示一个被退货的商品的退货原因。
    Ship_mode
    此表中的每一行表示一种运送模式。
    Time_dim
    该表中每行表示一秒。
    dsdgen_version
    基准测试时不会用到这个表,dsdgen会生成一个flat file(见附录F),这个文件可以确保你在使用时,当前的数据集是由正确版本的TPC-DS搭建的。

    查看查询计划

    安装duckdb的依赖

    pip3 install duckdb
    
    • 1

    在duckdb的执行终端里执行命令开启profile输出到json文件

    PRAGMA enable_profiling='json';
    
    • 1

    然后可以执行源码的

    scripts/generate_queryplan.py /path/to/jsonfile /path/to/output.html
    
    • 1

    output.html是图像化的方式展示查询计划,并且包含每个算子的执行时间,用浏览器打开即可,可以看执行计划比较直观一些。

    DuckDB的代码调试(以vscode为例)

    去examples/embedded-c++目录下,执行

    cmake .
    make -j
    
    • 1
    • 2

    即可编译代码,但是为了能gdb执行,需要修改下编译文件,让生成的二进制带有debug信息,修改cmake文件如下:

    cmake_minimum_required(VERSION 2.8.12)
    project(example-c++)
    
    set(CMAKE_CXX_STANDARD 11)
    
    include_directories(../../src/include)
    link_directories(../../build/debug/src)
    
    add_definitions("-Wall -g")
    add_executable(main main.cpp)
    target_link_libraries(main duckdb)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    重点是两个:

    1. 链接的动态库的路径改成debug路径下
    2. 添加-Wall -g标志,生成带debug信息的二进制版本

    然后在main.cpp里打断点,执行调试。
    vscode会生成launch.json文件,修改下二进制路径,改成生成的二进制路径即可
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/9bcb4008a5974b26aeff1d52c88a321f.png

    参考:

    1. https://github.com/duckdb/duckdb
    2. https://blog.csdn.net/github_38325884/article/details/72835953?ops_request_misc=&request_id=&biz_id=102&utm_term=TPC-DS&utm_medium=distribute.pc_search_result.none-task-blog-2blogsobaiduweb~default-5-72835953.nonecase&spm=1018.2226.3001.4450
    3. https://duckdb.org/dev/profiling
  • 相关阅读:
    据安全的重要性:如何解密[thekeyishere@cock.li].Elbie勒索病毒
    【C语言】通讯录——示例以及详解
    IPv6的主要优势有哪些?
    Java IO流概述和分类
    十大经典排序算法(java实现、配图解,附源码)
    如何看待 30 岁学云计算,转行做云计算运维这件事?
    基于ArcGIS水文分析、HEC-RAS模拟技术在洪水危险性及风险评估
    力扣(LeetCode)115. 不同的子序列(C++)
    Java中ExecutorService线程的Callable的future.get()方法堵塞当前线程解决方法
    C# 滑动验证码|拼图验证|SlideCaptcha
  • 原文地址:https://blog.csdn.net/seedcup/article/details/127875338