Skip to content

Commit 84b316c

Browse files
committed
new doc
1 parent e9c0ce0 commit 84b316c

19 files changed

+258
-0
lines changed

201801/20180116_01.md

Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
## []流数据库 概率计算概念 - PipelineDB-Probabilistic Data Structures & Algorithms
2+
3+
### 作者
4+
digoal
5+
6+
### 日期
7+
2018-01-16
8+
9+
### 标签
10+
PostgreSQL , PPAS , enterprisedb , spin , 锁等待优化
11+
12+
----
13+
14+
## 背景
15+
原文:
16+
17+
https://mp.weixin.qq.com/s/yDSnk4BzKKu1IuhMRgL7_w
18+
19+
作者: 桑栎
20+
21+
PipelineDB在物理存储的时候,使用了大量的聚合数据类型,在处理持续数据的时候,这些类型起到很重要的左右,我们来了解一下PipelineDB是如何使用这些数据类型的。
22+
23+
官方地址:http://docs.pipelinedb.com/probabilistic.html
24+
25+
26+
PipelineDB目前提供的数据类型为:
27+
28+
- Bloom Filter
29+
30+
- Count-Min Sketch
31+
32+
- Filtered-Space Saving Top-K
33+
34+
- HyperLogLog
35+
36+
- T-Digest
37+
38+
39+
40+
官方地址:
41+
42+
http://docs.pipelinedb.com/builtin.html#pipelinedb-specific-types
43+
44+
http://docs.pipelinedb.com/builtin.html#pipelinedb-specific-functions
45+
46+
对应的数据类型和function。这些数据类型,如果你不想在CV中使用,其实也可以在普通表内使用。
47+
48+
![pic](20180116_01_pic_001.png)
49+
50+
具体的代码实现在:src/backend/utils/adt/
51+
52+
53+
54+
55+
56+
## Bloom Filter
57+
58+
59+
60+
在PipelineDB中,Bloom的实现:src/backend/pipeline/bloom.c
61+
62+
![pic](20180116_01_pic_002.png)
63+
64+
65+
66+
Bloom这个类型几乎使用的太频繁了,PipelineDB内置这个数据类型,我们在CV中可以很好是用bloom来存储数据
67+
68+
例子:
69+
70+
在创建CV的时候,字段直接能用内置的UDF来生成bloom的类型
71+
72+
![pic](20180116_01_pic_003.png)
73+
74+
插入测试数据:
75+
76+
![pic](20180116_01_pic_004.png)
77+
78+
还有很多udf在http://docs.pipelinedb.com/aggregates.html#bloom-filter-aggregates
79+
80+
81+
82+
83+
84+
85+
86+
## HyperLogLog
87+
88+
89+
90+
在PipelineDB中,HLL的实现:src/backend/pipeline/hll.c
91+
92+
在大部分的实际运用中,HLL是用来解决count(distinct)问题的。在pp中,也是用来存储这种数据的。
93+
94+
例子:
95+
96+
![pic](20180116_01_pic_005.png)
97+
98+
创建的v_hll,对应的字段count(distinct)物理存储格式就是HLL.而在查询过程中,parse会把这个字段解析成一个函数:
99+
100+
hll_count_distinct_final
101+
102+
我们看看执行计划
103+
104+
![pic](20180116_01_pic_006.png)
105+
106+
例子:
107+
108+
![pic](20180116_01_pic_007.png)
109+
110+
我不管插入几次,结果就是count(distinct)
111+
112+
113+
114+
在0.9.7之前,这个效率其实很一般,scan会特别消耗性能,在0.9.7对该功能进行了提升
115+
116+
https://www.pipelinedb.com/blog/pipelinedb-0-9-7-delta-streams-and-towards-a-postgresql-extension
117+
118+
119+
120+
121+
122+
## Count-Min Sketch
123+
124+
125+
126+
在PipelineDB中,cmsketch的实现:
127+
128+
src/backend/pipeline/cmsketch.c
129+
130+
131+
132+
cmsketch主要是解决大流量中元素出现的频率,跟bloom filter其实还蛮类似,不过bloom是记录存在与否。使用cmsketch是有误差的。
133+
134+
例子:
135+
136+
![pic](20180116_01_pic_008.png)
137+
138+
插入测试数据:
139+
140+
![pic](20180116_01_pic_009.png)
141+
142+
官方说明:http://docs.pipelinedb.com/aggregates.html#count-min-sketch-aggregates
143+
144+
145+
146+
147+
148+
149+
150+
## Filtered-Space Saving Top-K (FSS)
151+
152+
153+
154+
PipelineDB中FSS的具体实现:src/backend/pipeline/fss.c
155+
156+
FSS在具体的使用是计算Top-K,官方的具体实现是根据论文:
157+
158+
http://www.l2f.inesc-id.pt/~fmmb/wiki/uploads/Work/dict.refd.pdf
159+
160+
有兴趣的同学可以看看。
161+
162+
163+
164+
在实际环境中,例如计算最近5分钟的top-10,并且非常的节省空间和内存,我们来看看pp是如何使用的。
165+
166+
例子:
167+
168+
![pic](20180116_01_pic_010.png)
169+
170+
插入测试数据:
171+
172+
![pic](20180116_01_pic_011.png)
173+
174+
插入6条数据
175+
176+
177+
178+
查询v_fss
179+
180+
![pic](20180116_01_pic_012.png)
181+
182+
通过fss_topk只查询出5条,每个都显示value为1
183+
184+
插入的6不见了
185+
186+
187+
188+
fss_topk_values输出每个value
189+
190+
fss_topk_freqs是每个element的个数
191+
192+
193+
194+
再插入一条:
195+
196+
![pic](20180116_01_pic_013.png)
197+
198+
5是2条数据。
199+
200+
201+
202+
插入6
203+
204+
![pic](20180116_01_pic_014.png)
205+
206+
6出现了,并且替换掉了4.
207+
208+
209+
210+
官方说明:http://docs.pipelinedb.com/builtin.html#filtered-space-saving-functions
211+
212+
213+
214+
215+
216+
## T-Digest
217+
218+
219+
220+
PipelineDB中tdigest的实现:src/backend/pipeline/tdigest.c
221+
222+
223+
224+
tdigest主要是根据百分位数和中位数来进行估计计算。感觉跟数据库中内置函数percentile_cont有点像。这个功能没怎么用过
225+
226+
具体可以看看https://github.com/tdunning/t-digest/blob/master/docs/t-digest-paper/histo.pdf
227+
228+
我简单的介绍一下如何在PipelineDB中的使用吧。
229+
230+
例子:
231+
232+
![pic](20180116_01_pic_015.png)
233+
234+
235+
236+
插入数据:
237+
238+
![pic](20180116_01_pic_016.png)
239+
240+
0.5取的中位数2
241+
242+
0.6是2.3
243+
244+
大概就是这样的情况,官方说明:
245+
246+
http://docs.pipelinedb.com/builtin.html#t-digest-functions
247+
248+
249+
250+
over,差不多介绍了个简单的使用吧,里面的SQL如果想实验可以来github拿一下
251+
252+
https://github.com/sangli00/WeCharOfficialAccounts/blob/master/PipelineDB内置函数介绍.sql
253+
254+
255+
256+
洗洗睡了。。zzzz

201801/20180116_01_pic_001.png

16.1 KB
Loading

201801/20180116_01_pic_002.png

29.9 KB
Loading

201801/20180116_01_pic_003.png

19.2 KB
Loading

201801/20180116_01_pic_004.png

50.6 KB
Loading

201801/20180116_01_pic_005.png

26.6 KB
Loading

201801/20180116_01_pic_006.png

25.3 KB
Loading

201801/20180116_01_pic_007.png

30.1 KB
Loading

201801/20180116_01_pic_008.png

18.8 KB
Loading

201801/20180116_01_pic_009.png

16.5 KB
Loading

0 commit comments

Comments
 (0)