最近需求涉及到一个保存实时数据的功能,使用Oracle数据库。
保存的数据量不大,但是覆盖会比较频繁。
造成了一个就几万数据的表,序列可能都达到千万了。
这个在Oracle环境下其实还好,但是需要兼容pgsql环境,使用了serial自增序列,最大21亿,因此了解了下关于重置序列的方式。
方案一:
先drop再create
优点:简单
缺点:在服务运行过程中执行存在风险
方案二:
利用负数步长将序列值减小,再恢复步长为1
此次使用方案二在程序中定期重置序列
存储过程样例如下:
create or replace procedure SEQ_RESET
as NUM number(10);
SQL varchar2(100);
begin
execute immediate 'select SEQ_TEST.nextval from dual' into NUM;
if NUM > 10000000
THEN
NUM:=-(NUM - 1);
SQL:='alter sequence SEQ_TEST increment by '|| NUM;
execute immediate SQL;
execute immediate 'select SEQ_TEST.nextval from dual';
execute immediate 'alter sequence SEQ_TEST increment by 1';
END IF ;
end SEQ_RESET;
/