日期:2014-05-18  浏览次数:20724 次

关于数据库执行速度的问题
下面这段代码是把一个数据库(JJGovOA)的四张表的记录插入另一个数据库(JJGovOABackup)的相同的四张表中.这四张表中分别有一万条符合条件的记录(也就是说进行了一万次循环),当我一次循环只执行一次记录1时,只需要9秒钟时间.当我一次循环同时执行一次记录1和记录2时,却耗时36秒,如果一次循环四条同时执行一次,却耗掉了十几分种时间,这是为什么呢?按理说,当一次循环只执行一次记录1时,一万次循环就执行了一万次记录1,同时执行记录1和记录2时,一万次循环就相当于执行了二万次插入操作,那也应该只需要18秒呀.为什么就要36秒了? 
Declare @DocumentID varchar(30)  
declare cursor_user cursor for select DocumentID from JJGovOA.dbo.Office_Send where  
Datediff(day,WriteDate,Dateadd(month,-6,getdate())) >=1  
open cursor_user --打开游标 
fetch cursor_user into @DocumentID  
while @@Fetch_Status=0 --该循环进行了一万次. 
Begin  

  --记录1 
insert into JJGovOABackup.dbo.Office_Send select * from JJGovOA.dbo.Office_Send where  
DocumentID=@DocumentID  
  --记录2 
insert into JJGovOABackup.dbo.Office_SendExt select * from JJGovOA.dbo.Office_SendExt where  
 DocumentID=@DocumentID 
  --记录3 
insert into JJGovOABackup.dbo.Office_FlowStep select * from JJGovOA.dbo.Office_FlowStep where  
DocumentID=@DocumentID  
  --记录4 
insert into JJGovOABackup.dbo.Office_FlowHead select * from JJGovOA.dbo.Office_FlowHead where  
 DocumentID=@DocumentID  

fetch cursor_user into @DocumentID  
end  
close cursor_user  
deallocate cursor_user

------解决方案--------------------
大哥遊標不要用這個嚴重影響性能! 你要什麽需求??
------解决方案--------------------
这么多的数据,用游标很慢的
SQL code


--记录1  
select * into JJGovOABackup.dbo.Office_Send from JJGovOA.dbo.Office_Send 
where  DocumentID=@DocumentID   
--记录2  
select * into JJGovOABackup.dbo.Office_SendExt from JJGovOA.dbo.Office_SendExt 
where  DocumentID=@DocumentID 
--记录3  
select * into JJGovOABackup.dbo.Office_FlowStep from JJGovOA.dbo.Office_FlowStep 
where  DocumentID=@DocumentID  
--记录4  
select * into JJGovOABackup.dbo.Office_FlowHead from JJGovOA.dbo.Office_FlowHead 
where  DocumentID=@DocumentID