DataView.Sort是一个性能瓶颈

时间:2009-11-02 23:35:33

标签: c# performance dataview

我在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's Poor Peformance with Large RecordSets

上找到了这个链接

3 个答案:

答案 0 :(得分:2)

由于您没有返回DataView而是DataTable,因此您应该能够通过使用{{来提升性能 - 不是数量级,而是25-30% - 1}}:

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数组,那么您可以获得相当大的改进。

答案 1 :(得分:1)

使用所有可用的索引和统计信息对数据库进行排序可能会更快,特别是如果在显示给用户之前对结果进行分页。

答案 2 :(得分:1)

我同意盛在这里,当你需要排序50到100k行时,是时候将一些逻辑移动到专门用于数据库的层。创建一个存储过程,它将rowlimit和current页面作为参数,或者jsut根据这些值构建你的select语句,.NET很快,但没有针对这些类型的操作进行优化,其中作为SQL服务器(或任何RDBMS) )。