Greenplum roaring bitmap与业务场景 (类阿里云RDS PG varbitx, 应用于海量用户 实时画像和圈选、透视)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
简介:

标签

PostgreSQL , Greenplum , varbitx , roaring bitmap , pilosa , varbit , hll , 多阶段聚合


背景

roaring bitmap是一个压缩比很高同时性能不错的BIT库,被广泛使用(例如Greenplum, ES, InfluxDB......):

Roaring bitmaps are compressed bitmaps which tend to outperform conventional compressed bitmaps such as WAH, EWAH or Concise. They are used by several major systems such as Apache Lucene and derivative systems such as Solr and Elasticsearch, Metamarkets' Druid, LinkedIn Pinot, Netflix Atlas, Apache Spark, OpenSearchServer, Cloud Torrent, Whoosh, InfluxDB, Pilosa, Bleve, Microsoft Visual Studio Team Services (VSTS), and eBay's Apache Kylin.

《Roaring Bitmap - A better compressed bitset》

https://github.com/RoaringBitmap/CRoaring

在PostgreSQL中内置了varbit的数据类型,阿里云在其基础上扩展了对varbit的操作符:

《阿里云RDS for PostgreSQL varbitx插件与实时画像应用场景介绍》

是的阿里云RDS PG支持以更低的成本、更高的性能支持海量画像的实时计算:

《阿里云RDS PostgreSQL varbitx实践 - 流式标签 (阅后即焚流式批量计算) - 万亿级,任意标签圈人,毫秒响应》

《基于 阿里云 RDS PostgreSQL 打造实时用户画像推荐系统(varbitx)》

《惊天性能!单RDS PostgreSQL实例 支撑 2000亿 - 实时标签透视案例》

对于Greenplum,同样有社区的朋友贡献的插件,让Greenplum可以支持roaringbitmap类型。

开源代码如下(感谢贡献代码的小伙伴):

https://github.com/zeromax007/gpdb-roaringbitmap

(目前这个版本没有将聚合做到计算节点,而是走了gather motion再聚合的方式,聚合性能不佳)。

postgres=# explain select rb_cardinality(rb_and_agg(bitmap)) from t1;  
                                       QUERY PLAN                                         
----------------------------------------------------------------------------------------  
 Aggregate  (cost=1.05..1.07 rows=1 width=4)  
   ->  Gather Motion 3:1  (slice1; segments: 3)  (cost=0.00..1.05 rows=1 width=1254608)  
         ->  Seq Scan on t1  (cost=0.00..1.01 rows=1 width=1254608)  
(3 rows)  
  
Time: 0.727 ms  
AI 代码解读

建议有兴趣的同学可以改进一下 roaringbitmap for Greenplum 聚合代码,改成多阶段聚合,让聚合先在计算节点做。

自定义分布式聚合的方法参考如下:

《PostgreSQL 10 自定义并行计算聚合函数的原理与实践》

《Postgres-XC customized aggregate introduction》

《PostgreSQL aggregate function customize》

《Greenplum 最佳实践 - 估值插件hll的使用(以及hll分式聚合函数优化)》

接下来简单介绍一下roaringbitmap的安装与功能点。

安装

1、首先你需要安装好greenplum。

2、然后你需要下载gpdb-roaringbitmap

git clone https://github.com/zeromax007/gpdb-roaringbitmap  
AI 代码解读

3、编译gpdb-roaringbitmap

If $GPHOME is /usr/local/gpdb .  
  
gcc -march=native -O3 -std=c11 -Wall -Wpointer-arith  -Wendif-labels -Wformat-security \
-fno-strict-aliasing -fwrapv -fexcess-precision=standard -fno-aggressive-loop-optimizations \
-Wno-unused-but-set-variable -Wno-address -fpic -D_GNU_SOURCE \
-I/usr/local/gpdb/include/postgresql/server \
-I/usr/local/gpdb/include/postgresql/internal \
-c -o roaringbitmap.o roaringbitmap.c  
  
或如下,主要看你的头文件在哪里  
  
gcc -march=native -O3 -std=c11 -Wall -Wpointer-arith  -Wendif-labels -Wformat-security \
-fno-strict-aliasing -fwrapv -fexcess-precision=standard -fno-aggressive-loop-optimizations \
-Wno-unused-but-set-variable -Wno-address -fpic -D_GNU_SOURCE \
-I/usr/local/gpdb/include/server \
-I/usr/local/gpdb/include/internal \
-c -o roaringbitmap.o roaringbitmap.c  
  
