2017-05-09 59 views
0

我有一个Firebird数据库,包含一个联系人列表,并且对于每个联系人,作为服务和发票列表。c#DataAdapter.Fill性能改进

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

现在,我有时间的显著部分(事实上,有近40%-50%),使用以下代码花费在数据的纯取:

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

我相当的事实,失望获取30k行需要大约20秒的时间才能拨打唯一的Fill电话。有没有希望改进这部分?任何替代(可能是商业)来改善这一点?

+1

你为什么要加载30,000行?你在做报告吗? –

+0

你绝对需要一次加载所有内容吗?如果不是,那么最简单的解决方案将是实现某种分页(阅读:一次加载一个较小的数字记录,然后移动到下一个位)。 – stybl

+0

- 是的。我使用缓冲方法,因为我需要对数据集进行灵活而沉重的搜索。基于内存的搜索是很多的,在这种情况下比服务器端快得多...... – neggenbe

回答

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!加载时间比FULL列表快6到20倍。当然,加载单个数据时我会有一个开销......好吧,在测试之后,我用一个“where”条件查询了一个外键。我运行的250个查询中的每一个平均返回4行,平均执行时间为42毫秒 - 时间用户不得不等待每一次访问给定行的细节(这是点击,这样在我的情况下绝对没问题)。底线:分割数据也是这里的关键,尽管我已经按列分割数据,而不是按行!

+0

这是一个非常整洁的方法!我没有考虑以这种方式按列分割,尽管在我们的系统中,我不确定我们能够满足所有列的需求。这绝对是需要记住的事情,而且相当令人担忧。我很想知道这个性能对MSSQL的影响是否相似。 – Alex