C#使用SQL Server数据库调用进行多线程处理

时间:2015-10-29 10:48:51

标签: c# database multithreading .net-4.5

我有一个包含用户详细信息的大型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);

2 个答案:

答案 0 :(得分:2)

当使用多线程并行性而没有任何性能优势时,基本上有两种可能性:

  1. 代码不受CPU限制,因此在任务上投入更多CPU无济于事
  2. 代码使用太多同步来实际允许实际并行执行
  3. 在这种情况下,1可能是原因。您的代码没有做足够的CPU工作以从多线程中受益。最有可能的是,您只是在等待数据库完成工作。

    如果没有看到CompleteAddressDetails方法的作用,很难给出任何指针 - 我假设它逐个遍历所有行,并执行几个单独的查询来填充细节。即使每个单独的查询足够快,但无论您做什么,执行数千个单独的查询都会损害您的性能 - 尤其是如果这些查询需要在数据库中锁定某些共享状态。

    首先,想一想填写细节的更好方法。也许您可以将其中的一些查询连接在一起,或者您甚至可以一次加载所有行。其次,尝试在服务器上发生实际查询。找出你是否可以采取一些措施来改善他们的表现 - 例如,通过添加一些指数,或者更好地利用现有指数。

答案 1 :(得分:0)

没有任何改进,因为您无法按照sql server数据库处理调用的方式编写代码。

我建议在SQL Server上使用用户定义的表类型,接受此表类型的存储过程,然后将您已经完成的DataTable发送到存储过程并在那里进行处理。然后,您可以从那里进行优化。