Clipper vs. Fox (bylo: Co jest z tym Windows-em 95 ???)

Autor: Ryszard Glab (rGLAB_at_waw.pdi.net)
Data: Sun 20 Apr 1997 - 17:05:04 MET DST


In article <335bf6ce.2804415_at_news.nask.pl>,
 warta_olsztyn_at_telbank.pl (Grzegorz Bodaszewski) wrote:

>SELECT COUNT(szkody.nr_szkody), polisy.kolor_samochodu ;
>from polisy, szkody, klienci;
>where szkody.nr_samoch = polisy.nr_samoch ;
>and klienci.nr_klienta = polisy.nr_klienta ;
>and szkody.data between {1996.01.01} and {1996.06.30} ;
>and polisy.samochod = 'MALUCH' ;
>and klienci.miasto <> 'WARSZAWA' ;
>and klienci.wiek < 25 ;
>group by polisy.kolor_samochodu

>Niech baza polis ma 100 MB, klientow 25 MB, a szkod 10 MB.
>Na kazdym istotnym dla zapytania polu masz zalozone
>klucze indeksowe...

>Aha, najpierw to oprogramuj w Clipperze ! ;-)))))))))))

Nieznosze wojen religijnych ale jawne prowokacje wymagaja odpowiedzi
;-)

Zakladajac ze podane wielkosci baz odzwierciedlaja iloscI rekordow w
bazach i jesli dobrze zrozumialem zapytanie to mozna np. tak:

DBCREATE( 'TEMP', {{'kolor', 'C', 10, 0}, ;
  {'nr_szkody', 'N',10,0}, {'ilosc','N',10,0}} )
USE temp NEW EXCLUSIVE
INDEX ON kolor+STR(nr_szkody,10) TO temp
SET ORDER TO temp

SELECT szkody
SET RELATION TO szkody->nr_klienta INTO klienci
SET SCOPE TO '19960101', '19960630'
GOTO TOP
DO WHILE( !EOF() )
  IF( klienci->( FOUND() ) .AND. ;
      !(klienci->miasto = 'WARSZAWA') .AND. klienci->wiek < 25 )
    IF( polisy->( DBSEEK(szkody->nr_samoch) ) .AND. ;
        polisy->samochod = 'MALUCH' )
      IF( temp->( DBSEEK( polisy->kolor_samochodu+;
                          STR(szkody->nr_szkody,10)) ) )
        temp->ilosc++
      ELSE
        temp->(DBAPPEND())
        temp->kolor :=polisy->kolor_samochodu
        temp->nr_szkody :=szkody->nr_szkody
      ENDIF
    ENDIF
  ENDIF
  SKIP
ENDDO
SET SCOPE TO
SET RELATION TO

SELECT temp
BROWSE
USE

Oczywiscie kod jest kilka razy dluzszy ale nawet bez dalszej
optymalizacji, (np. uzywajac dodatkowych indeksow w bazie klienci:
'miasto+nr_klienta' i w bazie polisy: 'samochod+nr_samochodu')
procedura wyszukiwania moze byc szybsza niz w Foxie - zwlaszcza na
wspomnianej poprzednio 386SX/16 4MB.

Pozdrawiam, Ryszard

--
r(ycho)GLAB
Warsaw, Poland
http://www.waw.pdi.net/~rglab


To archiwum zostało wygenerowane przez hypermail 2.1.7 : Tue 18 May 2004 - 16:03:12 MET DST