C# DataAdapter.Fill улучшение производительности

У меня есть база данных Firebird, содержащая список контактов и, для каждого контакта, список услуг и счетов.

Порядок величины таблицы клиента составляет 10 КБ, а счета / услуги примерно в 5 раз превышают размер контактов. Дело в том, что в таблицах много столбцов (до 150). Я знаю, что это не идеально, к сожалению, я не могу перепроектировать базу данных, поскольку она навязана как есть.

Теперь у меня есть значительная часть времени (на самом деле, почти 40-50%), потраченного на чистую выборку данных с использованием следующего кода:

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

Я очень разочарован тем фактом, что получение 30 тыс. Строк занимает около 20 секунд для единственного Fill вызов. Есть ли надежда улучшить эту часть? Любая альтернатива (возможно, коммерческая), чтобы улучшить это?

1 ответ

Ну, как показывают комментарии, ничего особенного можно сделать, кроме как рассмотреть особый случай здесь. Я разбил большое количество столбцов (не строк) на две категории: столбцы предварительного просмотра и столбцы полных (подробных) данных. Идея состоит в том, чтобы загружать данные предварительного просмотра все сразу и детали только по запросу, по одному столбцу за раз.

Теперь просто посмотрите на времена в следующих случаях:

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

ВОТ ЭТО ДА! Время загрузки в 6-20 раз быстрее, чем для ПОЛНОГО списка. Конечно, у меня будут накладные расходы при загрузке отдельных данных... Что ж, после тестирования я запросил БД с условием "где" - внешний ключ. Каждый из 250 запросов, которые я выполнил, возвращает, в среднем, 4 строки для среднего времени выполнения 42 мс - пользователи должны ждать каждый раз, когда хотят получить доступ к DETAIL для данной строки (что происходит при нажатии, так что абсолютно нормально в моем случае).

Итог: разделение данных также является ключевым моментом, хотя я разделил данные по столбцам, а не по строкам!!!!

Другие вопросы по тегам