news 2026/9/30 3:19:32

利用DuckDB的bitstring_agg函数配合bit_count快速求不同值的计数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
利用DuckDB的bitstring_agg函数配合bit_count快速求不同值的计数

在翻阅DuckDB的文档时看到bitstring_agg这么个函数, 还提到能代替count(DISTINCT …)获得更高的性能。但文档没有给出输出的例子。

bitstring_agg(arg)
Description The bitstring_agg function takes any integer type as input and returns a bitstring with bits set for each distinct value. The left-most bit represents the smallest value in the column and the right-most bit the maximum value. If possible, the min and max are retrieved from the column statistics. Otherwise, it is also possible to provide the min and max values.
Example bitstring_agg(A)
Tip
The combination of bit_count and bitstring_agg can be used as an alternative to count(DISTINCT …), with possible performance improvements in cases of low cardinality and dense values.

bitstring_agg(arg, min, max)
Description Returns a bitstring with bits set for each distinct position defined in arg. All positions must be within the range [min, max] or an Out of Range Error will be thrown.
Example bitstring_agg(A, 1, 42)

先来看bitstring_agg的输出

memory Dselectbitstring_agg(A,1,22)from(select11aunionallselect13unionallselect11);┌─────────────────────────┐ │ bitstring_agg(A,1,22)│ │bit│ ├─────────────────────────┤ │0000000000101000000000│ └─────────────────────────┘ memory Dselectbitstring(bitstring_agg(A,1,22),30)from(select11aunionallselect13unionallselect11);┌────────────────────────────────────────┐ │ bitstring(bitstring_agg(A,1,22),30)│ │bit│ ├────────────────────────────────────────┤ │000000000000000000101000000000│ └────────────────────────────────────────┘

它返回从左到右第11位和第13位为1,其他位为0的二进制字符串。如果用bitstring(长度)扩充字符串的长度,则在左侧补零。
下面用随机100万个整数来测试bitstring_agg函数配合bit_count求不同值的计数,并与count(DISTINCT …)比较用时。

memory Dcreatetabletas(select(i*random())::intifromrange(1,1000000)t(i));memory Dselectcount(distincti)fromt;┌───────────────────┐ │count(DISTINCTi)│ │ int64 │ ├───────────────────┤ │499996│ └───────────────────┘ RunTime(s):real0.023user0.136000sys0.016000memory Dselectbit_count(bitstring_agg(i,0,1000000))fromt;┌─────────────────────────────────────────┐ │ bit_count(bitstring_agg(i,0,1000000))│ │ int64 │ ├─────────────────────────────────────────┤ │499996│ └─────────────────────────────────────────┘ RunTime(s):real0.008user0.052000sys0.000000

可见,虽然数据不很稠密,大概有一半重复,bit_count(bitstring_agg())还是比count(DISTINCT …)更快。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/29 9:13:56

GitHub MCP

在TRAE中集成GitHub MCP,相当于给你的AI助手配备了一套可以直接查询、操作GitHub仓库的专业工具。这能让AI在理解你的项目背景、生成相关代码或操作建议时,获得更精确的上下文。🔧 配置GitHub MCP Server你需要准备一个GitHub Personal Acces…

作者头像 李华
网站建设 2026/9/27 1:41:56

TRAE开发复杂软件最佳实践

用AI辅助工具(此处以“TRAE”代指)来生成和开发复杂软件时,可以遵循一些经过验证的做法。这些做法核心是把人放在主导位置,把AI当作一个高效的副驾驶。1. 从蓝图开始,而不是从砖头开始复杂软件像一座大楼,不…

作者头像 李华
网站建设 2026/9/27 20:38:18

大数据描述性分析中的地理空间数据处理技巧

大数据描述性分析中的地理空间数据处理技巧 关键词 大数据描述性分析、地理空间数据、数据处理技巧、空间分析、地理信息系统 摘要 本技术分析聚焦于大数据描述性分析中的地理空间数据处理技巧。首先介绍地理空间数据处理在大数据分析领域的背景与历史发展,明确相关问题空…

作者头像 李华
网站建设 2026/9/27 1:34:21

【游戏推荐】特技射击模拟器 (TrickShot Simulator)免安装中文版

类型: 休闲, 小游戏 链接:https://pan.quark.cn/s/a77fcebc0c06 游戏简介 挑战您的精准性和耐心。 用您自己的双手实现您在视频中看到的特技击球。 游戏特点: 使用鼠标投掷各种物体,击中微小的目标。 游戏难度极大,即…

作者头像 李华
网站建设 2026/9/29 9:54:35

大数据集群自动化运维:基于Eureka的服务自动注册

大数据集群不踩坑:用Eureka实现服务自动注册,让运维从“救火”变“养鱼” 关键词 大数据集群、自动化运维、Eureka、服务注册与发现、心跳检测、故障自愈、微服务 摘要 凌晨3点被监控报警叫醒、手动修改10个配置文件、盯着日志到天亮——这是很多大数据运…

作者头像 李华
网站建设 2026/9/27 6:39:01

(实用向)中断服务程序(ISR)的优化方向

一、中断开销的构成分析1.1 固定开销硬件级必要操作:包括中断检测、中断向量表查找、程序计数器保存、处理器状态寄存器保存架构依赖成本:不同处理器架构(ARM Cortex-M, RISC-V, x86)的固定开销差异显著典型范围:大多数…

作者头像 李华