DuckDB编译
文章目录
跑TPC-DS
编译DuckDB支持TPC-DS扩展
下载代码,然后进源码目录,执行下面两个步骤。
export BUILD_TPCDS=1
make debug
执行数据生成及查询
在build/debug下可以看到duckdb二进制,直接执行它
./duckdb tpcds.db
这样可以让数据持久化
接着执行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
在duckdb的执行终端里执行命令开启profile输出到json文件
PRAGMA enable_profiling='json';
然后可以执行源码的
scripts/generate_queryplan.py /path/to/jsonfile /path/to/output.html
output.html是图像化的方式展示查询计划,并且包含每个算子的执行时间,用浏览器打开即可,可以看执行计划比较直观一些。
DuckDB的代码调试(以vscode为例)
去examples/embedded-c++目录下,执行
cmake .
make -j
即可编译代码,但是为了能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)
重点是两个:
- 链接的动态库的路径改成debug路径下
- 添加-Wall -g标志,生成带debug信息的二进制版本
然后在main.cpp里打断点,执行调试。
vscode会生成launch.json文件,修改下二进制路径,改成生成的二进制路径即可
参考:
- https://github.com/duckdb/duckdb
- 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
- https://duckdb.org/dev/profiling