Indeksy

Transkrypt

Indeksy
Wykład IX
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
Wykład IX
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.
składnia:
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
Wykład IX
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
Wykład IX
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;
BEGIN
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;
BEGIN
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
Wykład IX
/* 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;
BEGIN
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;

Podobne dokumenty