Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SqlBulkCopy速度慢,不';不能充分利用网络速度_Sql Server_Database_Networking_Smo_Sqlbulkcopy - Fatal编程技术网

Sql server SqlBulkCopy速度慢,不';不能充分利用网络速度

Sql server SqlBulkCopy速度慢,不';不能充分利用网络速度,sql-server,database,networking,smo,sqlbulkcopy,Sql Server,Database,Networking,Smo,Sqlbulkcopy,在过去的几周里,我一直在创建能够复制数据库的通用脚本。目标是能够在某个服务器上指定任何数据库并将其复制到其他位置,并且它应该只复制指定的内容。要复制的确切内容在配置文件中指定。该脚本将在大约10个不同的数据库上使用,每周运行一次。最后,我们只复制了大约3%-20%的数据库,这些数据库的大小高达500GB。我一直在使用SMO组件来实现这一点。这是我第一次使用SMO,创建复制模式对象、文件组等的通用方法花了一段时间。(实际上帮助找到了一些坏的存储过程) 总的来说,我有一个工作脚本,这是缺乏性能(有时

在过去的几周里,我一直在创建能够复制数据库的通用脚本。目标是能够在某个服务器上指定任何数据库并将其复制到其他位置,并且它应该只复制指定的内容。要复制的确切内容在配置文件中指定。该脚本将在大约10个不同的数据库上使用,每周运行一次。最后,我们只复制了大约3%-20%的数据库,这些数据库的大小高达500GB。我一直在使用SMO组件来实现这一点。这是我第一次使用SMO,创建复制模式对象、文件组等的通用方法花了一段时间。(实际上帮助找到了一些坏的存储过程)

总的来说,我有一个工作脚本,这是缺乏性能(有时超时),并希望你们能够帮助。当执行WriteToServer命令复制大量数据(>6GB)时,它会达到我的超时时间1小时。下面是复制表数据的核心代码。该脚本是在PowerShell中编写的

$query = ("SELECT * FROM $selectedTable " + $global:selectiveTables.Get_Item($selectedTable)).Trim()
Write-LogOutput "Copying $selectedTable : '$query'"            
$cmd = New-Object Data.SqlClient.SqlCommand -argumentList $query, $source
$cmd.CommandTimeout = 120;
$bulkData = ([Data.SqlClient.SqlBulkCopy]$destination)
$bulkData.DestinationTableName = $selectedTable;
$bulkData.BulkCopyTimeout = $global:tableCopyDataTimeout # = 3600
$reader = $cmd.ExecuteReader();
$bulkData.WriteToServer($reader); # Takes forever here on large tables
源数据库和目标数据库位于不同的服务器上,因此我还跟踪了网络速度。网络利用率从未超过1%,这让我非常惊讶。但是,当我在服务器之间传输一些大文件时,网络利用率会飙升到10%。我曾尝试将$bulkData.BatchSize设置为5000,但没有任何改变。将BulkCopyTimeout增加到更大的值只能解决超时问题。我真的很想知道为什么网络没有被充分利用

还有其他人有这个问题吗?如对网络或批量复制有任何建议,将不胜感激。如果你需要更多信息,请告诉我

谢谢

更新

我调整了几个选项来提高SqlBulkCopy的性能,例如将事务日志设置为simple,并为SqlBulkCopy提供表锁,而不是默认的行锁。另外,一些表对于某些批量大小进行了更好的优化。总的来说,复制的持续时间减少了约15%。我们要做的是在不同的服务器上同时执行每个数据库的副本。但我在复制其中一个数据库时仍然存在超时问题

当复制一个较大的数据库时,有一个表我始终会得到以下异常:

System.Data.SqlClient.SqlException: Timeout expired.  The timeout period elapsed prior to completion of the operation or the server is not responding. 
它在开始复制表后大约16分钟抛出,该表不在我的BulkCopyTimeout附近。即使我得到一个例外,那就是表最终被完全复制了。此外,如果我截断该表并仅重新启动该表的进程,则复制这些表时不会出现任何问题。但是,复制整个数据库的过程对于该表总是失败的

在复制错误的表之前,我尝试执行整个过程并重置连接,但仍然出错。我的SqlBulkCopy和Reader在每个表之后关闭。关于每次脚本失败的原因还有哪些建议

CREATE TABLE [dbo].[badTable](
[someGUID] [uniqueidentifier] NOT NULL,
[xxx] [uniqueidentifier] NULL,
[xxx] [int] NULL,
[xxx] [tinyint] NOT NULL,
[xxx] [datetime] NOT NULL,
[xxx] [datetime] NOT NULL,
[xxx] [datetime] NOT NULL,
[xxx] [datetime] NULL,
[xxx] [uniqueidentifier] NOT NULL,
[xxx] [uniqueidentifier] NULL,
CONSTRAINT [PK_badTable] PRIMARY KEY NONCLUSTERED 
(
[someGUID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

目标数据库上不存在此表的索引。

我使用了一个数据集,不知道这是否会更快:

$ds=New-Object system.Data.DataSet
$da=New-Object system.Data.SqlClient.SqlDataAdapter($cmd)
[void]$da.fill($ds)
bulkData.WriteToServer($ds.Tables[0])

您是否考虑过删除索引、进行插入,然后重新编制索引

SqlBulk Copy是目前将数据复制到SQL表中最快的方法。
您的速度应该超过每秒10000行。
为了测试大容量复制功能,请尝试DBSourceTools。()
此实用工具用于将数据库脚本化到磁盘,然后在目标服务器上重新创建它们。
复制数据时,DBSourceTools将首先将所有数据导出到本地.xml文件,然后将数据批量复制到目标数据库。

这将有助于进一步确定瓶颈所在,方法是将流程分为两个过程:一个用于读取,一个用于写入。

5000批次大小似乎很低,但无限大。我建议尝试50000到100000批次大小。感谢您的输入。我将批量大小设置为50000,但仍然没有太大变化。网络利用率仍在1%左右徘徊。通过查看日志文件,在大型表上进行复制所需的时间仍然相似。对于其中一个行包含大量内容的表,实际上需要更长的时间。此外,我之前忘记提到这一点,但脚本本身是在创建新数据库的服务器上运行的。这几乎肯定是目标表上的键/索引设置的问题。因此,请发布您的表和索引定义。在复制数据之前,我已停止为表创建索引,现在数据复制过程要快得多。不幸的是,这一个表仍然会导致错误。再次感谢您的回复,总的来说,这种方法比较慢。它使用了更多的cpu,但网络利用率有时确实达到了2.5%。问题是它不是一个一致的2.5%,并且在很长一段时间内(在磁盘写入过程中?)也是0。我可能会再次尝试批量大小,但我想我会尝试bcp来传输数据。我听说它应该更快。虽然使用bcp一开始效果很好(充分利用网络速度),但bcp命令逐渐变慢,几乎停止。在复制大型表的最后一行时,此bcp命令的速度会大大降低,并在新表上重置为全速。我一定是忽略了sql数据库中的某些东西。我听说把表聚在一起可能会导致这样的问题。