2009-06-18 13 views
7

Czy ograniczenia na DataTable (np. PrimaryKey & UniqueContraint) powodują, że wybrania są bardziej wydajne w taki sam sposób, jak w SQL Server? Czy ich jedynym celem jest egzekwowanie zasad dotyczących danych?Jak ograniczenia ADO.NET DataTable wpływają na wydajność?

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

Czy te przykłady potencjalnie mieć lepszą wydajność podczas wyszukiwania danych w DataTable przez UniqueID lub UserID?

+0

Myślę, że poprawka nr 2 to poprawny tytuł, Terrapin. "Afekt" jest w tym przypadku lepszym słowem niż "efekt". Widzę, że przechodzisz z powrotem między tymi dwoma, więc zostawię to do edycji, jeśli się zgodzisz. –

Odpowiedz

0

Ograniczenia ogólne spowalniają działanie. Ale w przypadku wyborów unikalne ograniczenie może przyspieszyć działanie (ale mogę znaleźć odniesienie do MS), a także może być ograniczone w zależności od wyboru. Większość odnośników, o których mówię, mówi o ograniczeniach zwalniających.

W twoim przypadku może to poprawić wydajność.

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

+0

Znalazłem to: http://www.tech-archive.net/Archive/DotNet/microsoft.public.dotnet.framework.adonet/2006-03/msg00379.html – eschneider

4

myślę, że są mylące użycie kluczy głównych i ograniczeń (model domeny biznesu) z wykorzystaniem indeksów (skuteczność).

Zagraniczny klucz może mieć wpływ na optymalizator i powszechne jest tworzenie indeksu dla kluczy obcych.

W świecie programu SQL Server klucz podstawowy jest często mylony z indeksem klastrowym, ponieważ częściej niż klucz zastępczy (kolumna "Myśl o automatycznej inkrementacji") jest wybierany jako klucz główny i indeks klastrowany.

Ten artykuł może być interesujący: DataSet and DataTable in ADO.NET 2.0.

W odpowiedzi na Twój komentarz:

użyć DataView do powtarzalnego dla klucz podstawowy wyszukiwań Jeśli potrzeba powtarzalnie wyszukiwać za pomocą niż pierwotne kluczowe dane, tworzyć DataView, który ma kolejność sortowania. Ten numer tworzy indeks, który może być użyty do wykonania wyszukiwania w trybie . To jest najlepsze nadaje się do powtarzalnych wyszukiwań, ponieważ jest pewien koszt utworzenia indeksu .

Obiekt DataView udostępnia metody Find i FindRows, dzięki czemu można uzyskać zapytanie dotyczące danych w podstawowej tabeli danych . Jeśli wykonywana jest tylko jedna kwerenda, przetwarzanie, które jest wymagane do utworzenia indeksu, zmniejsza wydajność uzyskaną przez przy użyciu indeksu.

Po utworzeniu obiektu DataView, użyj konstruktora DataView że trwa Sortowanie, RowFilter i wartości RowStateFilter jako konstruktora argumenty wraz z leżącej DataTable. Korzystanie z konstruktora DataView zapewnia jednokrotne utworzenie indeksu . Jeśli utworzysz pusty DataView i później ustawisz właściwości Sort, RowFilter, lub RowStateFilter , indeks zostanie zbudowany co najmniej dwa razy pod numerem .

+1

Czy istnieje sposób na dodanie indeksu do tabelę danych ADO.NET, która dałaby mi sprawne wyszukiwanie w tych kolumnach? Nie widziałem jednego, stąd UniqueConstraint, który w SQL Server dałby mi niejawny indeks. Po prostu nie wiem, czy ta sama efektywność przekłada się na .NET. – Seibar

+0

Powinieneś sprawdzić jego wartość i przekonać się, czy to poprawi twoją sytuację. Rezultaty mogą Cię zaskoczyć. –

+0

Benchmarking to zawsze dobry pomysł. –

0

DataTable s są realizowane za pomocą B-trees (lub ich odmian). Szybki rzut oka na Reflectora pokazuje, że istnieje klasa Index plus LiveIndexes w klasie DataTable, co oznacza, że ​​istnieją pewne indeksy, ale tak naprawdę nie wiem, gdzie one są.

Z mojego (naprawdę ograniczonego) doświadczenia: zapytania na PK są naprawdę szybkie.

Powiązane problemy