在linux和windows中解决duckdb 1.6dev版本输出执行计划报错问题
duckdb 1.6dev版本最近输出执行计划默认支持翻页翻页程序在linux中是less, 在windows中是more。但有的linux环境比如docker debian 13镜像中不包括less程序。显示较长的执行计划就会报错rootkylin:/par# ./duckdb0701 DuckDB v1.6.0-dev10007 (Development Version, 2daa4fc9a4) explain SELECT d.bucket, count(*) AS cnt, avg(b.measure) AS avg_measure FROM fact_a a JOIN dim d USING (keyid) JOIN fact_b b USING (keyid) GROUP BY d.bucket; sh: 1: less: not found而直接在linux命令行执行, 因为不调用翻页程序是能够输出的sh: 1: less: not found memory D rootkylin:/par# ./duckdb0701 a.sql ╭─ Order By ────────────────────────────────╮ │ Order By: d.bucket ASC │ │ ~2,000 rows │ ╰─────────────────────┬─────────────────────╯ ╭─ Projection ────────┴─────────────────────╮ │ Projections: #0, #1, │ │ /(#2, CAST(#3 AS DOUBLE)) │ │ ~2,000 rows │ ╰─────────────────────┬─────────────────────╯尝试从其他系统复制less程序和所需动态库并将其目录加入搜索路径结果显示乱码kylinkylin:/data/i$ whereis less less: /usr/bin/less /bin/less /usr/share/man/man1/less.1.gz kylinkylin:/data/i$ cp /usr/bin/less . kylinkylin:/data/i$ ldd less linux-vdso.so.1 (0x0000007f8eb29000) /usr/lib/libzfh.so (0x0000007f8e89e000) libtinfo.so.5 /lib/aarch64-linux-gnu/libtinfo.so.5 (0x0000007f8e848000) libc.so.6 /lib/aarch64-linux-gnu/libc.so.6 (0x0000007f8e701000) /lib/ld-linux-aarch64.so.1 (0x0000007f8eafe000) libpthread.so.0 /lib/aarch64-linux-gnu/libpthread.so.0 (0x0000007f8e6d5000) libdl.so.2 /lib/aarch64-linux-gnu/libdl.so.2 (0x0000007f8e6c2000) kylinkylin:/data/i$ cp /lib/aarch64-linux-gnu/libtinfo.so.5 . kylinkylin:/data/i$ rootkylin:/par# export LD_LIBRARY_PATH.:$LD_LIBRARY_PATH rootkylin:/par# ./less Missing filename (less --help for help) rootkylin:/par# export PATH./:$PATH rootkylin:/par# ./duckdb0701 DuckDB v1.6.0-dev10007 (Development Version, 2daa4fc9a4) Enter .help for usage hints. memory D .read a.sql E295ADE29480 Order By E29480E29480E29480E29480E29480E29480E29480E29480E29480E29480E29480E29480E294 E29482 Order By: d.bucket ASC E29482 E29482 ~2,000 rows E29482 E295B0E29480E29480E29480E29480E29480E29480E29480E29480E29480E29480E29480E29480E29480E29480E294 E295ADE29480 Projection E29480E29480E29480E29480E29480E29480E29480E29480E294B4E29480E29480E29480E294 E29482 Projections: #0, #1, E29482 E29482 /(#2, CAST(#3 AS DOUBLE)) E29482 E29482 ~2,000 rows E29482将默认翻页程序改为cat实际上不再支持翻页, 就能正常输出了。rootkylin:/par# export PAGERcat rootkylin:/par# ./duckdb0701 DuckDB v1.6.0-dev10007 (Development Version, 2daa4fc9a4) Enter .help for usage hints. memory D .read a.sql ╭─ Order By ────────────────────────────────╮ │ Order By: d.bucket ASC │ │ ~2,000 rows │ ╰─────────────────────┬─────────────────────╯windows中默认没有less程序duckdb调用more来翻页导致显示串行问题。memory D .read a2.sql ╭─ Summary ───────────╮ │ Total Time: 0.0385s │ ╭─ Order By ───────────────────────╮ │ Order By: final_agg.bucket ASC │ │ 100 rows 10.0ms │ ╭─ Projection ────┴────────────────╮ │ 100 rows 0µs │ ╭─ Hash Group By ─┴────────────────╮ │ Groups: #0 │ │ Aggregates: sum(#1), sum(#2) │ │ 100 rows 40.0ms │ ╭─ Projection ────┴────────────────╮ │ 2,000 rows 0µs │ ╭─ Hash Join ─────┴────────────────╮ │ 2,000 rows 0µs │ ╭─ Hash Join ─────┴────────────────╮ ╭─────────────────┴────────────────╮ │ 2,000 rows 0µs │ │ Hash Group By 2,000 rows · 0µs │ ╰─────────────────┬────────────────╯ │ Projection 150,000 rows · 0µs │ -- More --想到windows的type命令可以打印纯文本改为set PAGERtype还是不行可能因为type是内部命令不是具体的文件名无法找到。set PAGERtype C:\dduckdb0701 DuckDB v1.6.0-dev10027 (Development Version, 3cb65aa794) Enter .help for usage hints. memory D .read a2.sql 命令语法不正确。怎么才能在windows中使用linux命令方法之一是使用MSYS2工具集。到清华源镜像站(https://mirrors.tuna.tsinghua.edu.cn/msys2/distrib/x86_64/)下载安装包安装然后将安装目录加入路径。C:\dset pathC:\d\msys64\usr\bin;%path% C:\dset PAGERcat C:\dduckdb0701 DuckDB v1.6.0-dev10027 (Development Version, 3cb65aa794) Enter .help for usage hints. memory D .read a2.sql ╭─ Summary ───────────╮ │ Total Time: 0.0154s │ ╰─────────────────────╯ ╭──────────────────────────────────╮ │ Order By 100 rows · 0µs │ │ Projection 100 rows · 0µs │ ╰─────────────────┬────────────────╯ ╭─ Hash Group By ─┴────────────────╮ │ Groups: #0 │ │ Aggregates: sum(#1), sum(#2) │ │ 100 rows 20.0ms │ ╰─────────────────┬────────────────╯ ╭─ Projection ────┴────────────────╮ │ 2,000 rows 0µs │ ╰─────────────────┬────────────────╯需要注意msys2中虽然也有less程序同样会导致乱码别用。用来测试的脚本是。explainanalyzeWITHfact_aAS(SELECTLEAST(1999,FLOOR(2000*POW(i::DOUBLE/150000,3.74)))::INTEGERASkeyidFROMrange(150000)t(i)),fact_bAS(SELECTLEAST(1999,FLOOR(2000*POW(i::DOUBLE/150000,3.74)))::INTEGERASkeyid,(((i*13)%1000)::DOUBLE/7.0)ASmeasureFROMrange(150000)t(i)),dimAS(SELECTi::INTEGERASkeyid,(i%100)::INTEGERASbucketFROMrange(2000)t(i)),-- fact_a 按 keyid 分组计算每个 keyid 的计数agg_aAS(SELECTkeyid,COUNT(*)AScnt_per_keyidFROMfact_aGROUPBYkeyid),-- fact_b 按 keyid 分组计算每个 keyid 的 measure 总和agg_bAS(SELECTkeyid,COUNT(*)AScnt_per_keyid2,SUM(measure)ASsum_measure_per_keyidFROMfact_bGROUPBYkeyid),-- 关联 agg_a、agg_b 和 dim按 bucket 分组汇总final_aggAS(SELECTd.bucket,SUM(a.cnt_per_keyid*cnt_per_keyid2)AScnt,SUM(b.sum_measure_per_keyid*cnt_per_keyid2)/cntASavg_measureFROMagg_a aJOINagg_b bONa.keyidb.keyidJOINdim dONa.keyidd.keyidGROUPBYd.bucket)SELECTbucket,cnt,avg_measureFROMfinal_aggORDERBYbucket;