属性值为NULL问题

  • nebula 版本:2.0-rc1
    您好
    1.想问一下NULL在storaged是如何存储的,是否会占用较多空间?
    业务场景中,每个tag会有很多属性,但是vertex数据很多都是没有值的,也就会存在很多NULL,想知道大量的NULL对存储空间的影响。
    2.如果有一组节点vertex数据,原本的某个属性是有值的,通过upset将他的值改为了NULL,并执行了compact,其属性值所占的空间会释放掉吗?
    谢谢。

一个属性是否是null,
首先看schema里面该属性的nullable是否是true。
如果该属性允许为null,固定字段类型的值(int,bool,date,fixed_string等)是否是null对存储空间没有影响。
边长字段类型(string)的值是否是null对存储空间有影响。

没太明白哈,如果一个属性city允许为null,那么这个属性如果有值“北京”和没有值在存储层面占用的空间是不一样的吧?或者这么说,一个属性允许为null且没有设置值那么在rocksdb层面会占用存储空间吗?

大量的属性值是NULL,NULL的存储是否会占用过多存储空间?

如果是固定字段类型,比如(int,bool, fixed_string), 值是否为null,存储空间没有任何影响。
不过根据该schema中允许为null的字段的个数,会设置NULL flags,存在每条记录中的value头部。
不过这个长度跟值是否是null没有关系了,只会跟schema中nullable的个数有关。

如果对变长字段类型, 比如(string类型)值是否为null对 存储有影响。值为null的话,value部分的存储空间会小点。

您好,还是没有太理解,比如创建了如下person
create tag person( name fixed_string(20), age int) ;

1.插入如下一条数据
insert vertex person(name,age) values “1”:(“name1”,20)
name和age属性存储应该占用20+8字节

2.insert vertex person(name,age) values “2”:(null,null)
此条数据的属性存储会占用多少字节,还是会28字节吗?

3.UPSERT VERTEX “1” SET person.name = null;
将第一条name修改为null,name属性的存储空间是否还是占用20字节?

对,大体就是这个意思
因为这里是定长,如果字段类型是string的话,设置为null就省点空间

对于定长属性,如果是null在存储层面还是占用定长空间感觉有点浪费空间吧?这个后续会有优化吗?

这里我们用空间换取了时间,大大的提高了读取的性能,直接定位到offset。

2 个赞