原理:编写存储过程,使用循环,每次删除最多n条记录,然后清除log,直到所有记录都删除
要删除必然要根据某个字段作为条件去删除,Sybase针对不同数据类型的字段有不同的函数,这个需要大家自己去体会,当然不同类型去查询效率肯定不同。
一般公司业务都会根据具体字段用来做条件去删除数据,这里给出三种常用数据类型的处理方法,欢迎大家与我交流。
1 按时间戳类型删除
-- 创建存过,这里以数字型参数为例 create procedure sp_delete_records ( @inputYear numeric(10) ) as set rowcount 10000 select 1 while(@@rowcount>0) begin dump tran your_database with truncate_only delete from your_table_name where datepart(year, MY_DATE) = @inputYear end set rowcount 0 return -- 调用存过,并传入参数 exec sp_delete_records 2017 |
2按字符串型字段去删除(截取再转换为数字类型去判断) 根据YEAR字段去统计your_table 表 create procedure sp_delete_records ( @inputYear numeric(10) ) as set rowcount 3462 select 1 while(@@rowcount>0) begin dump tran your_database with truncate_only delete from your_table_name where convert(numeric (22),substring(convert(varchar(22),YEAR),1,4)) = @inputYear end set rowcount 0 return -- 调用存过,并传入参数 exec sp_delete_records 2018 |
3 按数字型字段去删除 create procedure sp_delete_records ( @inputYear numeric(10) ) as set rowcount 1000 select 1 while(@@rowcount>0) begin dump tran your_database with truncate_only delete from your_table_name where year = @inputYear end set rowcount 0 return -- exec sp_delete_records 2019 |
经过测试,sybase调用存储过程,每调用一次,会执行8次相关的DML语句操作
所以我们要根据要删除表数据的大小,合理分配循环的次数,这样以提高服务器的执行效率。
还参考了以下资料,原先一个不会写存储过程的小白也会了,在此对作者表示感谢:
参考:
https://blog.csdn.net/skyfred/article/details/51890210