DataSet Relations или linq в поисках лучшей производительности? - PullRequest
1 голос
/ 21 ноября 2010

У нас есть две таблицы: Родитель ID: Integer // Первичный ключИмя: Строка

Ребенок FK: Integer // Ссылка на Parent.IDMoreInfo: Строка

У родителя 100 000 строк, у Дочернего 10000 строк (многие из родительских строк не используются в дочернем)

В настоящее время мы делаем:

MyDS.Relations.Add("PC", MyDS.Tables["Parent"].Columns["ID"],
                         MyDS.Tables["Child"].Columns["FK"]);
foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable())
  DataRow drParent = drChild.GetParentRows(MyDS.Relations["PC"]).FirstOrDefault();

Мы былиподумав о переходе на простой поиск вручную с помощью Linq:

foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable())
  DataRow drParent = MyDS.Tables["Parent"].AsEnumerable().FirstOrDefault(
                                   drParent => drParent["ID"] == drChild["FK"]);

Таблица Child перебирается только один раз, после чего набор данных удаляется.У кого-нибудь есть опыт использования одного метода или другого - создает ли связь в методе 1 пустую трату времени, если она используется только один раз?

1 Ответ

1 голос
/ 21 ноября 2010

Создание отношений, безусловно, не пустая трата времени.

Всякий раз, когда вы оцениваете два возможных решения проблемы, вы всегда должны сравнивать стоимость / время каждого варианта. Оттуда вы обычно можете позвонить, какой выбор лучше. Следует иметь в виду, что существует DataRelation для оптимизации этих типов поиска.

Если DataRelation добавляется в существующую таблицу, для добавления отношения требуется приблизительно 125 мс (создайте требуемый хэш для сопоставления родительских / дочерних строк с помощью Datakeys).

Для поиска КАЖДОЙ родительской строки для каждой из 10000 дочерних строк с использованием DataRelation требуется всего 70 мс, в то время как для использования только описанного выше подхода Linq требуется более 4 минут.

Когда вы думаете об этом, это имеет смысл, так как первый будет перебирать 10000 дочерних строк и использовать сопоставленные Datakeys DataRelation для поиска родительской строки (не нужно перебирать все 100000 родителей). Однако второе решение должно пройти через каждую дочернюю строку (10 000) и выполнить поиск по 100 000 родительских строк, чтобы найти подходящее соответствие (10 000 x 100 000 = 1 000 000 000).

...