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
Że niby wczytanie całej bazy na raz jest wydajne?
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"
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.
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ń.
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ć.
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ć.
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?
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.