D7 Any Dac MS SQL problem poczatkujacego

0

Witam

Zaczynam się uczyć Delphi, ANY DAC i MS SQL

Utworzyłem bazę na SQLEXPRESS w której mam około 8 tys rekordów.

W DM ma skonfigurowane połączenie oraz przy użyciu TADQUREY i
TDataSource (Active False) pobieram dane z tabeli.

W trakcie uruchamiania aplikacji ustawiam Active na True.

Mam dwa pytania - wątpliwości

  1. Query podpinam do grida przy pierwszym wejściu , wykonaniu
    operacji w gridzie np przy pomocy komponentu JvDBSearchEdit1
    wyszukuje rekord trwa to dos długo , przy kolejnych wejściach
    wyszukaniach jest szybcie - czy ja coś źle robie czy tak ma być ?

  2. Chcąc wyświetlić jakieś dane (raport) tworze w DM nowe Query z
    odpowiednimi warunkami a później w tym Query sumuje odpowiednie
    wartości w pętli. Wyszukanie danych w Query trwa np 2 sekundy, pętla
    obliczeniowa ( musi być pętla bo sumuje odpowiednie pola do zmiennych
    na różnych warunkach) wykonuje się bardzo szybko (podpięty
    ProgressBar). Po tym jak ProgressBar osiągnie 100 % muszę czekać dość
    długo aż zobaczę wynik - czy ja coś źle robie czy tak ma być ?

0
bober70 napisał(a)
  1. Query podpinam do grida przy pierwszym wejściu , wykonaniu
    operacji w gridzie np przy pomocy komponentu JvDBSearchEdit1
    wyszukuje rekord trwa to dos długo , przy kolejnych wejściach
    wyszukaniach jest szybcie - czy ja coś źle robie czy tak ma być ?

Typowe dla MS SQL - on sobie cacheuje zapytanie (zaciąga dane z dysku do pamięci) - tak na prawde wiele systemów bazodanowych zachowuje się w ten sposób - zaciąga dane z dysku do pamięci z odpowiednim znacznikiem zycia danych, po upływie którego dane są automatycznie zwalniane z pamięci. Podobnie jest w przypadku procedur składowanych. Dlatego testy rzeczywistej wydajności wykonuje się po drugim odpaleniu - najlepiej z delikatnie zmodyfikowanymi warunkami zapytania - tak, żeby wynik nie poleciał z cache (bo serwer, jeżeli stwierdzi, że ma gotowy wynik dla zadanych parametrów pod ręką nie oblicza wszystkiego od poczatku, tylko tyle ile potrazebuje) - zmiana warunków wymusza na serwerze wykonanie kompletu obliczeń/operacji. Wracając - pierwsze odpalenie zawsze powoduje, że dane przepływają z dysku do pamięci. Kolejne odczyty już są szybsze, bo motor nie sięga do relatywnie wolnego nośnika danych.

bober70 napisał(a)
  1. Chcąc wyświetlić jakieś dane (raport) tworze w DM nowe Query z
    odpowiednimi warunkami a później w tym Query sumuje odpowiednie
    wartości w pętli. Wyszukanie danych w Query trwa np 2 sekundy, pętla
    obliczeniowa ( musi być pętla bo sumuje odpowiednie pola do zmiennych
    na różnych warunkach) wykonuje się bardzo szybko (podpięty
    ProgressBar). Po tym jak ProgressBar osiągnie 100 % muszę czekać dość
    długo aż zobaczę wynik - czy ja coś źle robie czy tak ma być ?
    Zawsze jest tak, że przetworzenie zapytania to jedno, a przesłanie wyników to drugie. Nie do końca jestem przekonany, że sumowanie MUSI odbywać się po stronie klienta (a wręcz zakładam, że skoro jak sam napisałeś zaczynasz - to pewnie nie znasz wszystkich możliwosci SQL). Ale - nie znam specyfiki Twojego programu więc nie będę zgadywał. Generalnie w Management Studio bodajże pod Ctrl+L masz fajne narzędzie do graficznego obrazowania EXPLAIN - to narzędzie rewelacyjnie pokazuje gdzie popełniasz błędy w postaci np skanowania tabel (zamiast przeszukiwania po indeksie).

Poza tym - warto rozważyć zastosowanie klauzuli NO COUNT ON - jeżeli ilość rekordów zwróconych przez DataSet nie jest dla ciebie kluczowa.

Generalnie MS SQL to mądre urządzenie.

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