2009-06-18 7 views
7

I vincoli su un DataTable (ad esempio PrimaryKey & UniqueContraint) rendono i Selects più efficienti nello stesso modo in cui lo sarebbero in SQL Server? O è il loro unico scopo di far rispettare le regole sui dati?In che modo i vincoli DataTable di ADO.NET influiscono sulle prestazioni?

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"] 
})); 

Sarebbe questi esempi potenzialmente avere prestazioni migliori quando si cerca il backup dei dati nel DataTable da UniqueID o UserID?

+0

Penso che la revisione n. 2 sia il titolo corretto, Terrapin. "Affect" è una parola migliore di "effect" in questo caso. Vedo che stai andando avanti e indietro tra i due, quindi lascerò decidere a te di modificarlo se sei d'accordo. –

risposta

0

In generale, i limiti rallentano. Ma per selezionare il vincolo univoco può accelerare le cose (ma posso trovare un riferimento MS), inoltre può essere limitato in base alla selezione. La maggior parte dei riferimenti che ho trovato parlano dei vincoli che rallentano le cose.

Quindi nel tuo caso potrebbe migliorare le prestazioni.

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

+0

Ho trovato questo: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-03/msg00379.html – eschneider

4

Penso che si sta confondendo l'uso di chiavi primarie e vincoli (modello dominio aziendale), con l'utilizzo di indici (performance).

Una chiave esterna può influenzare un ottimizzatore ed è comune creare un indice su chiavi esterne.

Nel mondo SQL Server, una chiave primaria viene spesso confusa con un indice cluster, poiché più spesso di una chiave sostitutiva (si pensi alla colonna dell'identità di incremento automatico) viene scelta come chiave primaria e indice cluster.

Questo articolo può interessare: DataSet and DataTable in ADO.NET 2.0.

In risposta al tuo commento:

Utilizzare un DataView per Ricerche chiave ripetitivo non primari Se necessità di cercare ripetutamente utilizzando dati chiave non primarie, creare un DataView che ha un ordinamento Questo crea un indice che può essere utilizzato per eseguire la ricerca. Questo è il migliore adatto alle ricerche ripetitive perché ci sono alcuni costi per la creazione dell'indice .

L'oggetto DataView espone il Trova e FindRows metodi in modo da poter interrogazione i dati nella sottostante DataTable. Se si esegue solo una query, l'elaborazione che è necessaria per creare l'indice riduce le prestazioni ottenute da utilizzando l'indice.

Quando si crea un oggetto DataView, utilizzare il costruttore DataView che prende il Ordina, RowFilter, e valori RowStateFilter come costruttore argomenti insieme con il sottostante DataTable. L'utilizzo del costruttore DataView assicura che l'indice sia creato una volta. Se si crea un DataView vuoto e si impostano successivamente le proprietà Sort, RowFilter, o RowStateFilter , l'indice viene creato almeno a almeno due volte.

+1

C'è un modo per aggiungere un indice a un DataTable ADO.NET che mi fornisce una ricerca efficiente su quelle colonne? Non ne ho visto uno, da cui il UniqueConstraint, che in SQL Server mi avrebbe dato un indice implicito. Non so se la stessa efficienza si traduce in .NET. – Seibar

+0

Dovresti confrontarlo e vedere di persona se crea un miglioramento nella tua situazione. I risultati potrebbero sorprenderti. –

+0

Il benchmarking è sempre una buona idea. –

0

DataTable s sono implementati utilizzando B-trees (o alcune variazioni dello stesso). Un'occhiata veloce a Reflector mostra che c'è una classe Index più LiveIndexes in una classe DataTable, che implica che ci sono alcuni indici, ma non so davvero dove siano.

Dalla mia esperienza (davvero limitata): le query su PK sono molto veloci.

Problemi correlati