我有一段C#代码,它从数据库A返回一个DataTable,并通过Microsoft.Practices.EnterpriseLibrary.Data.Database.ExecuteDataSet方法将其作为表值参数传递给数据库B的存储过程。该表中约有200K行。在测试环境中,A和B在同一台服务器上,在执行存储过程时只需要几秒钟。但是在生产环境中,ExecuteDataSet调用几乎需要30分钟。检查数据库日志显示,几乎所有时间都花费在了ExecuteDataSet调用开始和存储过程开始之间。
在测试中,两个数据库都在同一台服务器上。在生产中,A和B位于不同的服务器上。
是什么导致了这种极端的延迟,有什么可以解决?这只发生在针对生产服务器运行时。在多个测试环境中运行时没有任何问题。
更新2016/04/08
如果将表值参数作为IEnumerable而不是DataTable传递,则性能是合理的。使用SqlDataRecord向50,000条记录传递需要7秒,而使用DataTable需要400秒。问题取决于服务器。向另一台服务器传递相同数量的数据使用DataTable没有问题。
在测试中,两个数据库都在同一台服务器上。在生产中,A和B位于不同的服务器上。
是什么导致了这种极端的延迟,有什么可以解决?这只发生在针对生产服务器运行时。在多个测试环境中运行时没有任何问题。
更新2016/04/08
如果将表值参数作为IEnumerable而不是DataTable传递,则性能是合理的。使用SqlDataRecord向50,000条记录传递需要7秒,而使用DataTable需要400秒。问题取决于服务器。向另一台服务器传递相同数量的数据使用DataTable没有问题。
OPENQUERY
或者使用.net
中的SqlBulkInsert
来完成此操作。我认为,表值参数方法不适用于这个大型数据集。 - Amit Sukralia