[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Odp: Efektywność dostępu do zapisów - cd



     Jeżeli liczność zbioru C będzie mała (rzędu 1000 rekordów), albo rozkład występowania w tabeli B elementów rodzaju Ci nie jest normalny (liczba elementów rozdaju Cn >> Cm) to zapytania wykorzystujące klucz C mogą być mało efektywne. Oprócz tego trzeba zwrócić szczególną uwagę na zapytania wykorzystujące oba pola (klucz A + klucz C) i kompilować je z x-ref'em, bo Progress może inaczej ziterpretować zapytanie niż programista, który go napisze.
    Natomiast jeżeli chodzi o zmianę struktury takiej tabeli, to jest to rzeczywiście bolesne przerzycie. Natomiast zawsze można dodawać nowe pola ze znakiem '?' jako wartością domyślną i później ewentualnie nadać właściwą wartość (nie powinno zająć to więcej niz 12-24 g.). Natomiast dodawanie indeksów można zrobić własciwie tylko w jeden sposób - dodać indeks jako zdeaktywowany, a póżniej go odbudować off-line. Inne rozwiązania wymagają bardzo dużo miejsca na BI oraz mogą trwać tygodniami (o tym słyszałem, natomiast sam nidy nie miałem cierpliwości czekać na coś powyżej 24 g. i przerywałem podobne eksperymenty, także przenoszenie tabeli pomiędzy obszarami)

Z poważaniem,
Siergiej Szabłykin.


>>> henju@pg.gda.pl 05/08 9:49  >>>
Witam !

Dziękuję za odpowiedzi, zwróciły one moją uwagę na kilka aspektów 
posiadania tak dużych tablic. Do tej pory najliczniejsza tablica w naszej 
bazie (wersja 9.1B) zawiera 2,5 miliona zapisów i zachowuje się przyzwoicie.
Stoję przed problemem jaką reprezentację wybrać dla poniższej struktury danych:

  -------------
  |     A     |   Zapisy nagłówkowe paczki
  |           |
  -------------
        |
       /|\
  -------------   Paczki wartości trzymane w tablicy B
  |     B     |   przypisane do zapisu nagłówkowego A
  |           |   Rodzaj każdej wartości określony w tablicy C
  -------------
       \|/
        |
  -------------
  |     C     |
  |           |   Rodzaj wartości
  -------------

Jak widać z obrazka (jeśli w ogóle coś widać) chodzi o tablicę B która jest 
realizacją typowego związku wiele-do-wielu, tyle że bardzo liczną (jak 
pisałem 100 - 200 milionów zapisów). Tablica B będzie miała:
   - klucz obcy z tablicy A (jedno pole INTEGER)
   - klucz obcy z tablicy C (jedno pole INTEGER)
   - pole z wartością (DECIMAL)
oraz indeksy:
   - indeks podstawowy: Klucz A + Klucz C
   - indeks dodatkowy : Klucz C
Dostęp to najczęściej odczytanie zapisu A i paczki związnych z nim zapisów 
B z ewentualną selekcją ich rodzajów wg klucza obcego C.
     FOR EACH B OF A WHERE 
Dużo rzadziej dostęp typu "FIND FIRST B OF C" w celu zachowania integralności.

Alternatywą jest reprezentacja nierelacyjna, gdzie występuje tylko tablica 
A o strukturze:
   - klucz tablicy A
   - inne pola tablicy A
   - wektor wartości (EXTENT) zawierający tyle elementów ile wynosi:
     Max(wartość klucza C) - Min(wartość klucza C) + 1 = około 300 do 400
Indeks podstawowy: Klucz A
Wartość związana z kluczem C byłaby trzymana w wektorze na pozycji 
wyznaczonej przez ten klucz. Duża część (80% do 90%) wartości w wektorze 
byłaby zerowa.
W tej reporezentacji byłby czytany cały zapis A a selekcja wartości 
odbywałaby się w programie poprzez wybór potrzebnych elementów wektora.
Rozwiązanie to ma oczywiście wady:
   - większość elemmentów wektora zerowa (chociaż zera Progress ładnie pakuje)
   - większe zapisy w bazie i w transmisji
   - kłopoty, jeśli trzeba będzie zwiększyć rozmiar wektora
   - kłopoty z integralnością - nie można stwierdzić, czy klucz tbalicy C jest
     gdzieś użyty
   - generalnie nie lubię rozwiązań nierelacyjnych, bo to przeważnie źródło
     kłopotów
   - też nie mam doświadczeń z plem wektorowym zawierajacym 300 do 400 
elementów

Przy mniejszej liczności tablicy B bez żadnych wątpliwości wybrałbym 
reprezentację pierwszą (relacyjną), jednak przy dużej liczności ogarnęły 
mnie obawy co do efektywności, gdzyż nie mam doświadczeń z tak dużą 
tablicą, natomiast mam doświadczenie, że "papier wszystko wytrzyma, a w 
praktyce bywa różnie".

Jeszcze uwaga natury ogólnej - myślę, że przedstawiona przeze mnie sytuacja 
jest dość typowa i ciekawe są doświadczenia z różnych wariantów jej 
rozwiązania. O ile mnie pamięć nie myli, to w niektórych bazach (Sybase ?) 
takie tablice asocjacyjne mają specjalną reprezentację w bazie. A może w 
większości naszych przypadków tablica B ma przyzwoitą liczność i każdy 
wariant funkcjonuje w miarę sprawnie ?

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
------