🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi.bazy-danych
Article #529

Re: TTable i TQuery - porównanie szybkości

#529
From: Jurek M.
Date: Mon, 10 May 1999 18:22
114 lines
5964 bytes
Jarek Zgoda napisał(a) w wiadomości: <373686D8.E83967D1@polanglo.pl>...
>Czołem Panie i Panowie,
>mam małe pytanko. Otóż, po przeczytaniu kilku(nastu) postów nt.
>komponentów dostępu do danych, postanowiłem sprawdzić ich szybkość.
>Wszyscy polecali stosowanie komponentu TQuery zamiast TTable, więc na
Ciach ...

Cześć,  Moje doświadczenia są następujące:

1. Zasada generalna dla wszystkich baz odnośnie indeksów:

    Dla wszystkich (DBase, Paradox, SQL i innych):
        - załóż dobrze przemyślane indeksy

    Dla baz plikowych (DBase, Paradox):
        - jeżeli zamierzasz korzystać z TTable, mogą one być w zasadzie
dowolne,
          ale dobrze będzie jak będą wspierać stosowane w aplikacji filtry i
zakresy
          oraz oczywiście wymagane sortowania
        - jeżeli zamierzasz stosować TQuery to indeksy powinny być proste,
          tzn. po jednej kolumnie. Powinny one dobrze wspierać stosowane w
aplikacji
          polecenia SQL w zakresie selekcji wierszy i sortowania. Stosowanie
indeksów
          złożonych (po wielu kolumnach lub stosowanie wyrażeń w DBase) może
          spowodować, że taki index będzie dla "Local SQL-a" bezużyteczny
lub będzie
          wykorzystana jedynie pierwsza kolumna

2. Do baz plikowych (DBase, Paradox)
        - jeżeli zamierzasz prezentować w DbGrid-ach długie listy, np.
zestawienia
          obrotów z całych miesięcy lub lat (ja mam w FK ok. 25.000 zapisów
/ miesiąc),
          to stosuj TTable. Po ustawieniu odpowiednich relacji, indeksów i
ewentualnie
          zakresów (z filtrami ostrożnie) wyświetlanie wierszy jest
natychmiastowe.
          Przy stosowaniu relacji trzeba być czujnym przy dopisywaniu nowych
wierszy
          i aktualizacji pól w wierszach istniejących, ale to daje się
zrobić w miarę gładko.
          Gdybyś tutaj stosował TQuery, to pamiętaj, że Local SQL buduje
folderze roboczym
          kursor będący odpowiedzią na zapytanie w postaci pliku DBase lub
Paradox
          (w zależności od default drivera dla Database / Aliasu)
zawierającego WSZYSTKIE
          wiersze wynikowe tego zapytania; nie ma tutaj możliwości
pobierania (fetch)
          po kawałku. Nawet przy poprawnych indeksach to budowanie kursora
          (zapis na dysk) zabiera najwięcej czasu i jest dla użytkownika
irytujące,
          np. wynik zawierający 50.000 wierszy.

        - jeżeli możesz sobie pozwolić na interfejs prezentyjący aktualnie
pola jednego wiersza
          (ew. kilku do kilkudziesięcu), to wybierz TQuery. Jest to
rozwiązanie bardziej
          uniwersalne, bo będzie dobrze obsługiwać zarówno bazy plikowe jak
i SQL-owe,
          i możesz też stosować 'casched updates' jeżeli chcesz. Dla zapytań
SQL możesz
          założyć dodatkowe indeksy proste. To będzie też dobre dla baz
Accessa.

        - albo stosuj rozwiązanie mieszane (ja tak robiłem dopóki nie
przestawiłem się całkowicie
          na bazy SQL-owe). Do prezentacji długich list stosuj TTable, a w
przypadku wyrafinowanych
          zapytań zwracających rozsądną liczbę wierszy (ja założyłem do
kilkuset) stosuj TQuery.
          Nie musisz sie wtedy przejmować relacjami, zakresami, filtrami i
sortowaniem. Chociaż
          w takich przypadkach kursory wynikowe są zazwyczaj 'not
updateable' i trzeba to sobie
          jakoś obsłużyć, ale to też nie problem. I dla baz Paradoxa uważaj
abyś nie popadł
          w problem 'Lock file has grown too large' jak to miał kolega 'sir
pawian' w wiadomości
          z dnia 30.04.1999 i poprawnie ustaw foldery: sieciowy i roboczy.

3. Dla baz SQL-owych generalnie stosuj TQuery; bez dalszego komentarza.
    Ale pamiętaj o właściwych indeksach i optymalizacji zapytań (uwzględnij
PLAN).

4. Dla baz Accessa sprawa jest bardziej złożona. Otóż obsługa tych baz
wymaga obecności
    DAO, a to oznacza już dwóch pośredników w dostępie do bazy (BDE i DAO).
    I w dodatku aby korzystać z takiej aplikacji (lub sprzedawać ją) musisz
mieć legalne DAO
    ew. z licencją do dystrybucji (chyba , że założysz, że aplikacja
współpracuje z taką, która
    ma legalne DAO).
    Z konieczności popełniłem kiedyś jedną aplikację z bazami Accessa, ale
wybrałem do tego
    Visual C++ (ale mi visual !?) i chodziło bardzo sprawnie, ale w Delphi
przygotowanie
    aplikacji jest dużo bardziej przyjemne. Ale dla baz Accessa jest to
chyba najlepsze wyjście.

Jak widzisz, wybór metody zależy od problemu, projektu aplikacji i
wykorzystywanych
baz danych. Gorąco polecam bazy SQL-owe. Dla mniej zamożnych klientów można
postawić server niekomercyjny (Linux + MySQL, PostgreSQL, Interbase 4), a
dla bogatszych
Oracle, Informix czy MS SQL. A zapewniają one bardziej komfortową pracę
zarówno
dla producenta oprogramowania jak i użytkownika (i można zarobić na
postawieniu servera).

Pozdrowienia, Jurek M.  e-mail: jurek1@box43.gnet.pl
Technical Details
Message-ID: <nvFZ2.7230$I1.130172@news.tpnet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!news.nask.pl!orion.cst.tpsa.pl!news.tpnet.pl!not-for-mail
References: <373686D8.E83967D1@polanglo.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!pingwin.icm.edu.pl!mat.uni.torun.pl!uw.edu.pl!news.nask.pl!orion.cst.tpsa.pl!news.tpnet.pl!not-for-mail
From: "Jurek M." <jurek1@box43.gnet.pl>
Newsgroups: pl.comp.lang.delphi.bazy-danych
References: <373686D8.E83967D1@polanglo.pl>
Subject: Re: TTable i TQuery - porównanie szybkości
Lines: 117
X-Newsreader: Microsoft Outlook Express 4.72.2106.4
X-MimeOLE: Produced By Microsoft MimeOLE V4.72.2106.4
Message-ID: <nvFZ2.7230$I1.130172@news.tpnet.pl>
Date: Mon, 10 May 1999 20:22:50 +0200
NNTP-Posting-Host: 212.160.20.13
X-Complaints-To: abuse@tpsa.pl
X-Trace: news.tpnet.pl 926360659 212.160.20.13 (Mon, 10 May 1999 20:24:19 MET DST)
NNTP-Posting-Date: Mon, 10 May 1999 20:24:19 MET DST
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit