详情页标题前

阿里云RDS数据库位图计算(roaringbitmap)-云淘科技

详情页1

RDS PostgreSQL提供roaringbitmap插件,可以使用位图计算功能,提高查询性能。

前提条件

实例为RDS PostgreSQL 12或以上版本。

背景信息

Roaring Bitmap算法是将32位的INT类型数据划分为216个数据块(Chunk),每一个数据块对应整数的高16位,并使用一个容器(Container)来存放一个数的低16位。Roaring Bitmap将这些容器保存在一个动态数组中,作为一级索引。容器使用两种不同的结构:数组容器(Array
Container)和位图容器(Bitmap Container)。数组容器存放稀疏的数据,位图容器存放稠密的数据。如果一个容器里面的整数数量小于4096,就用数组容器来存储值。若大于4096,就用位图容器来存储值。

采用这种存储结构,Roaring Bitmap可以快速检索一个特定的值。在做位图计算(AND、OR、XOR)时,Roaring Bitmap提供了相应的算法来高效地实现在两种容器之间的运算。使得Roaring
Bitmap无论在存储和计算性能上都表现优秀。

注意事项

为确保插件的稳定性,建议升级到最新内核小版本。


说明 如需升级内核小版本,请参见升级内核小版本。

操作步骤

  1. 创建插件。示例如下:
    CREATE EXTENSION roaringbitmap;
  2. 创建带有RoaringBitmap数据类型的表。示例如下:
    CREATE TABLE t1 (id integer, bitmap roaringbitmap);
  3. 使用rb_build函数插入roaringbitmap的数据。示例如下:
    --数组位置对应的BIT值为1
    INSERT INTO t1 SELECT 1,RB_BUILD(ARRAY[1,2,3,4,5,6,7,8,9,200]);
    --将输入的多条记录的值对应位置的BIT值设置为1,最后聚合为一个roaringbitmap  
    INSERT INTO t1 SELECT 2,RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;
  4. 进行Bitmap计算(OR、AND、XOR、ANDNOT)。示例如下:
    SELECT RB_OR(a.bitmap,b.bitmap) FROM (SELECT bitmap FROM t1 WHERE id = 1) AS a,(SELECT bitmap FROM t1 WHERE id = 2) AS b;
  5. 进行Bitmap聚合计算(OR、AND、XOR、BUILD),并生成新的roaringbitmap类型。示例如下:
    SELECT RB_OR_AGG(bitmap) FROM t1;
    SELECT RB_AND_AGG(bitmap) FROM t1;
    SELECT RB_XOR_AGG(bitmap) FROM t1;
    SELECT RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;
  6. 统计基数(Cardinality),即统计roaringbitmap中包含多少个位置为1的BIT位。示例如下:
    SELECT RB_CARDINALITY(bitmap) FROM t1;
  7. 从roaringbitmap中返回位置为1的BIT下标(即位置值)。示例如下:
    SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;

Bitmap函数列表

函数名 输入 输出 描述 示例
rb_build integer[] roaringbitmap 通过数组创建一个Bitmap。
rb_build('{1,2,3,4,5}')
rb_and roaringbitmap,roaringbitmap roaringbitmap And计算。
rb_and(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_or roaringbitmap,roaringbitmap roaringbitmap Or计算。
rb_or(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_xor roaringbitmap,roaringbitmap roaringbitmap Xor计算。
rb_xor(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_andnot roaringbitmap,roaringbitmap roaringbitmap AndNot计算。
rb_andnot(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_cardinality roaringbitmap integer 统计基数。
rb_cardinality(rb_build('{1,2,3,4,5}'))
rb_and_cardinality roaringbitmap,roaringbitmap integer And计算并返回基数。
rb_and_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_or_cardinality roaringbitmap,roaringbitmap integer Or计算并返回基数。
rb_or_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_xor_cardinality roaringbitmap,roaringbitmap integer Xor计算并返回基数。
rb_xor_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_andnot_cardinality roaringbitmap,roaringbitmap integer AndNot计算并返回基数。
rb_andnot_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_is_empty roaringbitmap boolean 判断是否为空的Bitmap。
rb_is_empty(rb_build('{1,2,3,4,5}'))
rb_equals roaringbitmap,roaringbitmap boolean 判断两个Bitmap是否相等。
rb_equals(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_intersect roaringbitmap,roaringbitmap boolean 判断两个Bitmap是否相交。
rb_intersect(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_remove roaringbitmap,integer roaringbitmap 从Bitmap移除特定的Offset。
rb_remove(rb_build('{1,2,3}'),3)
rb_flip roaringbitmap,integer,integer roaringbitmap 翻转Bitmap中特定的Offset段。
rb_flip(rb_build('{1,2,3}'),2,3)
rb_minimum roaringbitmap integer 返回Bitmap中最小的Offset,如果Bitmap为空则返回-1。
rb_minimum(rb_build('{1,2,3}'))
rb_maximum roaringbitmap integer 返回Bitmap中最大的Offset,如果Bitmap为空则返回0。
rb_maximum(rb_build('{1,2,3}'))
rb_rank roaringbitmap,integer integer 返回Bitmap中小于等于指定Offset的基数。
rb_rank(rb_build('{1,2,3}'),3)
rb_iterate roaringbitmap setof integer 返回Offset List。
rb_iterate(rb_build('{1,2,3}'))

Bitmap聚合函数列表

聚合函数名 输入 输出 描述 示例
rb_build_agg integer roaringbitmap 将Offset聚合成bitmap。
rb_build_agg(1)
rb_or_agg roaringbitmap roaringbitmap Or 聚合计算。
rb_or_agg(rb_build('{1,2,3}'))
rb_and_agg roaringbitmap roaringbitmap And 聚合计算。
rb_and_agg(rb_build('{1,2,3}'))
rb_xor_agg roaringbitmap roaringbitmap Xor 聚合计算。
rb_xor_agg(rb_build('{1,2,3}'))
rb_or_cardinality_agg roaringbitmap integer Or 聚合计算并返回其基数。
rb_or_cardinality_agg(rb_build('{1,2,3}'))
rb_and_cardinality_agg roaringbitmap integer And 聚合计算并返回其基数。
rb_and_cardinality_agg(rb_build('{1,2,3}'))
rb_xor_cardinality_agg roaringbitmap integer Xor 聚合计算并返回其基数。
rb_xor_cardinality_agg(rb_build('{1,2,3}'))

内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家

阿里云企业补贴进行中: 马上申请

腾讯云限时活动1折起,即将结束: 马上收藏

同尘科技为腾讯云授权服务中心。

购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠

转转请注明出处:https://www.yunxiaoer.com/156108.html

(0)
上一篇 2023年12月9日
下一篇 2023年12月9日
详情页2

相关推荐

  • 阿里云人工智能平台PAIx13_auto_arima-云淘科技

    x13-auto-arima包括自动ARIMA模型选择程序,主要基于TRMO(1996)及后续修订中实施的Gomez和Maravall(1998)的程序。 背景信息 x13_auto_arima选择过程如下: default model esitmation 当frequency = 1时,默认模型是(0,1,1) 。 当frequency > 1时,…

    阿里云人工智能平台PAI 2023年12月10日
  • Higress云原生网关使用-云小二-阿里云

    Higress云原生网关,作为替换微服务网关的产品,在使用上,是不是直接配置多个路由规则转发到k8s的不同服务。类似于nignx的location功能。 以下为热心网友提供的参考意见 Higress是阿里云推出的一款高性能的云原生网关产品,它遵循了Kubernetes Ingress API标准,并且经过了大规模生产环境的考验。与传统的微服务网关相比,Hig…

    阿里云 2023年12月13日
  • 阿里云日志服务SLS采集公网数据-云淘科技

    对于一些应用场景,如移动端、HTML网页、PC、服务器、硬件设备、摄像头等,需要实时收集公网数据并进行实时处理。在传统架构中,一般通过前端服务器+Kafka来实现如上功能。现在日志服务LogHub功能可以代替这类架构,并提供稳定、低成本、弹性、安全的解决方案。 应用场景 公网数据采集包含移动端、外部服务器、网页和设备数据的采集,采集完成后需要进行实时计算、数…

    阿里云日志服务SLS 2023年12月10日
  • 信息流广告,信息流部分建议宽度830px,只针对默认列表样式,顺序随机
  • 阿里云日志服务SLS对接Jaeger-云淘科技

    本文介绍如何使用Jaeger客户端对接日志服务。 背景信息 容器、Serverless编程方式提升了软件交付与部署的效率。在架构的演化过程中,可以看到以下变化。 应用架构从单体系统逐步转变为微服务,其中业务逻辑变为微服务之间的调用与请求。 资源角度来看,传统服务器这个物理单位逐渐淡化,变为了虚拟资源模式。 从以上两个变化可以看到这种弹性、标准化的架构背后,原…

    阿里云日志服务SLS 2023年12月10日
  • 阿里云RDS数据库通过DMS登录RDS MySQL-云淘科技

    DMS(数据管理服务)支持数据管理、用户授权、安全审计、无锁变更、数据追踪、数据可视化等功能。本文介绍如何通过DMS登录RDS MySQL实例。 前提条件 已完成以下操作: 快速创建RDS MySQL实例 创建数据库和账号 操作步骤 访问RDS实例列表,在上方选择地域,然后单击目标实例ID。 在上方,单击登录数据库。 在弹出的DMS页面中,填写数据库账号名和…

    阿里云数据库 2023年12月9日

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信
本站为广大会员提供阿里云、腾讯云、华为云、百度云等一线大厂的购买,续费优惠,保证底价,买贵退差。