SQLite 本身并不直接支持 TPC-DS 基准测试,因为 TPC-DS 是为数据仓库和分析型系统(OLAP)设计的,而 SQLite 是嵌入式 OLTP 数据库,缺乏复杂查询所需的优化器能力。不过,仍可通过间接方式跑 TPC-DS。
🛠️ 可行的做法
用 DuckDB 生成数据再导入 SQLite:DuckDB 内置 TPC-DS 扩展,可先在其内存中生成数据,再用 CTAS 语句导入 SQLite 文件。注意 DuckDB 的 tpcds 插件不能直接写 SQLite 文件,需先生成到内存表再转换。
用官方 dsdgen 工具生成数据:从 TPC 官网下载 dsdgen,生成 .dat 文件后自行建表导入 SQLite。TPC-DS 有 24 张表、99 条查询,数据量从 1GB 到 100TB 可选。
直接跑查询会有大量语法问题:TPC-DS 查询用了大量窗口函数、CTE、INTERSECT/EXCEPT、FULL OUTER JOIN 等,SQLite 支持有限,需大量改写,且结果集可能对不上。
⚠️ 需要注意的点
性能参考意义有限:SQLite 是单机嵌入式库,TPC-DS 场景下大表扫描和复杂 join 会非常慢,跑出来的数字不能与其他 OLAP 数据库横向比较。
数据量要控制好:建议先用最小规模(SF 1,约 1GB)测试,确认流程跑通再考虑更大数据量。
行数校验很重要:导入前先核对每张表行数与官方一致,避免生成或导入环节丢数据。
若只想快速体验,用 DuckDB 生成 SF 0.01 的小数据集导入 SQLite 即可,完整跑完 99 条查询不太现实。
sqlite tpc-ds 先生成到内存表再转换
可以,但 TPC-DS 数据没法直接生成到 SQLite 文件里,得先借 DuckDB 的内存表生成,再用 CTAS 导出到 SQLite 文件。 因为 DuckDB 的 tpcds 插件只支持生成到 DuckDB 自己的数据库格式,不支持直接写 SQLite 文件。
🔄 完整操作流程
加载插件并挂载内存库:在 DuckDB 里 load tpcds 加载插件,然后 ATTACH ‘:memory:’ AS memory_db 把内存库挂进来,USE memory_db 切换过去。
生成 TPC-DS 数据到内存表:执行 call dsdgen(sf=0.01),数据会生成在内存库里。sf 是规模因子,0.01 约 10MB,1 约 1GB,按需调整。
查看生成的表名:用 .tables 命令确认哪些表已生成,如 store_returns、customer、item 等。
挂载 SQLite 文件并导出:ATTACH ‘tpcds.db’ AS sqlite_db 挂载目标 SQLite 文件,再用 CREATE TABLE sqlite_db.tpcds.customer AS FROM customer 把内存表数据导入。每张表执行一条 CTAS 语句。
验证结果:退出 DuckDB,用 SQLite 打开文件,确认表和数据都在。
⚠️ 注意事项
类型转换要留意:SQLite 没有专门的日期和布尔类型,DuckDB 的 DATE、DECIMAL 等类型导入后可能变成数字或文本,精度也可能有变化。建议导入后抽查几行数据确认。
表数量较多:TPC-DS 共 24 张表,逐条写 CTAS 比较繁琐,可以写个循环或脚本批量处理。
内存规模要算好:数据先全量落在内存里,sf 开太大可能撑爆内存。小规模测试用 sf=0.01 或 sf=0.1 起步即可。
转载自 CSDN-专业IT技术社区



