news 2026/5/19 8:50:33

利用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/5/19 8:50:28

热力学计算技术或将大幅降低AI图像生成能耗

Google搜索现在允许用户向AI概览提出后续问题Google正在对其AI搜索功能进行重大升级,新增Gemini 3模型并支持用户"无缝"提出后续问题,让搜索体验更接近智能体对话而非传统搜索引擎。升级后的搜索体验Google搜索产品副总裁Robby Stein表示&…

作者头像 李华
网站建设 2026/5/13 12:12:08

中医五行和阴阳本质是什么?精确化依据是什么?

中医的宇宙本源根基——从量子全息引力看阴阳五行的数学物理本质中医作为中华传统智慧的瑰宝,历经数千年临床实践验证其有效性,却常因“阴阳五行”的传统表述被贴上“抽象模糊”的标签,甚至被质疑缺乏科学根基。实则,阴阳的平衡法…

作者头像 李华
网站建设 2026/5/13 22:30:36

Memory MCP

作为长期与AI协同编程的实践者,我认为TRAE的Memory功能,本质上是将你从一个“重复的指令者”转变为“高效的合作者”。它让AI能记住你的工作习惯和项目规范,就像一位配合默契的搭档,不用每次都从头交代。 下面具体看看它的工作机…

作者头像 李华
网站建设 2026/5/11 5:03:19

2026年了,作为一个程序员你觉得是业务重要还是技术重要?

01 深夜的“代码危机”:技术实现已不再是壁垒 2026 年的一个深夜,我盯着屏幕上 Cursor 刚生成的几百行高质量 Rust 代码,陷入了长久的沉默。 如果是在三年前,写完这套高性能异步处理逻辑,我起码要在 CSDN 写三篇技术博客:一篇讲 Tokio 原理,一篇讲 Borrow Checker 避坑…

作者头像 李华
网站建设 2026/5/8 11:17:14

近年来,我一直在用的科研工具

对科研人来说,选对工具能直接把效率拉满。让我惊艳的科研工具非MedPeer莫属。它将文献调研、精读、绘图、基金申报四大核心需求集成一体,打造出一站式科研工作闭环,彻底改变了我的工作模式。下面这四个功能,我几乎每天都会用到。 …

作者头像 李华
网站建设 2026/5/13 5:08:14

面试题:说一说redis和Memcached的区别

一、核心定位:从诞生之初就不同 Memcached是一个纯内存键值缓存系统,设计目标是 “为动态 Web 应用减轻数据库负载”,仅用于缓存热点数据,不支持持久化,重启即清空。它的核心是极致轻量化,只做最简单的键值…

作者头像 李华