繁体   English   中英

在SQL Server 2005中从小表批量复制到大表

[英]Bulk Copy from small table to larger one in SQL Server 2005

我是SQL Server的新手,遇到以下难题:

我有两个结构相同的表。 将其runningTblfinalTbl

runningTbl每15分钟包含大约60万至100万行。

runningTbl执行了一些数据清理之后,我想将所有记录移至finalTbl finalTbl当前大约有3800万行。

需要每15-20分钟重复一次上述过程。

问题在于,数据从runningTblfinalTbl的移动时间有时会超过20分钟。

最初,当表很小时,要花10秒钟到2分钟的时间进行复制。

现在只需要太长时间。

有谁可以协助您? 遵循的SQL查询

谢谢

为了获得最有效的复制数据方法,您需要做很多事情。 到目前为止,您走在正确的道路上,但是您还有很长的路要走。 我建议您先查看索引。 可能有一些优化可以提供帮助。 接下来,请确保该表上没有可能导致速度降低的触发器。 接下来,更改日志记录级别(如果可以更改)。

这里还有很多其他帮助(来自Microsoft):

http://msdn.microsoft.com/zh-CN/library/ms190421(v=SQL.90).aspx

基本上,您使用BCP的位置正确。 这实际上是微软的建议:

要将数据从一个SQL Server实例批量复制到另一个实例,请使用bcp将表数据导出到数据文件中。 然后,使用一种批量导入方法将数据从文件导入表中。 使用本机或Unicode本机格式执行批量导出和批量导入操作。

但是,在执行此操作时,还需要考虑如果引入的数据过多(基于使用的索引类型),则可能会删除索引。 如果您使用聚集索引,则在导入之前对数据进行排序也是一个好主意。 这是更多信息(包括以上引用的来源):

http://msdn.microsoft.com/zh-CN/library/ms177445(v=SQL.90).aspx

对于初学者:多年来我学到的一件事是,MSSQL在优化各种操作方面做得很出色,但是在很大程度上要依赖于所涉及的所有表的统计信息。 因此,我建议在运行实际插入之前先运行“ UPDATE STATISTICS已处理日志”和“ UPDATE STATISTICS未处理日志”。 即使在大桌子上,这些事情也不会花很长时间。 除此之外,基于上面的查询,很大程度上取决于目标表的索引。 我假设目标表(至少)在UnixTime上具有其聚集索引(或PRIMARY KEY),如果不这样,当在现有记录之间挤压越来越多的数据时,您将创建主要的数据碎片。 要解决此问题,您可以尝试偶尔对目标表进行碎片整理(可以在线完成,但是需要很长时间),但是要创建聚集索引(或PK),以便始终将数据附加到表末尾成为更好的方法; 好吧,至少在我看来。

我建议您应该有一个窗口服务,并使用计时器和一个布尔变量。 将您的请求发送到服务器后,将bool设置为高位,并且在该事件为低位之前,timer事件不应执行代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM