天萃荷净
t-sql 更新大批量数据,有两张很大的表,写了一个存储过程处理(加工数据然后插入到一张新表中),因为一次性处理数据量很大,会导致tempdb等资源被耗尽,为了解决这个问题,每次输入两个参数,每次根据两个id的范围处理程序
1、建一张日志表
CREATE TABLE [dbo].[data_log](
[start_time] [datetime] NULL DEFAULT (getdate()),
[min_id] [int] NULL,
[max_id] [int] NULL,
[end_time] [datetime] NULL DEFAULT (getdate()
)
2、编写处理过程
CREATE PROCEDURE [dbo].[insert_more](@min_data int,@max_data int)
as
begin
--开始处理
insert into data_log values(getdate(),@min_data,@max_data,getdate())
--处理程序
INSERT INTO test_1
SELECT t1.name,
t2.name,
t1.id
FROM t_1 t1,
t_2 t2
WHERE t1.id = t2.id
AND t1.id<=@max_data
AND t1.id>@min_data
--结束处理
update data_log set end_time=getdate() where min_id=@min_data and max_id=@max_data
end
3、生成批量执行该存储过程语句
CREATE PROCEDURE [dbo].[get_list](@min_id int,@max_id int,@mode int)
AS
declare @i int
declare @max_m int
begin
set @i=0
while @i<=(@max_id-@min_id)/@mode
begin
set @max_m=@min_id+(@i+1)*@mode
if @max_m>@max_id
set@max_m=@max_id
print 'EXEC [dbo].[insert_more] @min_data = '+CAST(@min_id+@i*@mode as VARCHAR(50))+',@max_data = '+CAST(@max_m as VARCHAR(50))+';'
set @i=@i+1
END
end
利用3的过程,输入最小id,最大id,取值间隔,生成需要执行2过程的sql语句,执行这些语句完成操作,通过日志监控操作情况
--------------------------------------ORACLE-DBA----------------------------------------
最权威、专业的Oracle案例资源汇总之【案例】Oracle t-sql 更新大批量数据 更新两张大数据表案例