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 для данной строки (что происходит при нажатии, так что абсолютно нормально в моем случае).
Итог: разделение данных также является ключевым моментом, хотя я разделил данные по столбцам, а не по строкам!!!!