我们有一些包含超过300,000条记录的表格,将记录从一个表格传输/复制到另一个表格需要几个小时。在处理大量数据时,是否有比使用游标更有效的方法并将每个记录从一个表逐个复制到另一个表?
代码:
open SOMETBL
fetch SOMETBL into @key1,@key2,@key3,@key4
while(@@fetch_status = 0)
begin
SELECT @key1InMapping = count(*) FROM SOMEOTHERDB.dbo.tblSOMETBLping WHERE fldEServicesKey = @key1
SELECT @eServiceTypeKey = fldAServiceTypeKey FROM SOMEOTHERDB.dbo.tblAServiceType WHERE fldAServiceTypeNumber = @key4
if (@eServiceTypeKey=null or @eServiceTypeKey=0)
set @eServiceTypeKey = 50
if @key1InMapping>0
begin
update SOMEOTHERDB.dbo.tblSOMETBLping set fldAServiceTypeKey=@eServiceTypeKey where fldEServicesKey= @key1
-- print 'post='+convert(varchar,@key2) + ' :key1='+convert(varchar,@key1)+ ' :serviceTypeKey='+convert(varchar,@eServiceTypeKey)+' : serviceTypeNum='+convert(varchar,@key4)
end
fetch SOMETBL into @key1,@key2,@key3,@key4
end
close SOMETBL
答案 0 :(得分:4)
300,000条记录是数据库术语中的少量数据。但它太大了,不能使用真正不应该用于超过几百个记录的游标,坦率地说,一旦你学会编写基于集合的代码,它通常更短,并且花费的时间比光标少。所以我永远不会将光标作为首选,这是一种不得已的技术。您不应该考虑在游标中一次插入/更新或删除一条记录。您使用基于集合的操作。现在有300,000条记录,您可能需要考虑基于集合和光标的组合,其中您一次处理一组记录(比如10,000)而不是光标一次。
了解如何将光标更改为基于集合的代码的详细信息。 http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them