触发器优化
刚才您解答我一个问题,就是http://topic.csdn.net/u/20080518/11/6dd3ebf5-79dd-4208-a127-e6ad05ebcee3.html这里这个,我还有一个问题想问一下,看看有没有解决方法。
aaa(id ,other)
如果删除aaa表内的数据同时激活delete触发器,向ccc(bh,id,other)表内插入已删除的数据,
ccc表字段增加一个bh(编号)字段,bh不是自动增加
目前的逻辑是:我需要先取得ccc里面bh最大值 ,然后从aaa触发器deleted表内逐条取出,让bh+1 增加至ccc
加入16000条,要执行5分钟左右,有大量得io操作。)
触发器的大致代码如下
declare @maxcount int --保存ccc表内 bh 最大值declare @countnum int --保存需要插入的数据一共多少条decalre @current int --保存当前插入第几条set @current =1set @countnum=0set @maxcount=(select top 1 bh from ccc order by bh desc)--取得ccc内 bh 最大值--ccc表可能为空值所以要判断if @maxcount is nullset @maxcount=0select dataid=indentity(int,1,1),* into #tempccc from deleted --建立临时表,含有自动编号set @countnum=(select count(1) from #tempccc) --取得一共需要插入ccc内几条数据while @current <= @countnum --当前插入编号 小于最大编号beginset @maxcount=@maxcount+1 --ccc内 bh 最大值+1insert into ccc(bh,id,other) select @maxcount,id,other from #tempjsxxb where dateid=@current --把当前的一条数据插入ccc bh用cc内最大值+1 set @current=@current +1 --当前编号+1enddrop table #tempjsxxb
declare @maxcount int --保存ccc表内 bh 最大值set @maxcount=(select top 1 bh from ccc order by bh desc)--取得ccc内 bh 最大值select dataid=indentity(int,1,1),* into #tempccc from deleted --建立临时表,含有自动编号insert into ccc(bh,id,other) select isnull(@maxcount,0)+dataid,id,other from #tempjsxxb
[解决办法]
没必要循环插入,你将@maxcount当成dataid的一个偏移量就是,一次插入。
[解决办法]
ccc表字段增加一个bh(编号)字段,bh不是自动增加
---------------
你把这个字段设置成自动增加,那更简单,直接:
insert into ccc(id,other) select id,other from deleted
[解决办法]
create table #ccc (bh int)select top 3 dataid=identity(int,1,1) into #1 from syscolumnsselect top 4 dataid=identity(int,1,1) into #2 from syscolumnsdeclare @maxcount int --保存ccc表内 bh 最大值set @maxcount=(select top 1 bh from #ccc order by bh desc)--取得ccc内 bh 最大值insert #ccc select isnull(@maxcount,0)+dataid from #1select * from #ccc/*bh-----------123*/godeclare @maxcount int --保存ccc表内 bh 最大值set @maxcount=(select top 1 bh from #ccc order by bh desc)--取得ccc内 bh 最大值insert #ccc select isnull(@maxcount,0)+dataid from #2select * from #ccc/*bh-----------1234567*/godrop table #ccc,#1,#2
[解决办法]