سؤال

لدي اختناق أداء على 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 مع مسجلات كبيرة

هل كانت مفيدة؟

المحلول

لأنك لا تعود 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 إرجاع يمكنك الحصول على تحسن كبير.

نصائح أخرى

قد يكون أسرع فرز في قاعدة البيانات مع جميع الفهارس والإحصائيات المتاحة، خاصة إذا قمت بتصنيف النتيجة قبل عرضها للمستخدم.

وأنا أتفق مع Sheng هنا، عندما تضطر إلى فرز الصفوف 50 - 100K حان الوقت لنقل بعض المنطق إلى الطبقة التي تعني ذلك فقط، قاعدة البيانات. قم بإنشاء إجراء مخزن يأخذ ROWLIMIT والصفحة الحالية كمعلمات، أو يقوم JSUT بإنشاء عبور SELECT الخاص بك بناء على هذه القيم، ولكنه غير محسن لهذه العمليات، حيث يكون كخادم SQL (أو أي RDBMS لهذه المسألة ).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top