DataView.RowFilter Vs DataTable.Select () vs DataTable.Rzędy.Znajdź()

Biorąc pod uwagę poniższy kod:

Dataview someView = new DataView(sometable)
someView.RowFilter = someFilter;

if(someView.count > 0) {  …. }

Całkiem sporo artykułów, które mówią, że Datatable.Select() jest lepsze niż używanie DataViews, ale są one wcześniejsze niż VS2008.

Rozwiązany: Tajemnica słabej wydajności DataView przy dużych zestawach rekordów
Array of DataRecord vs. DataView: a Dramatic Difference in Performance

Googlując na ten temat znalazłem kilka artykułów/tematów na forum, które wspominają o Datatable.Select () samo w sobie jest dość buggy (nie oczywiście na tym) i słabsze w różnych scenariuszach.

On this ( Best Practices ADO.NET) temat na msdn sugeruje się, że jeśli istnieje klucz podstawowy zdefiniowany w datatable, to metody findrows() lub find () powinny być użyte w Datatable.Select ().

Ten artykuł tutaj (. NET 1.1) porównuje wszystkie trzy podejścia plus kilka innych. Ale to jest dla wersji 1.1, więc nie wiem, czy są one ważne jeszcze teraz. / Align = "left" / Znajdź() przewyższa wszystkie podejścia i dane.Select() przewyższa DataView./ Align = "left" /

Więc jestem dość zdezorientowany co może być najlepszym podejściem do znajdowania wierszy w datatable. Czy nie ma jednego dobrego sposobu, aby to zrobić, istnieje wiele rozwiązań w zależności od scenariusza?

Author: Aseem Gautam, 2010-05-14

2 answers

Szukasz "najlepszego podejścia do znajdowania wierszy w datowalnym", więc najpierw muszę zapytać: "najlepszy" za co? Myślę, że każda technika ma scenariusze, w których może pasować lepiej niż inne.

Po pierwsze, spójrzmy na DataView.RowFilter: DataView ma pewne zalety w wiązaniu danych. Jest bardzo zorientowany na widok, więc ma potężne funkcje sortowania, filtrowania lub wyszukiwania, ale tworzy pewne koszty ogólne i nie jest zoptymalizowany pod kątem wydajności. Wybrałbym DataView.RowFilter dla mniejszych rekordów i / lub gdzie korzystasz z innych funkcji (takich jak bezpośrednie powiązanie danych z widokiem).

Większość faktów na temat DataView, które można przeczytać w starszych postach, nadal obowiązuje.

Po drugie, powinieneś wybrać DataTable.Rows.Find zamiast DataTable.Select, Jeśli chcesz tylko jednego trafienia. Dlaczego? DataTable.Rzędy.Find zwraca tylko jeden wiersz. Zasadniczo po określeniu klucza podstawowego tworzy się drzewo binarne. Wiąże się to z pewnymi kosztami, ale ogromnie przyspiesza pobieranie.

DataTable.Select jest wolniejszy, ale może się bardzo przydać, jeśli masz wiele kryteriów i nie dbasz o indeksowane lub nieindeksowane wiersze: może znaleźć w zasadzie wszystko, ale nie jest zoptymalizowany pod kątem wydajności. Zasadniczo, Datowalne.Select musi przejść przez całą tabelę i porównać każdy rekord z kryteriami, które podałeś.

Mam nadzieję, że ten mały przegląd okaże się pomocny.

Proponuję rzucić okiem na ten artykuł, było to dla mnie pomocne w pytaniach dotyczących wydajności. This post zawiera kilka cytatów z niego.

Mała aktualizacja: Nawiasem mówiąc, może to wydawać się trochę poza zakresem twojego pytania, ale prawie zawsze jest to najszybsze rozwiązanie do filtrowania i wyszukiwania w backendzie. Jeśli chcesz prostoty i masz SQL Server jako backend i. NET3 + na kliencie, przejdź do LINQ-to-SQL. Wyszukiwanie obiektów Linq jest bardzo wygodne i tworzy zapytania, które są wykonywane po stronie serwera. Podczas gdy LINQ-to-Objects jest również bardzo wygodnym, ale również wolniejsza technika. Gdybyś jeszcze nie wiedziała....

 54
Author: thmshd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-26 05:29:04

Post Thomashaid ładnie podsumowuje:

  • DataView.RowFilter jest do wiązania.
  • DataTable.Rows.Find służy do wyszukiwania za pomocą klucza głównego tylko.
  • {[3] } służy do wyszukiwania po wielu kolumnach, a także do określania kolejności.

Unikaj tworzenia wielu widoków danych w pętli i używania ich filtrów wierszy do wyszukiwania rekordów. To drastycznie zmniejszy wydajność.

Chciałem dodać, że DataTable.Select może korzystać z indeksów. Możesz utworzyć indeks na DataTable poprzez utworzenie DataView i określenie kolejności sortowania:

DataView dv = new DataView(dt);
dv.Sort = "Col1, Col2";

Następnie, gdy wywołujesz DataTable.Select(), może użyć tego indeksu podczas uruchamiania zapytania. Wykorzystaliśmy tę technikę, aby poważnie poprawić wydajność w miejscach, w których używamy tego samego zapytania wiele, wiele razy. (Zauważ, że było to zanim Linq istniał.)

Sztuką jest prawidłowe zdefiniowanie porządku sortowania dla Select. Więc jeśli Twoje zapytanie to "Col1 = 1 i Col2 = 4", to będziesz chciał "Col1, Col2" jak w przykładzie powyżej.

Zauważ, że tworzenie indeksu może zależeć od rzeczywistych wywołań tworzenia widoku danych. Musieliśmy użyć konstruktora new DataView(DataTable dt), a następnie określić właściwość Sort w osobnym kroku. Zachowanie może się nieznacznie zmienić w przypadku różnych wersji. NET.

 26
Author: Paul Williams,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-26 13:10:12