流数据库 概率计算概念 - PipelineDB-Probabilistic Data Structures & Algorithms

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

标签

PostgreSQL , PPAS , enterprisedb , spin , 锁等待优化


背景

原文:

https://mp.weixin.qq.com/s/yDSnk4BzKKu1IuhMRgL7_w

作者: 桑栎

PipelineDB在物理存储的时候,使用了大量的聚合数据类型,在处理持续数据的时候,这些类型起到很重要的左右,我们来了解一下PipelineDB是如何使用这些数据类型的。

官方地址:http://docs.pipelinedb.com/probabilistic.html

PipelineDB目前提供的数据类型为:

  • Bloom Filter

  • Count-Min Sketch

  • Filtered-Space Saving Top-K

  • HyperLogLog

  • T-Digest

官方地址:

http://docs.pipelinedb.com/builtin.html#pipelinedb-specific-types

http://docs.pipelinedb.com/builtin.html#pipelinedb-specific-functions

对应的数据类型和function。这些数据类型,如果你不想在CV中使用,其实也可以在普通表内使用。

pic

具体的代码实现在:src/backend/utils/adt/

Bloom Filter

在PipelineDB中,Bloom的实现:src/backend/pipeline/bloom.c

pic

Bloom这个类型几乎使用的太频繁了,PipelineDB内置这个数据类型,我们在CV中可以很好是用bloom来存储数据

例子:

在创建CV的时候,字段直接能用内置的UDF来生成bloom的类型

pic

插入测试数据:

pic

还有很多udf在http://docs.pipelinedb.com/aggregates.html#bloom-filter-aggregates

HyperLogLog

在PipelineDB中,HLL的实现:src/backend/pipeline/hll.c

在大部分的实际运用中,HLL是用来解决count(distinct)问题的。在pp中,也是用来存储这种数据的。

例子:

pic

创建的v_hll,对应的字段count(distinct)物理存储格式就是HLL.而在查询过程中,parse会把这个字段解析成一个函数:

        hll_count_distinct_final   

我们看看执行计划

pic

例子:

pic

我不管插入几次,结果就是count(distinct)

在0.9.7之前,这个效率其实很一般,scan会特别消耗性能,在0.9.7对该功能进行了提升

https://www.pipelinedb.com/blog/pipelinedb-0-9-7-delta-streams-and-towards-a-postgresql-extension

Count-Min Sketch

在PipelineDB中,cmsketch的实现:

src/backend/pipeline/cmsketch.c

cmsketch主要是解决大流量中元素出现的频率,跟bloom filter其实还蛮类似,不过bloom是记录存在与否。使用cmsketch是有误差的。

例子:

pic

插入测试数据:

pic

官方说明:http://docs.pipelinedb.com/aggregates.html#count-min-sketch-aggregates

Filtered-Space Saving Top-K (FSS)

PipelineDB中FSS的具体实现:src/backend/pipeline/fss.c

FSS在具体的使用是计算Top-K,官方的具体实现是根据论文:

http://www.l2f.inesc-id.pt/~fmmb/wiki/uploads/Work/dict.refd.pdf

有兴趣的同学可以看看。

在实际环境中,例如计算最近5分钟的top-10,并且非常的节省空间和内存,我们来看看pp是如何使用的。

例子:

pic

插入测试数据:

pic

插入6条数据

查询v_fss

pic

通过fss_topk只查询出5条,每个都显示value为1

插入的6不见了

fss_topk_values输出每个value

fss_topk_freqs是每个element的个数

再插入一条:

pic

5是2条数据。

插入6

pic

6出现了,并且替换掉了4.

官方说明:http://docs.pipelinedb.com/builtin.html#filtered-space-saving-functions

T-Digest

PipelineDB中tdigest的实现:src/backend/pipeline/tdigest.c

tdigest主要是根据百分位数和中位数来进行估计计算。感觉跟数据库中内置函数percentile_cont有点像。这个功能没怎么用过

具体可以看看https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf

我简单的介绍一下如何在PipelineDB中的使用吧。

例子:

pic

插入数据:

pic

0.5取的中位数2

0.6是2.3

大概就是这样的情况,官方说明:

http://docs.pipelinedb.com/builtin.html#t-digest-functions

over,差不多介绍了个简单的使用吧,里面的SQL如果想实验可以来github拿一下

https://github.com/sangli00/WeCharOfficialAccounts/blob/master/PipelineDB内置函数介绍.sql

相关文章
|
2月前
|
监控 Oracle 关系型数据库
Flink CDC(Change Data Capture)是一种用于捕获数据库变更的技术
Flink CDC(Change Data Capture)是一种用于捕获数据库变更的技术
36 8
|
26天前
|
SQL 安全 数据管理
在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
【2月更文挑战第33天】在阿里云数据管理DMS(Data Management Service)中,您可以按照以下步骤来创建和管理数据库
28 7
|
25天前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(3)
Oracle数据库基本概念理解(3)
18 2
|
2月前
|
SQL 存储 关系型数据库
sql数据库的相关概念与底层介绍
sql数据库的相关概念与底层介绍
43 0
|
25天前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(2)
Oracle数据库基本概念理解(2)
13 1
|
4天前
|
SQL 算法 数据库
数据库系统概念(第三周 第一二堂总结)
数据库系统概念(第三周 第一二堂总结)
|
存储 传感器 数据管理
【软件设计师备考 专题 】面向对象数据库和分布式对象:理解新的数据管理概念
【软件设计师备考 专题 】面向对象数据库和分布式对象:理解新的数据管理概念
50 0
|
25天前
|
存储 SQL 缓存
【软件设计师备考 专题 】数据库模型(概念模式、外模式、内模式)
【软件设计师备考 专题 】数据库模型(概念模式、外模式、内模式)
65 0
|
25天前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(1)
Oracle数据库基本概念理解(1)
12 1
|
1月前
|
SQL 存储 关系型数据库
C# .NET面试系列十:数据库概念知识
#### 1. 为什么要一定要设置主键? 设置主键是数据库设计中的一个重要概念,有几个主要原因: 1、唯一性 ```c# 主键必须保证表中的每一行都有唯一的标识。这样可以避免数据冗余和不一致性。如果没有主键或者主键不唯一,就可能出现数据混乱或错误。 ``` 2、查询性能 ```c# 数据库系统通常会使用主键来加速数据检索。主键通常会被索引,这样可以更快速地找到特定行的数据,提高查询效率。 ``` 3、关联性 ```c# 主键常常用于建立表与表之间的关系。在关系数据库中,一个表的主键通常与其他表中的外键建立关联,这种关系对于数据的一致性和完整性非常重要。 ``` 4、数据完
131 1
C# .NET面试系列十:数据库概念知识