gp和pg的roaringbitmap和daterange提速

库存拉链表进行了时间折叠,极大降低了表的记录数,也节省了存储空间,但在进行时间展开时会很慢。(所有数据库对不等值关联都慢)
因此,摒弃不等值join才能提速。

-- 创建bitmap表
CREATE TABLE tenant_1800000143_rst.bi_fct_stock_zipper_bitmap (
    stock_date roaringbitmap NULL,
    stockorg_sk varchar NULL,
    stockorg_type varchar NULL,
    sku_sk varchar NULL,
    stock_qty int4 NULL,
    etl_time timestamp NULL
)
-- bitmap查询
select *,rb_and(stock_date,f_daterange('2020-10-01'::date,'2020-10-31'::date))
,rb_to_array(rb_and(stock_date,f_daterange('2020-10-01'::date,'2020-10-31'::date))) 
,rb_to_array(stock_date) --2个toarray方便肉眼查看结果,实际不需要
from tenant_1800000143_rst.bi_fct_stock_zipper_bitmap
where stock_date && f_daterange('2020-10-01'::date,'2020-10-31'::date)

其中自定义函数f_daterange是方便求日期序列

create or replace function f_daterange(dt1 date,dt2 date) returns roaringbitmap as $$
declare
    rb roaringbitmap;
--        myID integer;
begin
    select rb_build_agg(e) into rb from --select
(select to_char(GENERATE_SERIES('2020-10-01'::date,'2020-10-31'::date,'1 day'::interval),'yyyymmdd')::int e) t
;
return rb;
end;
$$ language plpgsql;

将库存拉链表转成了bitmap,其实就是将起止日期2个字段转成起止全部日期的数组,转成int存到roaringbitmap字段,然后通过bit的与、或等操作快速查询。
说明:

  1. rb_and是求交集
  2. &&是判断交集

其实pg/gp有更好的方式,daterange:

select stock_date * daterange('2020-10-01', '2020-10-31'),*
from tenant_1800000143_rst.bi_fct_stock_zipper_daterange
where stock_date && daterange('2020-10-01', '2020-10-31')

说明:

  1. *是求交集
  2. &&是判断交集
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容