hi,@zdai96
针对问题单:https://gitee.com/opengauss/openGauss-server/issues/I5XOTQ?from=project-issu...
我认为这是非问题,理由如下
操作的SQL非批量插入,而是点插。列存表存储结构决定了不适合使用点插,每次insert会使用一个新的CU,因此对存储空间占用巨大。列存表适用场景见https://opengauss.org/zh/docs/3.0.0/docs/BriefTutorial/%E5%88%97%E5%AD%98%E5... 正确的insert语句为 insert into t1 select generate_series(1,10000000);
这里再解释一下为什么点插语句int和float类型存储空间占用区别巨大。 列存表分为CU和CUDESC,前者是最小的列存单元,存储列存的数据;后者存储CU对应的一些信息,是行存表。每一个CU都对应CUDESC中的一行记录,这一行数据中除了CU的基本信息,还有min/max的字段,用于加速查询。 点插情况下int是一种特殊的类型,其max/min值与数据值相同,在本例中可以直接插入CUDESC内,通过min/max就可以把值取出来了,因此不会生成CU。而代码中限制了float没有min、max值,即使点插情况下也会生成CU(这里又有delta表概念,本例中未开启,因此不考虑),所以存储空间占用较大。 借用@pengjiong的例子,其中插入了100w条数据,float和int相比占用的CUDESC相同,但是float比int多生成了100w个CU,每个CU大小为8K,因此存储空间多了7813MB。
如果对回复本身没有异议的话,该issue将于下周四关闭。