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?
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....
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.
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