利用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 D select bitstring_agg(A, 1, 22) from(select 11 a union all select 13 union all select 11);
┌─────────────────────────┐
│ bitstring_agg(A, 1, 22) │
│           bit           │
├─────────────────────────┤
│ 0000000000101000000000  │
└─────────────────────────┘

memory D select bitstring(bitstring_agg(A, 1, 22),30) from(select 11 a union all select 13 union all select 11);
┌────────────────────────────────────────┐
│ bitstring(bitstring_agg(A, 1, 22), 30) │
│                  bit                   │
├────────────────────────────────────────┤
│ 000000000000000000101000000000         │
└────────────────────────────────────────┘

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

memory D create table t as (select (i*random())::int i from range(1,1000000)t(i));

memory D select count(distinct i) from t;
┌───────────────────┐
│ count(DISTINCT i) │
│       int64       │
├───────────────────┤
│            499996 │
└───────────────────┘
Run Time (s): real 0.023 user 0.136000 sys 0.016000
memory D select bit_count(bitstring_agg(i,0,1000000)) from t;
┌─────────────────────────────────────────┐
│ bit_count(bitstring_agg(i, 0, 1000000)) │
│                  int64                  │
├─────────────────────────────────────────┤
│                                  499996 │
└─────────────────────────────────────────┘
Run Time (s): real 0.008 user 0.052000 sys 0.000000

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

书生阅读器是一款专业的文档阅读和管理软件,尤其在处理电子文档、PDF文件以及各种格式的数字证书方面具有显著优势。书生阅读器7.3版是该软件的一个较新版本,针对Windows 10操作系统进行了优化,确保了在最新的Windows环境下能够稳定运行。在描述中提到,“原来老版本全卸掉以后安装,10可以用”,这意味着如果用户之前已经安装了书生阅读器的旧版本,升级到7.3版之前应先卸载旧版本。这样做可以避免不同版本之间的冲突,确保新版本的正确安装和功能的正常发挥。同时,这也表明书生阅读器7.3版兼容Windows 10系统,用户无需担心兼容性问题。“新版电子印章书生阅读器_静默版”这个压缩包文件名暗示了该版本可能包含电子印章功能,并且是静默安装版。电子印章是现代电子文档中常用的一种安全认证方式,它可以为文件提供不可篡改的签名,确保文档的真实性和完整性。静默安装则意味着在安装过程中不会出现交互界面,通常用于批量部署或自动化安装,减少用户的操作步骤。书生阅读器7.3版可能包含以下关键知识点:1. **电子文档阅读**:书生阅读器支持多种格式的电子文档,如SDF、PDF、HTML等,用户可以方便地打开、阅读和打印这些文件。2. **电子印章功能**:7.3版可能集成了电子印章工具,允许用户在文档上添加数字签名,增强文档的安全性和可信度。3. **文档编辑注释**:除了阅读,书生阅读器还可能提供基本的编辑和注释功能,如高亮、批注、添加文本等,方便用户对文档进行处理。4. **安全性隐私保护**:作为一款专业阅读器,书生阅读器会注重用户数据的安全,可能包括加密技术、防止非法访问和复制等功能。5. **Windows 10兼容性**:确保在最新操作系统环境下稳定运行,提供了流畅的用户体验,不因系统更新而影响软件性能。6. **静默安装**:适用于大规模部署或自动化场景,用户或管理员可以通过命令行参数进行无交互的安装,提高效率。7. **界面友好**:良好的用户界面设计,使得操作简单易懂,即使是新手也能快速上手。8. **性能优化**:7.3版可能针对性能进行了优化,加载速度更快,占用系统资源更少,提高整体运行效率。通过上述分析,我们可以看出书生阅读器7.3版是一个功能强大且适应现代办公需的文档处理工具,尤其适合在Windows 10环境中使用。其电子印章功能和静默安装特性,对于企业和组织的文档管理和安全控制具有显著价
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值