gpt4 book ai didi

C#:将 DataTable 传递给 SQL Server 非常慢

转载 作者:行者123 更新时间:2023-11-30 12:41:47 25 4
gpt4 key购买 nike

我的 C# 代码采用从数据库 A 上的 SELECT 返回的数据表,并将其作为表值参数通过 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 将相同数量的数据传递到另一台服务器没有问题。

最佳答案

我们也遇到了这个问题。 Kevin Cline 的最新发现帮助我们弄清楚了为什么它在一台服务器上运行速度很快,而在另一台服务器上运行速度极慢:

The performance is reasonable if the table-valued parameter is passed as IEnumerable instead of DataTable. It takes 7 seconds to pass 50,000 records to using SqlDataRecord, but 400 seconds using DataTable. The problem is server-dependent. The same volume of data is passed to another server using DataTable with no problem.

我们发现让 SQL Server 设置 ForceEncryption 是快速执行服务器和慢速执行服务器之间的区别。如果 ForceEncryption 设置为 Yes 那么它的性能会很差;如果它被设置为 No 那么它表现良好。此设置位于 SQL Server 配置管理器 -> SQL Server 网络配置 -> 右键单击​​协议(protocol) -> 选择属性 -> 证书选项卡 -> 选择您的证书 -> 标志选项卡。

因此,要解决此问题,您有两种选择。要么关闭数据库上的 ForceEncryption 设置(可能不可取),要么避免使用 DataTables 并按照 Kevin Cline 的建议改用 SqlDataRecords。

关于C#:将 DataTable 传递给 SQL Server 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36463955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com