

第二个要素,字段值平均宽度的算法:
avg(pg_column_size(column_name)
第三个要素,字段值之间线性相关性的计算方法:
同时需要计算 N*(N-1)/2 种相邻字段的相关性,相关性决定了压缩率的好坏,任意数据类型的相关性计算可以参考我前面写的文章:
https://yq.aliyun.com/articles/18038
最后是计算综合压缩率,需要计算每种组合的综合压缩率:
对于有N列的表来说,会产生N阶乘种排序组合,也就是需要计算 N! 组数据的相关性。
如何得到N种组合的顺序,可以参考我前面写的一篇文章:
https://yq.aliyun.com/articles/17228
代码如下:依赖函数,过滤重复字段,用于生成N阶排列组合:
CREATE or replace FUNCTION has_dupli_val(VARIADIC arr int[]) RETURNS boolean AS $$
select count(distinct val) <> count(*) dist_val from unnest($1) t(val) where val is not null;
$$ language sql strict;
计算每种排列组合的压缩率:
这里需要用到矩阵,窗口查询,相关性计算等统计学的知识。
用PostgreSQL可以把书本上的知识运用起来,还不错的,工业界和学术界的完美结合。
下面还是拿Greenplum来做一下验证,PostgreSQL的列存储可以外挂cstore, monetdb引擎。或者等阿里云AliCloudDB for PostgreSQL后期的版本开放这个功能。
create or replace function best_compress_cols(samp int8) returns void as $$
declare
cols text[] := array['c1', 'c2', 'c3', 'c4', 'c5']; -- 参与计算的字段(最多5列, 至少有一列的重复率>10%)
传真:0755 - 2799 6625
投诉:133-2299-1235
邮箱:sale@inmiga.com