tidb contributor

近年来国产数据库进行的如火如荼,目前做的比较好的一个是PingCAP的TIDB,一个是阿里的OceanBase。

我对数据库的理解谈不上深刻,但是我认为,数据库一定要是个产品,有企业愿意用,这样才能实现他的价值和有动力迭代。不同的是,OB走的是闭源路线,在支撑内部电商业务的同时,商业化也做的不错。而TIDB走的是开源路线。

为什么开源,引用PingCAP的一句话:

对一个技术型公司来说,最宝贵的资产其实是人,对一个开源项目来说,最核心的资产是一个活跃的开源社区以及他人对这个项目的认可。

这正是开源的意义,我也做过一部分开源工作,而TIDB正是这一切的开始。

本科时代,由于项目的规模有限,基本没机会参与到协同开发这一步骤,每个人单打独斗,你写的是图书管理系统,我写的是教务管理系统,这种系统的代码量靠一个人是可以搞定的,所以对于划水选手而言,也就懒得去探索github,了解git。但是当面临团队开发的时候,git便是你逃避不了的话题。可以说,在社区做贡献的同时,也让我学习到这些知识,后来我发表了一篇小论文,就是基于github提供的用户历史数据做推荐,当然这个工作更偏向于数据分析的工作,但是也是tidb的那次经历给的启发。

接下来来谈谈这个contribute–表达式向量化

TIDB为了鼓励参与,在很简单的向量化这里留下了很多口子,对于小白来说非常友好。

如何访问和修改向量

在TIDB中有变长类型和定长类型,有如下读写方式:

  • 定长类型(int64为例)
    • ResizeInt64s(size, isNull):预分配 size 个元素的空间,并把所有位置的 null 标记都设置为 isNull
    • Int64s():返回一个 []int64 的 Slice,用于直接读写数据;
    • SetNull(rowID, isNull):标记第 rowID 行为 isNull
  • 变长类型(String为例)
    • ReserveString(size):预估 size 个元素的空间,并预先分配内存;
    • AppendNull():追加一个 null 到向量末尾;
    • GetString(rowID):读取下标为 rowID 的 string 数据。

向量表达式计算框架

向量化的计算接口

1
2
vectorized() bool
vecEvalXType(input *Chunk, result *Column) error
  • xType:类型
  • input:输入数据,类型为\*Chunk
  • result存放结果数据。

对于任意表达式,只有在其中所有的函数都支持向量化后,才认为表达式支持向量化。

为函数实现向量化接口

向量化需要实现vecEvalXType()vectorized接口

  • vectorized() 接口中返回 true ,表示该函数已经实现向量化计算;
  • vecEvalXType() 实现此函数的计算逻辑。

向量化的代码存放在_vec.go中,文件头加上licence说明。

以下是代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
func (b *builtinMicroSecondSig) vectorized() bool {
return false
return true
}

func (b *builtinMicroSecondSig) vecEvalInt(input *chunk.Chunk, result *chunk.Column) error {
return errors.Errorf("not implemented")
n := input.NumRows()
buf, err := b.bufAllocator.get(types.ETDuration, n)
if err != nil {
return err
}
defer b.bufAllocator.put(buf)
if err = b.args[0].VecEvalDuration(b.ctx, input, buf); err != nil {
return err
}

result.ResizeInt64(n, false)
result.MergeNulls(buf)
i64s := result.Int64s()
ds := buf.GoDurations()
for i := 0; i < n; i++ {
if result.IsNull(i) {
continue
}
i64s[i] = int64((ds[i] % time.Second) / time.Microsecond)
}
return nil
}

PR链接

就是这么简单,最后还送了一个马克杯,和一个勋章。

image-20210407171511208

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

请我喝杯咖啡吧~

支付宝
微信