[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