Indeksy dodatkowe struktury służące przyśpieszeniu dostępu do danych o użyciu indeksu podczas realizacji poleceń decyduje SZBD niektóre systemy bazodanowe automatycznie tworzą indeksy dla kolumn o wartościach unikatowych zalety i wady Struktura indeksu składa się z rekordów o dwóch polach klucz - zawiera wartości występujące w atrybutach relacji, na których założono indeks wskaźnik określa blok zawierający rekordy, których wartości atrybutów indeksowych są równe wartościom klucza Podział indeksów ze względu na strukturę B-drzewa, bitmapowe liczbę atrybutów indeksowych w kluczu - indeksy proste, złożone zastosowanie funkcyjne, bitmapowe, bitmapowe połączeniowe Indeks typu B drzewo definiowany tylko dla atrybutów o dużej selektywności z kluczem indeksowym przechowywana lista adresów rekordów wysoka współbieżność modyfikacji niski koszt pojedynczej modyfikacji, wysoki koszt modyfikacji grupy rekordów rozmiar indeksu może znacznie przewyższać rozmiar podstawowej relacji Indeks bitmapowy Ideą indeksów bitmapowych jest wykorzystanie pojedynczych bitów do zapamiętania informacji o tym, że dana wartość atrybutu występuje w określonym rekordzie tabeli. Dla każdej unikalnej wartości atrybutu jest przechowywana tablica bitów, zwana mapą bitową. stosowany najczęściej w systemach OLAP, hurtowniach danych definiowany tylko dla atrybutów o małej selektywności ( liczba różnych wartości atrybutu powinna być mniejsza niż1% liczby rekordów w relacji ) rozmiar indeksu jest niewielki nawet dla bardzo dużych relacji wysoki koszt pojedynczej modyfikacji, niski koszt modyfikacji grupy rekordów możliwość odwzorowania operatorów AND, OR, NOT z zapytania Indeks złożony klucz indeksu zawiera więcej niż jeden atrybut relacji stosowane gdy w poleceniach występuje kilka atrybutów w klauzuli WHERE zaleca się dobranie właściwej kolejności atrybutów stanowiących klucz indeksowy 1
składnia: Bitmapowy indeks połączeniowy Łączy w sobie koncepcję indeksu połączeniowego i bitmapowgo. Implementacyjnie, bitmapowy indeks połączeniowy posiada strukturę B_drzewa w którego liściach znajdują się mapy bitowe opisujące łączone rekordy wg benchmarków Oracle, bitmapowy indeks połączeniowy może być nawet 8-krotnie szybszy od tradycyjnych metod indeksowania z bitmapowego indeksu połączeniowego mogą korzystać tylko te zapytania, które w klauzuli WHERE nie odwołują się do kolumn nie objętych indeksem ze względu na bardzo niską efektywność operacji DML, w praktyce indeksy takie usuwa się przed ładowaniem hurtowni danych, a następnie tworzy się je ponownie. CREATE [ UNIQUE BITMAP ] INDEX <Nazwa_indeksu> ON <Nazwa_tabeli> ( <wyrażenie_indeksowe> ) [ COMPRESS ] [ REVERSE ] ; DROP INDEX <Nazwa_indeksu> ; ALTER INDEX <Nazwa_indeksu>... ; przykłady: CREATE INDEX Ind_pra ON Pracownicy (Upper( Nazwisko ) ) ; CREATE UNIQUE INDEX Ind_dzial ON Dzialy ( Nazwa ) ; CREATE BITMAP INDEX Ind_pl ON Studenci ( Plec ) ; CREATE BITMAP INDEX Ind_sprz ON Sprzedaz ( p.nazwa, k.miasto ) FROM Sprzedaz s, Sklepy k, Produkty p WHERE s.id_sklepu = k.id_sklepu AND s.id_produktu = p.id_produktu ; Strategia indeksowania indeksy zajmują miejsce i wymagają aktualizacji niektóre systemy bazodanowe automatycznie tworzą indeksy dla kolumn o wartościach unikatowych najczęściej stosuje się indeksy proste ( klucz indeksowy jedna kolumna ) indeksy o strukturze B-drzewa zaleca się tworzyć dla: kolumn zawierających mało duplikatów zapytań wybierających mały podzbiór wierszy tabeli kolumn często wykorzystywanych w warunkach selekcji kolumn pełniących rolę kluczy głównych 2
o indeksy bitmapowe mogą być alternatywą dla tradycyjnych indeksów gdy tabele są bardzo duże (miliony wierszy ) kolumny zawierają wartości często powtarzające się ( płeć, wykształcenie ) o indeksy z odwróconym kluczem stosujemy dla kolumny, której wartości wzrastają szeregowo, a przy tym wiele równoczesnych transakcji wykonuje operacje DML na tej kolumnie LICZNIKI - SEKWENCJE - kto z nich korzysta i w jakich okolicznościach? składnia: CREATE SEQUENCE <Nazwa_sekwencji> [ INCREMENT BY <wartość_liczbowa_co_ile> ] [ START WITH <wartosc_liczbowa_start _od> ] ; <Nazwa_sekwencji>.NEXTVAL - wygenerowanie następnej wartości <Nazwa_sekwencji>.CURRVAL - pobranie aktualnej wartości przykłady: CREATE SEQUENCE Numeruj INCREMENT BY 5 START WITH 50 ; INSERT INTO Dzialy VALUES (Numeruj.nextval, LOGISTYKA, POZNAŃ ) ; ALTER SEQUENCE Numeruj INCREMENT BY 10 ; INSERT INTO Czytelnicy VALUES ( Numeruj.nextval, Nowacki, Adam, Student, Myszków ul. Mała 5 ) ; DROP SEQUENCE Numeruj ; Inne obiekty bazy danych tworzone w PL/SQL 3
PL/SQL (ang. Procedural Language/Structured Query Language) Proceduralne rozszerzenie języka SQL do pisania aplikacji w Oracle język proceduralny; kompilowany wykorzystuje typowe konstrukcje programistyczne; pętle, decyzje ma strukturę blokową każda instrukcja bloku PL/SQL jest zakończona średnikiem /* przykładowy kod źródłowy funkcji */ CREATE OR REPLACE FUNCTION Dwa_imiona ( p_nr_albumu IN Studenci.Nr_albumu%TYPE ) RETURN BOOLEAN AS v_robo NUMBER:=0; SELECT instr(imiona,',') INTO v_robo FROM Studenci WHERE Nr_albumu = p_nr_albumu; IF v_robo <> 0 THEN RETURN FALSE; ELSE RETURN TRUE; END IF; END Dwa_imiona; /* przykładowy kod źródłowy procedury */ CREATE OR REPLACE PROCEDURE Losowanie ( Ilu NUMBER, p_rodzaj_studiow VARCHAR2 ) IS CURSOR Bufor ( p_rodzaj_studiow VARCHAR2) IS SELECT Nr_albumu, Nazwisko, Imiona FROM Studenci WHERE Rodzaj_studiow = p_rodzaj_studiow ORDER BY DBMS_RANDOM.value() ; TYPE T_rec IS RECORD ( Nr_albumu VARCHAR2(10), Nazwisko VARCHAR2(40), Imiona VARCHAR2(30)); Robo T_rec; DELETE FROM Wyniki ; OPEN Bufor( p_rodzaj_studiow) ; LOOP FETCH Bufor INTO Robo ; EXIT WHEN (Bufor%ROWCOUNT >Ilu ) OR ( Bufor%NOTFOUND ) ; INSERT INTO Wyniki VALUES( Robo.Nr_albumu, Robo.Nazwisko, Robo.Imiona ) ; END LOOP ; CLOSE Bufor ; END Losowanie ; 4
/* przykładowy kod źródłowy wyzwalacza */ CREATE OR REPLACE TRIGGER Kontrola_plac BEFORE INSERT ON Pracownicy FOR EACH ROW DECLARE V_min NUMBER; V_max NUMBER; SELECT placa_min, placa_max INTO V_min, V_max FROM Stanowiska WHERE stanowisko=:new.stanowisko; IF :new.placa NOT BETWEEN V_min AND V_max THEN RAISE_APPLICATION_ERROR( -20001,' Wynagrodzenie niezgodne z stanowiskiem'); END IF; END;