【问题标题】:More Efficient Way to Copy Large Data from One Table to Another将大数据从一个表复制到另一个表的更有效方法
【发布时间】:2013-09-10 20:30:14
【问题描述】:

我们有几张表有超过 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 

【问题讨论】:

  • 游标使这需要几个小时。一个直接的 SQL 查询将需要几秒钟到几分钟才能复制 300,000 行。
  • 是在单个数据库中进行数据传输,还是在数据库之间移动数据?
  • @Declan_K 这发生在单个数据库中。
  • 通常,将数据从一个表移动到另一个表的最佳方法是根本不这样做。只需使用第一个表中的数据。

标签: sql sql-server large-data-volumes


【解决方案1】:

300,000 条记录是数据库术语中的少量数据。但是使用游标太大了,实际上不应该用于超过几百条记录,坦率地说,一旦你学会编写基于集合的代码,它通常比游标更短并且编写时间更短。所以我永远不会使用游标作为首选,这是最后的手段。您不应该考虑在游标中一次插入/更新或删除一条记录。您使用基于集合的操作。现在有 300,000 条记录,您可能需要考虑将基于集合和游标的组合,在其中一次处理一组记录(例如 10,000 条),而不是一次处理一个游标。

查看以下内容以了解有关如何将光标更改为基于集合的代码的详细信息。 http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

【讨论】:

  • 感谢您的回复。我将查看您共享的链接。在遇到我们的问题后,我确实有一种感觉,不应该首先使用游标,但我不够了解可以使用哪些其他解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-24
  • 2011-05-16
  • 2023-03-16
  • 1970-01-01
  • 2011-05-10
相关资源
最近更新 更多