[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Jak to jest z client server?
>Wariant A.: ok. 20 sekund
>Wariant B.: ok. 30 minut
Witam !
Już kilkakrotnie starałem się w różnych miejscach dowiedzieć gdzie
dokonywana jest selekcja zapisów: po stronie serwera czy po stronie
klienta. Nigdzie na ten temat nie uzyskałem wiarygodnych odpowiedzi, a już
na pewno w formie jakiejś dokumentacji czy artykułu. Jest to słodką
tajemnicą firmy PSC. Oczywiście miejsce selekcji zapisów wpływa zasadniczo
na czas transmisji. W przypadku selekcji po stronie klienta wymaga to
przesłania dużej ilości zapisów przez sieć. Mój intuicyjny i poparty
obserwacjami pogląd na tę sprawę jest następujący:
- Strategia działania zależy od wersji Progress'a i w nowszych wersjach
(9.x) chyba jest z tym lepiej
- Selekcja odbywa się częściowo na serwerze, a częściowo po stronie klienta
- Na serwerze odbywa się nawiasowanie (bracketing), czyli wybieranie
zapisów z ciągłego przedziału kluczy w indeksie oraz realizacja złączeń
- Tak wybrane i złączone zapisy są wysyłane do klienta i tam dokonywana
jest selekcja szczegółowa (wszystkie warunki OR, MATCHES itp.)
- Chyba jednak szybciej są realizowane zapytania zadawane za pomocą
instrukcji QUERY niż FOR EACH. QUERY dopuszcza OUTER JOIN, a FOR ECAH nie,
co świadczy, że chyba jednak nie są realizowane tymi samymi mechanizmami.
Bardzo częstą przyczyną długiego czasu realizacji zapytań jest ich zła
konstrukcja wymagająca przeszukiwania całej tablicy - zapis po zapisie. Są
to zapytania, w których tak sformułowano warunki, że brak jest
nawiasowania. W przypadku realizacji takich zapytań lokalnie, gdzie
komunikacja między klientem a serwerem odbywa się przez pamięć dzieloną,
czas realizacji jest znośny, bo zapisy są dostępne na miejscu. W przypadku
zdalnego klienta sprawa staje się tragiczna. Wielokrotnie poprawiałem
programy napisane przez niedoświadczonych programistów nie rozumiejących
zasad nawiasowania i po takim zabiegu programy "dostawały skrzydeł",
działały 100 czy 1000 razy szybciej !. Jest to szczególnie widoczne przy
złączeniach dwóch tablic, gdzie każdy zapis jednej tablicy jest łączony z
każdym zapisem innej tablicy (oczywiście w sposób niezamierzony) po to by w
rezultacie wybrać kila złączeń. Liczba tak złączonych zapisów staje się
ogromna (równa iloczynowi ich ilości). Być może jest to taki przypadek.
Sytuację można często znacząco poprawić poprzez dodanie odpowiednich
indeksów umożliwiających sprawne nawiasowanie jak też poprzez przesyłanie
tylko potrzebnych pól a nie całych zapisów (opcja FIELDS).
I to tyle z mojej strony, sam chętnie posłucham co inni mają do
powiedzenia na ten temat albo wskażą jakąś literaturę.
Pozdrawiam,
Henryk Jusza mailto:henju@pg.gda.pl
--------------------------------------------------------------
Ośrodek Informatyczny Politechniki Gdańskiej
Pracownia Rozwoju Oprogramowania
tel (058) 347-28-01 fax (058) 347-24-63
------
Strona WWW: http://pluton.pol.lublin.pl/pugpl/index.htm
Obsluga listy: listserv@zeto.bydgoszcz.pl
Archiwum listy: http://www.zeto.bydgoszcz.pl/progress/index.html
------