上次ORACLE里面有个2-3亿行记录的删除情况。写个作业吧。 比如把时间作为变量。先取出来最小时间。 给你个例子 declare @mydate date,@int int select @mydate=min(orderdate) from tablename --tmp_table 是自己建立的控制表。只有一行一列,初始是1。 select @int =int from tmp_table while @mydate <'2010-01-01' and @int =1 begin delete tablename where orderdate=@mydate set @mydate=dateadd(day,1,@mydate) end 如果需要停止删除。就把临时表里面的值改成不是1就好了。
根据主键做循环删除----把需要删除的数据主键插入临时表 SELECT ID INTO ##DEL_TMP_tb FROM TB WHERE ...CREATE CLUSTERED INDEX IDX_ID ON ##DEL_TMP_tb(ID) CREATE TABLE #TMP_BATCH(ID BIGINT)WHILE EXISTS (SELECT TOP 1 1 FROM ##DEL_TMP_tb) BEGIN DELETE FROM #TMP_BATCH --每个batch 1000条 INSERT INTO #TMP_BATCH SELECT TOP 1000 ID FROM ##DEL_TMP_tb --删除数据 DELETE FROM TB WHERE ID IN (SELECT ID FROM #TMP_BATCH) DELETE FROM ##DEL_TMP_tb WHERE ID IN (SELECT ID FROM #TMP_BATCH); --- waitfor delay '00:00.00.050' ENDDROP TABLE ##DEL_TMP_tb DROP TABLE #TMP_BATCH
循环批量删试试declare @count bigint,@sum_count bigint select @sum_count=count(1) from tb set @count=0 while @count<@sum_count begin delete top(@count) from tb where 限制条件 set @count=@count+10000 end
有资源竞争的话一次job的时间由几分钟拉长到几十分钟,
有没有什么更高效的方法?
比如把时间作为变量。先取出来最小时间。
给你个例子
declare @mydate date,@int int
select @mydate=min(orderdate) from tablename
--tmp_table 是自己建立的控制表。只有一行一列,初始是1。
select @int =int from tmp_table
while @mydate <'2010-01-01' and @int =1
begin
delete tablename where orderdate=@mydate
set @mydate=dateadd(day,1,@mydate)
end
如果需要停止删除。就把临时表里面的值改成不是1就好了。
SELECT ID INTO ##DEL_TMP_tb FROM TB
WHERE ...CREATE CLUSTERED INDEX IDX_ID ON ##DEL_TMP_tb(ID)
CREATE TABLE #TMP_BATCH(ID BIGINT)WHILE EXISTS (SELECT TOP 1 1 FROM ##DEL_TMP_tb)
BEGIN
DELETE FROM #TMP_BATCH
--每个batch 1000条
INSERT INTO #TMP_BATCH
SELECT TOP 1000 ID FROM ##DEL_TMP_tb
--删除数据
DELETE FROM TB WHERE ID IN (SELECT ID FROM #TMP_BATCH)
DELETE FROM ##DEL_TMP_tb WHERE ID IN (SELECT ID FROM #TMP_BATCH);
--- waitfor delay '00:00.00.050'
ENDDROP TABLE ##DEL_TMP_tb
DROP TABLE #TMP_BATCH
select @sum_count=count(1) from tb
set @count=0
while @count<@sum_count
begin
delete top(@count) from tb where 限制条件
set @count=@count+10000
end
关联不大
关联不大那你先用truncate的方法移除2014年之前的数据,以后每年delete的方式删除前一年的数据,量不会大
关联不大那你先用truncate的方法移除2014年之前的数据,以后每年delete的方式删除前一年的数据,量不会大
truncate不是对整个表操作的么?能只移除2014之前的数据?
而且即使强制终止循环任务,最多只回滚一批,前面的批次都已经成功删除了,不至于中断后又得从头做起。
其实 你要告诉领导的是 这个删除需要多久多久 ,然后发个通告到时候停机1个小时,做完就好了。