2009-11-02 2 views
2

J'ai un goulot d'étranglement au niveau des performances sur un DataView.Sort. Le code est ci-dessous.DataView.Sort est un goulot d'étranglement des performances

/// <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; 
    } 

Une idée est sur la façon d'améliorer cette méthode?

L'exécution prend environ 1 seconde.

EDIT

J'ai trouvé ce lien sur DataView's Poor Peformance with Large RecordSets

+0

Combien de lignes avez-vous? –

+0

Cela dépend. 50 à 100k est possible. –

Répondre

2

Puisque vous n'êtes pas un retour DataView mais DataTable, vous devriez être en mesure d'obtenir un gain de performances - en utilisant DataTable.Sort - pas d'ordre de grandeur, mais 25-30%:

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; 
} 

La plupart du temps, les données sont copiées dans la nouvelle table. Si vous pouvez éviter de créer une nouvelle table et travailler avec le tableau de DataRow que DataTable.Select renvoie, vous pouvez obtenir une amélioration considérable.

+0

Il n'y a aucune raison de créer une nouvelle table. J'ai été désactivé par le Select parce que c'est un DataRow [] qui est retourné. Je pensais que cela me remettait dans le même bateau que le DataView avec devoir copier des lignes dans un nouveau DataTable. –

1

Il peut être plus rapide pour trier dans la base de données avec tous les index et les statistiques disponibles, surtout si vous paginez le résultat avant d'afficher à l'utilisateur.

+0

Je suis d'accord, mais le déplacer vers la base de données n'est pas une option pour le moment. –

1

Je suis d'accord avec Sheng ici, quand vous devez trier 50 - 100k lignes, il est temps de déplacer de la logique à la couche qui est juste pour cela, la base de données. Créer une procédure stockée qui prend la ligne rowlimit et la page courante comme paramètres, ou jsut construire votre instruction select basée sur ces valeurs, .NET est rapide, mais pas optimisé pour ce genre d'opérations, où en tant que serveur SQL (ou tout RDBMS d'ailleurs).

+0

Bien que d'accord avec vous 100%, ce n'est pas une option. L'architecture et le scénario de l'application ne permettent pas de déplacer le tri vers la base de données. –

+0

Puis peut-être déplacer le tri de datastoreage à un niveau inférieur sous la forme d'une liste générique contenant vos données comme des objets fortement types au lieu de lignes dans une vue/datatable, puis faire un tri sur cela (en utilisant LINQ peut-être) la grille (ou vous représentez les données). – Colin

Questions connexes