[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Efektywność dostępu do zapisów - cd
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
<warunki_selekcji_wg_klucza_C>
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