我有一个包含用户详细信息的大型DataTable。我需要从DB中的几个表中将用户的详细信息填入此表中。我运行表中的每一行,并使用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);
答案 0 :(得分:2)
当使用多线程并行性而没有任何性能优势时,基本上有两种可能性:
在这种情况下,1可能是原因。您的代码没有做足够的CPU工作以从多线程中受益。最有可能的是,您只是在等待数据库完成工作。
如果没有看到CompleteAddressDetails
方法的作用,很难给出任何指针 - 我假设它逐个遍历所有行,并执行几个单独的查询来填充细节。即使每个单独的查询足够快,但无论您做什么,执行数千个单独的查询都会损害您的性能 - 尤其是如果这些查询需要在数据库中锁定某些共享状态。
首先,想一想填写细节的更好方法。也许您可以将其中的一些查询连接在一起,或者您甚至可以一次加载所有行。其次,尝试在服务器上发生实际查询。找出你是否可以采取一些措施来改善他们的表现 - 例如,通过添加一些指数,或者更好地利用现有指数。
答案 1 :(得分:0)
没有任何改进,因为您无法按照sql server数据库处理调用的方式编写代码。
我建议在SQL Server上使用用户定义的表类型,接受此表类型的存储过程,然后将您已经完成的DataTable发送到存储过程并在那里进行处理。然后,您可以从那里进行优化。