|
| 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 | + |
| 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 | + |
| 63 | + |
| 64 | + |
| 65 | + |
| 66 | +Bloom这个类型几乎使用的太频繁了,PipelineDB内置这个数据类型,我们在CV中可以很好是用bloom来存储数据 |
| 67 | + |
| 68 | +例子: |
| 69 | + |
| 70 | +在创建CV的时候,字段直接能用内置的UDF来生成bloom的类型 |
| 71 | + |
| 72 | + |
| 73 | + |
| 74 | +插入测试数据: |
| 75 | + |
| 76 | + |
| 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 | + |
| 97 | + |
| 98 | +创建的v_hll,对应的字段count(distinct)物理存储格式就是HLL.而在查询过程中,parse会把这个字段解析成一个函数: |
| 99 | + |
| 100 | + hll_count_distinct_final |
| 101 | + |
| 102 | +我们看看执行计划 |
| 103 | + |
| 104 | + |
| 105 | + |
| 106 | +例子: |
| 107 | + |
| 108 | + |
| 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 | + |
| 137 | + |
| 138 | +插入测试数据: |
| 139 | + |
| 140 | + |
| 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 | + |
| 169 | + |
| 170 | +插入测试数据: |
| 171 | + |
| 172 | + |
| 173 | + |
| 174 | +插入6条数据 |
| 175 | + |
| 176 | + |
| 177 | + |
| 178 | +查询v_fss |
| 179 | + |
| 180 | + |
| 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 | + |
| 197 | + |
| 198 | +5是2条数据。 |
| 199 | + |
| 200 | + |
| 201 | + |
| 202 | +插入6 |
| 203 | + |
| 204 | + |
| 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 | + |
| 233 | + |
| 234 | + |
| 235 | + |
| 236 | +插入数据: |
| 237 | + |
| 238 | + |
| 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 |
0 commit comments