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;