我有一个包含联系人列表的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秒。有没有希望改善这一部分?任何替代(可能是商业)来改善这个?
答案 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毫秒 - 每次用户必须等待访问给定行的详细信息(点击时,所以我的情况绝对可以。)
底线:拆分数据也是关键所在,虽然我按列拆分数据,而不是按行拆分!!!!