SQL拉链表的使用

一、什么是拉链表

拉链表:维护历史状态,以及最新状态数据的一种表,拉链表根据拉链粒度的不同,实际上相当于快照,只不过做了优化,去除了一部分不变的记录,通过拉链表可以很方便的还原出拉链时点的客户记录。(也可以叫---缓慢变化维)

总的来说就是:对历史记录不做物理删除,而是用一个标识(起止时间 或者 有效标识),这种删记录的方式称之为:软删除

二、拉链表的使用场景

1.有一些表的数据量很大,比如一张用户表,大约1亿条记录,50个字段,这种表
2.表中的部分字段会被update更新操作,如用户联系方式,产品的描述信息,订单的状态等等。
3.需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的状态。
4.表中的记录变化的比例和频率不是很大,比如,总共有1亿的用户,每天新增和发生变化的有200万左右,变化的比例占的很小。

三、拉链表的实现过程

实现的方式:https://blog.csdn.net/clktoy/article/details/120453260

create or replace procedure sp_tab_history 
as     
--先获取到源表的数据
cursor c_tab_init is
    select  t.empno,t.ename,t.job,t.udt
    from tab_init t;
  
  v_ct number;
  v_ct2 number;
begin
  for x in c_tab_init loop
      select count(*)
    into v_ct
    from tab_history t
    where t.empno = x.empno;    
    if v_ct != 0 then     
      --获取该数据在目标表(拉链表)中的有效的那一条信息是否跟源表中是一致的
      select count(*)
      into v_ct2
      from tab_history t1
      where t1.empno = x.empno 
      and t1.job = x.job and t1.ename = x.ename and t1.end_date = date'9999-12-31';     
      if v_ct2 = 0 then
         --先将目标表中该数据的原先的有效记录给失效掉
        update tab_history t
        set t.end_date = x.udt - 1
        where t.empno = x.empno 
        and t.end_date = date'9999-12-31';      
        --再将该数据插入到目标表
        insert into tab_history values(x.empno,x.ename,x.job,x.udt,date'9999-12-31');       
      else
        dbms_output.put_line('没有变动,无需');       
      end if ; 
    else --等同于 elsif v_ct = 0 then
      insert into tab_history
      values (x.empno,x.ename,x.job,x.udt,date'9999-12-31'); 
    end if;
  end loop;
  commit;
end;    

 

posted @ 2022-05-07 13:45  潜摩羯  阅读(937)  评论(0编辑  收藏  举报