Filtrowanie danych w dgv

0

Witam.
Stworzone zostało tzw. archiwum. Można w nim wyszukać wszystkie dokument i zobaczyć ich status. Moje pytanie jest następujące. Aktualnie nie jest zrobione to poprawnie, gdyż jest zrobione coś w stylu filtrowania dynamicznego. W polu textbox ustawione jest zdarzenie textchanged. I za każdym razem gdy użytkownik wpisze jakąś cyfrę z numeru tego dokumentu(książki- indexy zapisane jako nvarchar(50), bo format ich jest akronim/Numer), wywołana zostaje procedura wyszukująca (Z like %). Nie chcę tego robić w ten sposób. Więc chciałbym zapytać o radę jak zrobić to w taki sposób aby dane były raz zaciągnięte do dataseta i z niego natępowało filtrowanie danych, a nie jak to ma miejsce do tej pory kilkukrotnie odpytywać bazę danych. Chodzi mi o jak najlepszą wydajność.
Z góry dzięki za pomoc

0

Że niby wczytanie całej bazy na raz jest wydajne?

0

Pobranie raz zawartości jednej tabeli. Archiwum obejmuję tylko jedną tabele. I jednym zapytaniem SQL pobrać zawartość tabeli. A później filtrować tylko te dane. A teraz odbywa się to w sposób:

  • Wpiszę cfre "2" - wyszukuje wszystkie co mają cyfre "2"
  • dopisuje "3" to kolejny raz pyta bazę danych o rekord z numerem "23"
  • dopisuje "5" to znowu pyta bazę ale o rekord "235"
0

A podpięcie cache drugiego poziomu nie rozwiązało by sprawy?

Wycofuje się z tego. Za szybko napisałem. Przecież te dane i tak trzeba porównać więc pewnie i tak baza zrobi to szybciej. Kwestia przesłania wyników, ale rozumiem że i tak jakiś limit zwracanych rekordów jest.

0

Obawiam się tylko w tym przypadku tego, że archiwum zacznie "zamulać". W tej chwili jest około 10 tys. rekordów i działa w płynnie. Rocznie wpada około 50 tys. i zastanawiam się kiedy to zacznie się sypać. Baza w mssql. Chyba, że da radę jakoś ograniczyć, hmm... żeby zapytanie zwracało mi tylko rekordy z ostatnich 6 miesięcy. Wystarczy przerobić procedurę? Czy dobrze myślę? Każdy rekord ma pole : numer, status, data dokumentu, data ostatniej modyfikacji. I zrobić where data dokumentu jest i tu mały problem. Bo jak zrobić, żeby brało z ostatnich 6 miesięcy, łatwo uzyskać dzisiejszą datę (poprzez sysdatetime) ale ten parametr 6 miesięcy wcześniej każdego dnia będzie się zmieniał właśnie o jeden dzień.

1

Nigdy nie używałem mssql, ale pierwszy google http://stackoverflow.com/questions/3932947/sql-server-2005-how-to-subtract-6-month :).

Ale takie rozwiązanie da dodatkowe sprawdzanie, więc wydaje mi się że nie będzie szybciej. Nie możesz po prostu ograniczyć ilości wyników do np. 10 - 20? Wtedy znajdzie pierwsze 10 rekordów z brzegu i przestanie szukać.

0

Jakaś podpowiedź jak to ograniczyć :) ? W sumie tak jak mówisz. Dodatkowy parametr i będzie więcej miała roboty i to może tylko zaszkodzić.

0

Czy zwykłe ROWNUM załatwi całą sprawę czy będzie zamulać jak w bazie będzie 200 tys. albo nawet 500 tys. rekordów?

0

Taka ilość danych dla bazy jest śmieszna, ale jak na raz wszystkie wczytasz do pamięci, to aplikacja będzie mulić. Sama zaś operacja odczytu wszystkich danych do pamięci i bindowania ich z kontrolką będzie ekstremalnie niewydajna.

Ty potrzebujesz zaimplementować stronicowanie albo virtual mode w DGV. Przecież użytkownik nie będzie przeglądał 100 tys wierszy na raz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1