2009-06-18 6 views
7

Les contraintes sur un DataTable (par exemple, PrimaryKey & UniqueContraint) make Selects sont-elles plus efficaces que dans SQL Server? Ou est leur seul but d'appliquer des règles sur les données?Comment les contraintes DataTable ADO.NET affectent-elles les performances?

myDT.Constraints.Add("PK", myDT.Columns["UniqueID"], true); //add a primary key 
myDT.Constrinats.Add(new UniqueConstraint(new DataColumn[] { //add a unique constraint for UserID 
    myDT.Columns["UserID"], myDT.Columns["UniqueID"] 
})); 

Est-ce que ces exemples ont potentiellement de meilleures performances lors de la recherche des données dans le DataTable par UniqueID ou UserID?

+0

Je pense que la révision # 2 est le bon titre, Terrapin. "Affecter" est un meilleur mot que "effet" dans ce cas. Je vois que vous avez fait un va-et-vient entre les deux, alors je vous laisse le soin de l'éditer si vous êtes d'accord. –

Répondre

0

En général, les contraintes ralentissent les choses. Mais pour les sélections, la contrainte unique peut accélérer les choses (mais je peux trouver une référence MS), elle peut aussi être limitée en fonction du select. La plupart des références que je trouve parlent des contraintes qui ralentissent les choses.

Donc, dans votre cas, cela pourrait améliorer les performances.

http://msdn.microsoft.com/en-us/library/49z48hxc.aspx

+0

J'ai trouvé ceci: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-03/msg00379.html – eschneider

4

Je pense que vous confondez l'utilisation des clés primaires et les contraintes (entreprise modèle de domaine) avec l'utilisation d'indices (la performance). Une clé étrangère peut influencer un optimiseur, et il est courant de créer un index sur les clés étrangères. Dans le monde SQL Server, une clé primaire est souvent confondue avec un index cluster, car plus souvent qu'une clé de substitution (par exemple, une colonne d'identité auto-incrémentée) est choisie comme clé primaire et index clusterisé.

Cet article peut être d'intérêt: DataSet and DataTable in ADO.NET 2.0.

En réponse à votre commentaire:

Utilisez un DataView pour Répétitif non primaire Recherches clés Si vous besoin de chercher répétitivement en utilisant données clés non primaires, créer un DataView qui a un ordre de tri. Ce crée un index qui peut être utilisé pour effectuer la recherche. C'est le meilleur adapté aux recherches répétitives car il ya un certain coût à créer l'index .

L'objet DataView expose la découverte et les méthodes FindRows afin que vous puissiez interroger les données dans le DataTable sous-jacent. Si vous exécutez uniquement une seule requête, le traitement requis pour créer l'index réduit les performances obtenues par en utilisant l'index.

Lorsque vous créez un objet DataView, utilisez le constructeur de DataView qui prend la Trier, RowFilter et valeurs RowStateFilter en tant que constructeur arguments avec le DataTable sous-jacent. L'utilisation du constructeur DataView garantit que l'index est construit une fois. Si vous créez un DataView vide et définissez les propriétés Sort, RowFilter, ou RowStateFilter par la suite, l'index est construit à au moins deux fois.

+1

Existe-t-il un moyen d'ajouter un index à un DataTable ADO.NET qui me donnerait une recherche efficace sur ces colonnes? Je n'en ai pas vu, d'où UniqueConstraint, qui dans SQL Server me donnerait un index implicite. Je ne sais pas si la même efficacité se traduit par .NET. – Seibar

+0

Vous devriez l'évaluer et voir par vous-même si cela améliore votre situation. Les résultats pourraient vous surprendre. –

+0

Le benchmarking est toujours une bonne idée. –

0

DataTable s sont mis en oeuvre en utilisant B-trees (ou une variante de celle-ci). Un coup d'œil rapide dans Reflector montre qu'il y a une classe Index plus la propriété LiveIndexes dans une classe , ce qui implique qu'il y a des index, mais je ne sais pas vraiment où ils sont. De mon expérience (vraiment limitée): les requêtes sur PK sont très rapides.

Questions connexes