gpt4 book ai didi

C# 多线程与 SQL Server 数据库调用

转载 作者:搜寻专家 更新时间:2023-10-30 23:00:40 26 4
gpt4 key购买 nike

我有一个包含用户详细信息的大型数据表。我需要从数据库中的几个表中将用户的详细信息填写到该表中。我遍历表中的每一行并对数据库中的不同表进行多次调用,使用 ADO.NET 对象和方法,处理和重组结果并将它们放到主表中。它工作正常,但要慢...我的想法是将大表拆分为几个小表,并在几个线程中同时运行 CompleteAddressDetails 方法,最后将小表合并为一个结果表。我已经使用 TPL 的 Task 对象实现了这个想法。下面有一段代码。它工作正常,但执行时间没有任何改善。几个问题:1. 为什么执行时间没有任何改善?2. 为了改进它,我必须做什么?

感谢您的任何建议!

        resultTable1 = data.Clone();
resultTable2 = data.Clone();
resultTable3 = data.Clone();
resultTable4 = data.Clone();
resultTable5 = data.Clone();

DataTable[] tables = new DataTable[] { resultTable1, resultTable2, resultTable3, resultTable4, resultTable5 };

for (int i = 0; i < data.Rows.Count; i += 5)
{
for (int j = 0; j < 5; j++)
{
if (data.Rows.Count > i + j)
{
tables[j].Rows.Add(data.Rows[i + j].ItemArray);
}
}

}



Task[] taskArray = {Task.Factory.StartNew(() =>CompleteAddressDetails(resultTable1)),
Task.Factory.StartNew(() =>CompleteAddressDetails(resultTable2)),
Task.Factory.StartNew(() =>CompleteAddressDetails(resultTable3)),
Task.Factory.StartNew(() =>CompleteAddressDetails(resultTable4)),
Task.Factory.StartNew(() =>CompleteAddressDetails(resultTable5))};

Task.WaitAll(taskArray);

最佳答案

在没有任何性能优势的情况下使用多线程并行时,基本上有两种可能性:

  1. 代码不受 CPU 限制,因此在任务上投入更多 CPU 也无济于事
  2. 代码使用了过多的同步以实际允许实际的并行执行

在这种情况下,1 可能是原因。你的代码没有做足够的 CPU 工作来从多线程中获益。很可能,您只是在等待数据库完成工作。

如果不了解 CompleteAddressDetails 方法的作用,很难给出任何指示 - 我假设它会逐行检查所有行,并执行几个单独的查询来填充详细信息。即使每个单独的查询都足够快,无论您做什么,执行数千个单独的查询都会损害您的性能 - 特别是如果这些查询需要锁定数据库中的某些共享状态。

首先,想一个更好的方式来填写细节。也许您可以将其中一些查询连接在一起,或者您甚至可以一次加载所有行。其次,尝试分析服务器上发生的实际查询。看看您是否可以采取一些措施来提高它们的性能 - 例如,通过添加一些索引,或者更好地使用现有的索引。

关于C# 多线程与 SQL Server 数据库调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33412159/

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