DataView.Sort является узким местом производительности

2

У меня есть узкое место производительности в 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 с большими наборами записей

  • 0
    Сколько у вас рядов?
  • 0
    По-разному. От 50 до 100к возможно.
Теги:
performance
dataview

3 ответа

2
Лучший ответ

Поскольку вы не возвращаете 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, вы можете добиться значительного улучшения.

  • 0
    Нет причин создавать новую таблицу. Я был отключен Select, потому что это DataRow [] возвращается. Я подумал, что это вернуло меня в ту же лодку, что и DataView с необходимостью копировать строки в новый DataTable.
1

Я согласен с Шэном здесь, когда вам приходится сортировать строки размером 50 - 100 тыс. времени, чтобы переместить некоторую логику на уровень, который предназначен именно для этого, в базе данных. Создайте хранимую процедуру, которая отображает строку и текущую страницу в качестве параметров, или jsut создает ваш оператор выбора на основе этих значений .NET работает быстро, но не оптимизирован для таких операций, где в качестве SQL-сервера (или любой РСУБД, если на то пошло).

  • 0
    Хотя согласен с вами на 100%, это не вариант. Архитектура приложения и временная шкала не позволяют перемещать сортировку в базу данных.
  • 0
    Затем, возможно, переместите сортировку хранилища данных на более низкий уровень в виде некоторого универсального списка, содержащего ваши данные как строго типизирующие объекты вместо строк в datatable / view, затем выполните сортировку по этому (возможно, используя LINQ), а затем просто перепривязайте сетка (или как бы вы ни представляли данные).
1

Быстрее сортировать в базе данных все доступные индексы и статистику, особенно если вы разбиваете результат перед отображением пользователю.

  • 0
    Я согласен, но перенести его в базу данных на данный момент не вариант.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню