У меня есть узкое место производительности в DataView.Sort. Код ниже.
/// <summary>
/// Filters the data table and returns a new data table with only the filtered rows.
/// </summary>
/// <param name="dtInput">The dt input.</param>
/// <param name="filterExpression">The filter expression.</param>
/// <returns></returns>
protected virtual DataTable FilterDataTable(DataTable dtInput, string filterExpression)
{
DataTable result = dtInput;
if (!string.IsNullOrEmpty(filterExpression) && filterExpression.Trim().Length > 0)
{
DataView view = new DataView(dtInput);
view.RowFilter = filterExpression;
view.Sort = HierarchyFieldMap.DisplayedValue;
result = view.ToTable();
}
return result;
}
Любая идея о том, как улучшить этот метод?
Требуется ~ 1 секунда для выполнения.
ИЗМЕНИТЬ
Я нашел эту ссылку на DataView Poor Peformance с большими наборами записей
Поскольку вы не возвращаете DataView
, но DataTable
, вы можете получить повышение производительности - не порядка величины, а 25-30% - с помощью DataTable.Sort
:
private static DataTable SortDataTable(DataTable t,
string filterExpression,
string sortExpression)
{
DataTable t1 = t.Clone();
t1.BeginLoadData();
foreach (DataRow r in t.Select(filterExpression, sortExpression))
{
t1.Rows.Add(r.ItemArray);
}
t1.EndLoadData();
return t1;
}
В большинстве случаев, когда речь идет о копировании данных в новую таблицу. Если вы можете избежать создания новой таблицы и работать с массивом DataRow
, который возвращает DataTable.Select
, вы можете добиться значительного улучшения.
Я согласен с Шэном здесь, когда вам приходится сортировать строки размером 50 - 100 тыс. времени, чтобы переместить некоторую логику на уровень, который предназначен именно для этого, в базе данных. Создайте хранимую процедуру, которая отображает строку и текущую страницу в качестве параметров, или jsut создает ваш оператор выбора на основе этих значений .NET работает быстро, но не оптимизирован для таких операций, где в качестве SQL-сервера (или любой РСУБД, если на то пошло).
Быстрее сортировать в базе данных все доступные индексы и статистику, особенно если вы разбиваете результат перед отображением пользователю.