Dodatkowe dyskowe struktury danych 1. Składowanie danych w

Transkrypt

Dodatkowe dyskowe struktury danych 1. Składowanie danych w
Dodatkowe dyskowe struktury danych
1. Składowanie danych w plikach klastrowych
Możliwe jest przechowywanie w jednym pliku klastrowym krotek wielu
relacji. Krotki różnych relacji o takich samych wartościach wybranego
atrybutu są przechowywane w tych samych blokach dyskowych.
Dostępne są dwa rodzaje klastrów: haszowe i indeksowe. Zastosowanie
klastrów może przyśpieszyć wykonanie równościowego połączenia
relacji umieszczonych w klastrze oraz operacje dostępu lub grupowania
odwołujące się do wspólnego atrybutu klastra.
CREATE CLUSTER nazwa_klastra
(definicje atrybutów)
INDEX
SIZE wielkość_bloku;
Id_zesp = 10
<'Administracja'>
<100, 'Nowak', 'sekretarka', 1 950>
Indeks on
id_zesp
<110, 'Tarzan', 'prezes', 25 000>
<120, 'Buc', 'v-prezes', 18 500>
Id_zesp = 20
<'Ochrona'>
<130, 'Baran', 'portier', 1 950>
<140, 'Buła', 'ochroniarz', 2500>
Przykład utworzenia pliku klastrowego:
CREATE CLUSTER zesp_prac
(id_zesp NUMBER(4))
INDEX SIZE 4 K; -- <= block size
Założenie indeksu na pustym klastrze:
CREATE INDEX zesp_prac_ind
ON CLUSTER zesp_prac;
Utworzenie tabeli w klastrze:
CREATE TABLE pracownicy2
CLUSTER zesp_prac (id_zesp)
AS SELECT * FROM pracownicy;
Dodanie kolejnej tabeli do klastra:
CREATE TABLE zespoły2
CLUSTER zesp_prac (id_zesp)
AS SELECT * FROM zespoły;
Operacja połączenia tabel Pracownicy2 i Zespoły2 w zdefiniowanym
klastrze, będzie najbardziej wydajna w zbiorze różnych metod
wykonywania operacji połączeń. Krotki tych relacji są na bieżąco
fizycznie łączone w pliku klastrowym.
2. Składowanie relacji w plikach haszowych
Dla pewnej klasy zapytań pliki haszowe oferują najszybszy z możliwych
dostępów za pomocą skojarzonej z plikiem funkcji haszowej.
CREATE CLUSTER nazwa_klastra (
atrybut_haszowy typ_danych)
SIZE rozmiar_kubełka
SINGLE TABLE HASHKEYS liczba_kubełków HASH IS funkcja
<101, 'Nowak', 'sekretarka', 1 950>
<111, 'Tarzan', 'prezes', 25 000>
<121, 'Buc', 'v-prezes', 18 500>
mod(id_prac,10)
)
2
102
hash value = 1
<102, 'Baran', 'portier', 1 950>
<112, 'Buła', 'ochroniarz', 2500>
Przykład:
CREATE CLUSTER haszowy (
id_prac number(6))
SIZE 1 K SINGLE TABLE HASHKEYS 1025
hash value = 2
Wartości size i hashkeys muszą wynikać z przewidywanej liczby
rekordów tabeli, rozmiaru pojedynczych rekordów i rozkładu wartości
atrybutu haszowego. Faktyczna liczba kubełków w pliku haszowym jest
równa najmniejszej z liczb pierwszych większej od podanej wartości
hashkeys. Domyślną funkcją haszującą jest funkcja modulo.
Tworzenie tabeli w klastrze haszowym:
CREATE TABLE prac_hash
(id_prac NUMBER(6), id_zesp NUMBER(3), nazwisko
VARCHAR2(50), płeć CHAR(1), czy_etat CHAR(1),
płaca NUMBER(6,2), płaca_dod NUMBER(6,2))
CLUSTER haszowy(id_prac)
lub
CREATE TABLE prac_hash
CLUSTER haszowy(id_prac)
AS SELECT * FROM pracownicy
3. Indeksy rzadkie – tablica zorganizowana jako indeks
W DBMS Oracle indeksy rzadkie są implementowane przez składowanie
tabel jako indeksów. Taka organizacja wymusza posortowanie krotek
relacji według klucza podstawowego.
CREATE TABLE nazwa_tabeli
(specyfikacja atrybutów i więzów integralności)
ORGANIZATION INDEX
PCTTHRESHOLD procent
/* Procent objętości liści indeksu przeznaczony do składowania pojedynczej
krotki. Domyślną i maksymalną wartością jest 50%, co oznacza co najmniej
dwie krotki na liść. Krotki o wielkości przekraczającej 50% objętości liści są
dzielone na dwie części. Jedna część, która musi zawierać co najmniej cały
klucz, pozostaje w indeksie. Wartości pozostałych atrybutów są lokowane w
dodatkowym obszarze poza indeksem */
OVERFLOW TABLESPACE przestrzeń tabel
/* Przestrzeń tabel, w której zostaną umieszczone części krotek nie mieszczące
się w indeksie */
INCLUDING atrybut
/* Alternatywny sposób podziału zbyt długich krotek. Parametr definiuje ostatni
atrybut, w kolejności wynikającej z definicji tabeli, który musi się znaleźć w
liściach indeksu. */
Przykład:
CREATE TABLE prac_iot
(id_prac NUMBER(6), id_zesp NUMBER(3),
nazwisko VARCHAR2(50), plec CHAR(1),
czy_etat CHAR(1), placa NUMBER(6,2),
placa_dod NUMBER(6,2),
constraint PK_IOT primary key(id_prac) )
ORGANIZATION INDEX
INCLUDING czy_etat
OVERFLOW TABLESPACE Inna_przestrzeń
Indeksy rzadkie są potencjalnie niższe niż gęste i oferują większą
funkcjonalność. W DBMS Oracle indeksy rzadkie mogą być zakładane
tylko na kluczach podstawowych.
Ćwiczenia
Dla każdej z poniższych operacji znajdź i zweryfikuj dyskowe struktury
danych umożliwiające najszybszą z możliwych realizacji tych poleceń.
Dla każdego z analizowanych rozwiązań porównaj funkcje kosztu i liczby
operacji dyskowych (jako sumy db block gets i consistent gets przy
liczbie recursive calls równej 0) niezbędnych do wykonania tego
polecenia.
+
{
= 82
Weryfikacja każdego z proponowanych rozwiązań musi być
poprzedzona zebraniem odpowiednich statystyk.
1. select * from prac where id_prac = 5012
2. select count(distinct nazwisko) from prac
where id_prac between 3012 and 4087
3. select count(*), avg(placa), sum(placa) from prac
where id_zesp = 3
4. select nazwa, nazwisko
from prac p inner join zesp z
on z.id_zesp = p.id_zesp
where z.id_zesp = 2 and placa > 1900;
5. select nazwisko, placa, e.placa_max, z.nazwa
from (prac p inner join zesp z on p.id_zesp = z.id_zesp)
inner join etaty2 e on p.etat = e.nazwa
and p.placa > e.placa_max
0
15
db block gets
consistent gets