2010-11-21 3 views
1

Nous avons deux tables:
Parent
ID: Entier // Clé primaire
Nom: String
DataSet Relations ou linq recherche de meilleures performances?

enfant
FK: Entier // Référence à Parent.ID
MoreInfo: Chaîne

Le parent a 100 000 lignes, l'enfant a 10 000 lignes (un grand nombre de lignes dans parent pas utilisé chez l'enfant)

Actuellement nous faisons:

MyDS.Relations.Add("PC", MyDS.Tables["Parent"].Columns["ID"], 
         MyDS.Tables["Child"].Columns["FK"]); 
foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable()) 
    DataRow drParent = drChild.GetParentRows(MyDS.Relations["PC"]).FirstOrDefault(); 

Nous avons pensé à changer juste la recherche manuelle avec Linq:

foreach (DataRow drChild in MyDS.Tables["Child"].AsEnumerable()) 
    DataRow drParent = MyDS.Tables["Parent"].AsEnumerable().FirstOrDefault(
            drParent => drParent["ID"] == drChild["FK"]); 

La table enfant est itérés une seule fois et la l'ensemble de données est éliminé. N'importe qui a des expériences en utilisant une méthode ou l'autre - est la création de la relation dans la méthode1 un gaspillage de temps si elle n'est utilisée qu'une seule fois?

Répondre

1

La création de la relation n'est certainement pas une perte de temps.

Chaque fois que vous évaluez deux solutions potentielles à un problème, vous devez toujours comparer le coût/temps de chaque option. De là, vous pouvez généralement faire un appel pour savoir quel choix est le meilleur. Une chose à garder à l'esprit est que DataRelation existe pour optimiser ces types de recherches.

Si le DataRelation est ajouté à une table existante, environ 125 ms sont nécessaires pour ajouter la relation (créez le hachage requis pour mapper les lignes parent/enfant via Datakeys).

Pour rechercher CHAQUE ligne parente pour chacune des 10 000 lignes enfant en utilisant le DataRelation requis seulement 70ms, où l'utilisation de la seule approche Linq documentée ci-dessus est requise pendant 4 minutes. Lorsque vous y réfléchissez, cela a du sens car le premier parcourra les 10 000 lignes enfants et utilisera les Datakeys mappés de DataRelation pour rechercher la ligne parente (il n'est pas nécessaire de parcourir 100 000 parents). Cependant, la deuxième solution doit traverser chaque ligne enfant (10 000) et rechercher 100 000 lignes parents pour trouver la correspondance appropriée (10 000 x 100 000 = 1 000 000 000).

Questions connexes