流資料庫概率計算概念-PipelineDB-ProbabilisticDataStructures&Algorithms

德哥發表於2018-01-27

標籤

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


相關文章