gcc -O3 -std=gnu99 -Wall -Wpointer-arith  -Wendif-labels -Wformat-security \
-fno-strict-aliasing -fwrapv -fexcess-precision=standard -fno-aggressive-loop-optimizations \
-Wno-unused-but-set-variable -Wno-address  -fpic -shared --enable-new-dtags \
-o roaringbitmap.so roaringbitmap.o  
AI 代码解读

4、将so文件拷贝到所有gpdb节点(所有master, slave, segment, mirror等)的软件目录对应的lib目录中.

cp ./roaringbitmap.so /usr/local/gpdb/lib/postgresql/  
AI 代码解读

5、在MASTER节点,连接到需要使用roaringbitmap的DB中,执行如下SQL,安装对应的类型,操作符,函数等。

psql -f ./roaringbitmap.sql  
AI 代码解读

使用DEMO

1、建表,使用roaringbitmap数据类型

CREATE TABLE t1 (id integer, bitmap roaringbitmap);  
AI 代码解读

2、使用rb_build生成roaringbitmap的数据(输入为数组,输出为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;    
AI 代码解读

3、两个roaringbitmap的BIT计算(OR, AND, XOR, ANDNOT)。andnot表示第一个参数与第二个参数的NOT进行AND操作,等同于andnot(c1,c2)==and(c1, not(c2))

SELECT RB_OR(a.bitmap,b.bitmap) FORM (SELECT bitmap FROM t1 WHERE id = 1) AS a, (SELECT bitmap FROM t1 WHERE id = 2) AS b;  
AI 代码解读

4、一些聚合操作,并生成新的roaringbitmap (OR, AND, XOR, BUILD)

SELECT RB_OR_AGG(bitmap) FROM t1;  
SELECT RB_AND_AGG(bitmap) FORM t1;  
SELECT RB_XOR_AGG(bitmap) FROM t1;  
SELECT RB_BUILD_AGG(e) FROM GENERATE_SERIES(1,100) e;  
AI 代码解读

5、Cardinality,即roaringbitmap中包含多少个位置为1的BIT位。

SELECT RB_CARDINALITY(bitmap) FROM t1;  
AI 代码解读

6、从roaringbitmap返回位置为1的BIT的下标(位置值)。

SELECT RB_ITERATE(bitmap) FROM t1 WHERE id = 1;  
  
postgres=# select rb_iterate(rb_build('{1,4,100}'));  
 rb_iterate   
------------  
          1  
          4  
        100  
(3 rows)  
AI 代码解读

7、一些bit设置操作

postgres=# select rb_iterate(rb_flip(rb_build('{1,2,3,100,4,5}'),7,10));  
 rb_iterate   
------------  
          1  
          2  
          3  
          4  
          5  
          7  
          8  
          9  
        100  
(9 rows)  
  
  
AI 代码解读

内置计算函数说明

                                              List of functions  
   Schema   |          Name          | Result data type |            Argument data types             |  Type    
------------+------------------------+------------------+--------------------------------------------+--------  
 public     | rb_and                 | roaringbitmap    | roaringbitmap, roaringbitmap               | normal  
 public     | rb_and_cardinality     | integer          | roaringbitmap, roaringbitmap               | normal  
 public     | rb_andnot              | roaringbitmap    | roaringbitmap, roaringbitmap               | normal  
 public     | rb_andnot_cardinality  | integer          | roaringbitmap, roaringbitmap               | normal  
 public     | rb_build               | roaringbitmap    | integer[]                                  | normal  
 public     | rb_cardinality         | integer          | roaringbitmap                              | normal  
 public     | rb_equals              | boolean          | roaringbitmap, roaringbitmap               | normal  
 public     | rb_flip                | roaringbitmap    | roaringbitmap, integer, integer            | normal  
 public     | rb_intersect           | boolean          | roaringbitmap, roaringbitmap               | normal  
 public     | rb_is_empty            | boolean          | roaringbitmap                              | normal  
 public     | rb_iterate             | SETOF integer    | roaringbitmap                              | normal  
 public     | rb_maximum             | integer          | roaringbitmap                              | normal  
 public     | rb_minimum             | integer          | roaringbitmap                              | normal  
 public     | rb_or                  | roaringbitmap    | roaringbitmap, roaringbitmap               | normal  
 public     | rb_or_cardinality      | integer          | roaringbitmap, roaringbitmap               | normal  
 public     | rb_rank                | integer          | roaringbitmap, integer                     | normal  
 public     | rb_remove              | roaringbitmap    | roaringbitmap, integer                     | normal  
 public     | rb_xor                 | roaringbitmap    | roaringbitmap, roaringbitmap               | normal  
 public     | rb_xor_cardinality     | integer          | roaringbitmap, roaringbitmap               | normal  
AI 代码解读
Function Input Output Desc Example
rb_build integer[] roaringbitmap Build a roaringbitmap tuple from integer array. rb_build('{1,2,3,4,5}')
rb_and roraingbitmap,roaringbitmap roaringbitmap Two roaringbitmap tuples and calculation. rb_and(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_or roraingbitmap,roaringbitmap roaringbitmap Two roaringbitmap tuples or calculation. rb_or(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_xor roraingbitmap,roaringbitmap roaringbitmap Two roaringbitmap tuples xor calculation. rb_xor(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_andnot roraingbitmap,roaringbitmap roaringbitmap Two roaringbitmap tuples andnot calculation. rb_andnot(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_cardinality roraingbitmap integer Retrun roaringbitmap tuple's cardinality. rb_cardinality(rb_build('{1,2,3,4,5}'))
rb_and_cardinality roraingbitmap,roaringbitmap integer Two roaringbitmap tuples and calculation, return cardinality. rb_and_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_or_cardinality roraingbitmap,roaringbitmap integer Two roaringbitmap tuples or calculation, return cardinality. rb_or_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_xor_cardinality roraingbitmap,roaringbitmap integer Two roaringbitmap tuples xor calculation, return cardinality. rb_xor_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_andnot_cardinality roraingbitmap,roaringbitmap integer Two roaringbitmap tuples andnot calculation, return cardinality. rb_andnot_cardinality(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_is_empty roraingbitmap boolean Check if roaringbitmap tuple is empty. rb_is_empty(rb_build('{1,2,3,4,5}'))
rb_equals roraingbitmap,roaringbitmap boolean Check two roaringbitmap tuples are equal. rb_equals(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_intersect roraingbitmap,roaringbitmap boolean Check two roaringbitmap tuples are intersect. rb_intersect(rb_build('{1,2,3}'),rb_build('{3,4,5}'))
rb_remove roraingbitmap,integer roraingbitmap Remove the specified offset from roaringbitmap tuple. rb_remove(rb_build('{1,2,3}'),3)
rb_flip roraingbitmap,integer,integer roraingbitmap Flip the specified offsets range (not include the end) from roaringbitmap tuple. rb_flip(rb_build('{1,2,3}'),7,10) -- 翻转BIT位置为7到10(不含10)的BIT值
rb_minimum roraingbitmap integer Return the smallest offset in roaringbitmap tuple. Return UINT32_MAX if the bitmap tuple is empty. rb_minimum(rb_build('{1,2,3}')) -- 返回该roaringbitmap中bit值设置为1的最小位置
rb_maximum roraingbitmap integer Return the greatest offset in roaringbitmap tuple. Return 0 if the bitmap tuple is empty. rb_maximum(rb_build('{1,2,3}')) -- 返回该roaringbitmap中bit值设置为1的最大位置
rb_rank roraingbitmap,integer integer Return the number of offsets that are smaller or equal to the specified offset. rb_rank(rb_build('{1,2,3}'),3) -- BIT位置小于等于N的BIT中,有多少个bit位置被设置为1
rb_iterate roaringbitmap SETOF integer Bitmap to SETOF integer rb_iterate(rb_build('{1,2,3,100}'))

内置聚合函数说明

                                                    List of functions  
 Schema |          Name           |     Result data type      |               Argument data types                |  Type    
--------+-------------------------+---------------------------+--------------------------------------------------+--------  
 public | rb_and_agg              | roaringbitmap             | roaringbitmap                                    | agg  
 public | rb_and_cardinality_agg  | integer                   | roaringbitmap                                    | agg  
 public | rb_build_agg            | roaringbitmap             | integer                                          | agg  
 public | rb_or_agg               | roaringbitmap             | roaringbitmap                                    | agg  
 public | rb_or_cardinality_agg   | integer                   | roaringbitmap                                    | agg  
 public | rb_xor_agg              | roaringbitmap             | roaringbitmap                                    | agg  
 public | rb_xor_cardinality_agg  | integer                   | roaringbitmap                                    | agg  
AI 代码解读
Function Input Output Desc Example
rb_build_agg integer roraingbitmap Build a roaringbitmap tuple from a integer set. rb_build_agg(1)
rb_or_agg roraingbitmap roraingbitmap Or Aggregate calculations from a roraingbitmap set. rb_or_agg(rb_build('{1,2,3}'))
rb_and_agg roraingbitmap roraingbitmap And Aggregate calculations from a roraingbitmap set. rb_and_agg(rb_build('{1,2,3}'))
rb_xor_agg roraingbitmap roraingbitmap Xor Aggregate calculations from a roraingbitmap set. rb_xor_agg(rb_build('{1,2,3}'))
rb_or_cardinality_agg roraingbitmap integer Or Aggregate calculations from a roraingbitmap set, return cardinality. rb_or_cardinality_agg(rb_build('{1,2,3}'))
rb_and_cardinality_agg roraingbitmap integer And Aggregate calculations from a roraingbitmap set, return cardinality. rb_and_cardinality_agg(rb_build('{1,2,3}'))
rb_xor_cardinality_agg roraingbitmap integer Xor Aggregate calculations from a roraingbitmap set, return cardinality. rb_xor_cardinality_agg(rb_build('{1,2,3}'))

例子

《惊天性能!单RDS PostgreSQL实例 支撑 2000亿 - 实时标签透视案例》

背景:

有20亿个BIT,有几千万的标签。意味着有几千万行,每一行有20亿个BIT组成的roaringbitmap。

求任意标签组合的cardinate. (rb_???_cardinality_agg)

设计:

数据按标签字段分布:

create table tbl (tagid int primary key, bitmap roaringbitmap)   
distributed by (tagid) ;  
AI 代码解读

SQL:

1、求合并的BIT中有多少为1的BIT

select rb_and_cardinality_agg(bitmap) from tbl where tagid in (?,......?);  
AI 代码解读

2、求合并的BIT,对应的BIT位置

select RB_ITERATE(rb) from (select rb_and_agg(bitmap) as rb from tbl where tagid in(1,2,3)) t;  
AI 代码解读

加速

由于目前roaringbitmap gp这个插件没有支持agg中的prefunc,所以聚合是收集到master节点操作的,这个势必影响性能。

postgres=# explain select rb_and_cardinality_agg(bitmap) from tbl where tagid in (1,2,3,4,5,6,7,8);  
                                    QUERY PLAN                                       
-----------------------------------------------------------------------------------  
 Aggregate  (cost=0.04..0.06 rows=1 width=4)  
   ->  Gather Motion 3:1  (slice1; segments: 3)  (cost=0.00..0.04 rows=1 width=32)  
         ->  Seq Scan on tbl  (cost=0.00..0.00 rows=1 width=32)  
               Filter: tagid = ANY ('{1,2,3,4,5,6,7,8}'::integer[])  
(4 rows)  
  
postgres=# explain select RB_ITERATE(rb) from (select rb_and_agg(bitmap) as rb from tbl where tagid in(1,2,3)) t;  
                                       QUERY PLAN                                          
-----------------------------------------------------------------------------------------  
 Result  (cost=0.04..0.07 rows=3 width=32)  
   ->  Aggregate  (cost=0.04..0.06 rows=1 width=32)  
         ->  Gather Motion 3:1  (slice1; segments: 3)  (cost=0.00..0.04 rows=1 width=32)  
               ->  Seq Scan on tbl  (cost=0.00..0.00 rows=1 width=32)  
                     Filter: tagid = ANY ('{1,2,3}'::integer[])  
(5 rows)  
AI 代码解读

为了加速,务必要实现这些聚合函数的prefunc。

Greenplum支持的两种聚合运算模式:

1. 如果只配置了sfunc,则相关数据全部收集到master节点,在master节点对所有数据依条加上sfunc的结果(第一次可选为initcond)输入给sfunc计算,直到所有数据都跑完sfunc,最后如果设置了finalfunc,则计算并得到最终结果。

2. 如果同时配置了sfunc和prefunc,则在segment节点并行完成sfunc,然后将segment节点执行的结果发给master,在master调用prefunc进行再次聚合,输出结果,如果配置了finalfunc,则这个结果再给finalfunc执行并输出最终结果。

优化例子:

//bitmap and trans  
PG_FUNCTION_INFO_V1(rb_and_trans_pre);  
Datum rb_and_trans_pre(PG_FUNCTION_ARGS);  
  
Datum  
rb_and_trans_pre(PG_FUNCTION_ARGS) {  
    MemoryContext aggctx;  
    roaring_bitmap_t *r1;  
    roaring_bitmap_t *r2;  
  
    // We must be called as a transition routine or we fail.  
    if (!AggCheckCallContext(fcinfo, &aggctx))  
        ereport(ERROR,  
                (errcode(ERRCODE_DATA_EXCEPTION),  
                        errmsg("rb_and_trans outside transition context")));  
  
    // Is the first argument a NULL?  
    if (PG_ARGISNULL(0)) {  
        r1 = setup_roaringbitmap(aggctx);  
    } else {  
        r1 = (roaring_bitmap_t *) PG_GETARG_POINTER(0);  
    }  
  
    // Is the second argument non-null?  
    if (!PG_ARGISNULL(1)) {  
  
        r2 = (roaring_bitmap_t *) PG_GETARG_POINTER(1);  
  
        if (PG_ARGISNULL(0)) {  
            r1 = roaring_bitmap_copy(r2);  
        } else {  
            roaring_bitmap_and_inplace(r1, r2);  
        }  
        roaring_bitmap_free(r2);  
    }  
  
    PG_RETURN_POINTER(r1);  
}  
  
CREATE OR REPLACE FUNCTION rb_and_trans_pre(internal, internal)  
     RETURNS internal  
      AS 'roaringbitmap.so', 'rb_and_trans_pre'  
     LANGUAGE C IMMUTABLE;  
  
CREATE AGGREGATE rb_and_agg(roaringbitmap)(  
       SFUNC = rb_and_trans,  
       PREFUNC = rb_and_trans_pre,  
       STYPE = internal,  
       FINALFUNC = rb_serialize  
);  
AI 代码解读

实现prefunc后,执行计划就会变成这样的,先在计算节点执行一阶段聚合,然后再到master执行第二阶段的聚合,效率明显提升。

postgres=# explain select RB_ITERATE(rb) from (select rb_and_agg(bitmap) as rb from tbl where tagid in(1,2,3)) t;
                                       QUERY PLAN                                       
----------------------------------------------------------------------------------------
 Result  (cost=0.07..0.10 rows=3 width=32)
   ->  Aggregate  (cost=0.07..0.08 rows=1 width=32)
         ->  Gather Motion 3:1  (slice1; segments: 3)  (cost=0.01..0.06 rows=1 width=4)
               ->  Aggregate  (cost=0.01..0.01 rows=1 width=4)
                     ->  Seq Scan on tbl  (cost=0.00..0.00 rows=1 width=32)
                           Filter: tagid = ANY ('{1,2,3}'::integer[])
(6 rows)


postgres=# explain select rb_and_agg(bitmap) from tbl where tagid in (1,2,3,4,5,6,7,8);
                                    QUERY PLAN                                    
----------------------------------------------------------------------------------
 Aggregate  (cost=0.07..0.08 rows=1 width=32)
   ->  Gather Motion 3:1  (slice1; segments: 3)  (cost=0.01..0.06 rows=1 width=4)
         ->  Aggregate  (cost=0.01..0.01 rows=1 width=4)
               ->  Seq Scan on tbl  (cost=0.00..0.00 rows=1 width=32)
                     Filter: tagid = ANY ('{1,2,3,4,5,6,7,8}'::integer[])
(5 rows)
AI 代码解读

小结

gpdb-roaringbitmap是一个很好的插件,可以帮助用户高效的实现多组标签的人群圈选。

目前需要实现prefunc来支持多阶段聚合,否则只能gather到master去聚合。文中有例子。

参考

《PostgreSQL (varbit, roaring bitmap) VS pilosa(bitmap库)》

《Roaring Bitmap - A better compressed bitset》

《阿里云RDS PostgreSQL varbitx实践 - 流式标签 (阅后即焚流式批量计算) - 万亿级,任意标签圈人,毫秒响应》

《基于 阿里云 RDS PostgreSQL 打造实时用户画像推荐系统(varbitx)》

《阿里云RDS for PostgreSQL varbitx插件与实时画像应用场景介绍》

《Greenplum 最佳实践 - 估值插件hll的使用(以及hll分式聚合函数优化)》

《PostgreSQL 10 自定义并行计算聚合函数的原理与实践》

《Postgres-XC customized aggregate introduction》

《PostgreSQL aggregate function customize》

https://github.com/RoaringBitmap/CRoaring

https://github.com/zeromax007/gpdb-roaringbitmap

《惊天性能!单RDS PostgreSQL实例 支撑 2000亿 - 实时标签透视案例》

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
打赏
0
3
0
1
20686
分享
相关文章
【PG锦囊】阿里云 RDS PostgreSQL 版插件—AI 插件(rds_ai)
本文介绍了AI 插件(rds_ai)的核心优势、适用场景等,帮助您更好地了解 rds_ai 插件。想了解更多 RDS 插件信息和讨论交流,欢迎加入 RDS PG 插件用户专项服务群(103525002795)
阿里云 DataWorks 正式支持 SelectDB & Apache Doris 数据源,实现 MySQL 整库实时同步
阿里云数据库 SelectDB 版是阿里云与飞轮科技联合基于 Apache Doris 内核打造的现代化数据仓库,支持大规模实时数据上的极速查询分析。通过实时、统一、弹性、开放的核心能力,能够为企业提供高性价比、简单易用、安全稳定、低成本的实时大数据分析支持。SelectDB 具备世界领先的实时分析能力,能够实现秒级的数据实时导入与同步,在宽表、复杂多表关联、高并发点查等不同场景下,提供超越一众国际知名的同类产品的优秀性能,多次登顶 ClickBench 全球数据库分析性能排行榜。
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
146 0
MySQL——数据库备份上传到阿里云OSS存储
MySQL——数据库备份上传到阿里云OSS存储
292 0
基于阿里云的PolarDB MySQL版实现AI增强数据管理
本文将介绍如何利用阿里云的PolarDB MySQL版结合AI技术,实现数据管理的自动化和智能化。
556 0
数据库容灾 | MySQL MGR与阿里云PolarDB-X Paxos的深度对比
经过深入的技术剖析与性能对比,PolarDB-X DN凭借其自研的X-Paxos协议和一系列优化设计,在性能、正确性、可用性及资源开销等方面展现出对MySQL MGR的多项优势,但MGR在MySQL生态体系内也占据重要地位,但需要考虑备库宕机抖动、跨机房容灾性能波动、稳定性等各种情况,因此如果想用好MGR,必须配备专业的技术和运维团队的支持。 在面对大规模、高并发、高可用性需求时,PolarDB-X存储引擎以其独特的技术优势和优异的性能表现,相比于MGR在开箱即用的场景下,PolarDB-X基于DN的集中式(标准版)在功能和性能都做到了很好的平衡,成为了极具竞争力的数据库解决方案。
云数据库实战:基于阿里云RDS的Python应用开发与优化
在互联网时代,数据驱动的应用已成为企业竞争力的核心。阿里云RDS为开发者提供稳定高效的数据库托管服务,支持多种数据库引擎,具备自动化管理、高可用性和弹性扩展等优势。本文通过Python应用案例,从零开始搭建基于阿里云RDS的数据库应用,详细演示连接、CRUD操作及性能优化与安全管理实践,帮助读者快速上手并提升应用性能。
瑶池数据库微课堂|PolarDB/RDS+ADB Zero-ETL:一种免费、易用、高效的数据同步方式
瑶池数据库微课堂介绍阿里云PolarDB/RDS与ADB的Zero-ETL功能,实现免费、易用、高效的数据同步。内容涵盖OLTP与OLAP的区别、传统ETL存在的问题及Zero-ETL的优势(零成本、高效同步),并演示了从RDS MySQL到AnalyticDB MySQL的具体操作步骤。未来将优化和迭代此功能,提供更好的用户体验。

相关产品

  • 云数据库 RDS MySQL 版
  • 云数据库 RDS