c#DataAdapter.Fill性能改进

时间:2017-05-09 16:40:32

标签: c# performance dataadapter

我有一个包含联系人列表的Firebird数据库,并且对于每个联系人,都有一个服务和发票列表。

客户表的数量级为10k,发票/服务的大小约为联系人大小的5倍。问题是表格包含许多列(最多150个)。我知道这不太理想,不幸的是,我不能重新设计数据库,因为它是按原样施加的。

现在,我有相当一部分时间(事实上,将近40-50%)用于使用以下代码纯粹获取数据:

DataTable dataTable = new DataTable();
dataTable.BeginLoadData();
FbDataAdapter fda = new FbDataAdapter(command);
fda.Fill(dataTable);
dataTable.EndLoadData();

我非常失望的是,获取30k行对于唯一的Fill调用大约需要20秒。有没有希望改善这一部分?任何替代(可能是商业)来改善这个?

1 个答案:

答案 0 :(得分:0)

嗯,正如评论所表明的那样,除了考虑这里的特殊情况外,没有太多可以做的事情。我所做的是将大量(而不是行)分成两类:预览列和完整(明细)数据列。我们的想法是一次加载所有预览数据,并仅在请求时加载详细信息,一次加载一列。

现在看看以下案例中的时间:

Overall: 5 runs, >16k rows, time includes all code in the question!

Case 1: 4 preview fields (3 int, 1 float), 135(+4 preview) fields for full list
Preview queries:         1063.3470 ms
   Full queries:        25712.2665 ms

Case 2: 12 preview fields (3 int, 9 float), 127(+12 preview) fields for full list
Preview queries:         1457.1946 ms
   Full queries:        25735.5247 ms

Case 3: 13 preview fields (3 int, 9 float, 1 blob subtype 1), 126(+13 preview) fields for full list
Preview queries:     4023.9923 ms
   Full queries:    26777.5369 ms


250 Queries with "WHERE" contstraint on a foreign key
Returning 1052 row in total
Total execution time 10348.0545 ms

WOW!加载时间比完整列表快6到20倍。当然,在加载单个数据时我会有一些开销......好吧,在测试之后,我用一个&#34来查询数据库;其中"调整外键。我运行的250个查询中的每一个平均返回4行,平均执行时间为42毫秒 - 每次用户必须等待访问给定行的详细信息(点击时,所以我的情况绝对可以。)

底线:拆分数据也是关键所在,虽然我按列拆分数据,而不是按行拆分!!!!