(c) Instytut Informatyki Politechniki Poznańskiej
1
Optymalizacja polece
ń
SQL
Cz
ęść
3.
Metody poł
ą
cze
ń
,
metody sortowania, wskazówki
(c) Instytut Informatyki Politechniki Poznańskiej
2
Poł
ą
czenie (1)
•
Operacja binarna – zawsze udział bior
ą
dwie tabele, jedna zostaje
nazwana tabel
ą
zewn
ę
trzn
ą
, druga tabel
ą
wewn
ę
trzn
ą
.
•
W przypadku polecenia ł
ą
cz
ą
cego wi
ę
cej ni
ż
dwie tabele (np. A , B i
C), poł
ą
czenie realizowane jest zawsze dla pary tabel (np. A z B,
wynik z C, albo A z C i wynik z B, itd.).
•
Podstawowe zasady:
• główna zasada: kolejno
ść
ł
ą
czenia tabel powinna jak najbardziej
ogranicza
ć
zbiór rekordów
• optymalizator szuka w zbiorze ł
ą
czonych tabel takich, których
poł
ą
czenie wyprodukuje 1 rekord – je
ś
li znajdzie, te tabele s
ą
ł
ą
czone na pocz
ą
tku
• w przypadku poł
ą
czenia zewn
ę
trznego tabela zewn
ę
trzna jest
umieszczana w kolejno
ś
ci za tabel
ą
wewn
ę
trzn
ą
(c) Instytut Informatyki Politechniki Poznańskiej
3
Poł
ą
czenie (2)
•
Realizowane przy u
ż
yciu jednego z algorytmów:
• nested loops,
• sort merge,
• hash join.
•
Wybór algorytmu zale
ż
y od:
• rozmiaru tabeli,
• postaci warunku poł
ą
czeniowego,
• spodziewanego rozmiaru wyniku poł
ą
czenia,
• dost
ę
pno
ś
ci i rozmiaru obszaru sortowania,
• warto
ś
ci parametru odczytu wieloblokowego
(DB_FILE_MULTIBLOCK_READ_COUNT).
(c) Instytut Informatyki Politechniki Poznańskiej
4
Algorytm nested loops
•
Stosowany, gdy:
• w poł
ą
czeniu bierze udział mała cz
ęść
rekordów relacji,
• istnieje efektywna metoda dost
ę
pu do danych relacji wewn
ę
trznej
(indeks zało
ż
ony na kolumnie w warunku poł
ą
czeniowym).
•
Główny koszt – koszt odczytu rekordów relacji zewn
ę
trznej i
znalezienia odpowiadaj
ą
cych rekordów relacji wewn
ę
trznej.
•
Algorytm:
•
W planie wykonania
relacja zewn
ę
trzna
ponad relacj
ą
wewn
ę
trzn
ą
:
NESTED LOOPS
relacja_zewn
ę
trzna
relacja_wewn
ę
trzna
A
B
C
D
3
2
1
3
2
2
1
1
2
2
3
3
a
a
b
b
c
c
d
d
1
1
e
e
A
B
B
C
3
2
2
1
C
1
D
3
3
2
2
1
d
a
c
b
1
e
3
d
Relacja zewn
ę
trzna
Relacja wewn
ę
trzna
Wynik poł
ą
czenia
(c) Instytut Informatyki Politechniki Poznańskiej
5
Algorytm sort merge (1)
•
Stosowany, gdy:
•
ł
ą
czone relacje s
ą
niezale
ż
ne (brak poł
ą
czenia kluczem obcym),
•
warunek poł
ą
czeniowy z operatorami: <, <=, >, >= (ale nie !=) i du
ż
e
rozmiary ł
ą
czonych relacji (zachowuje si
ę
lepiej ni
ż
nested loop),
•
relacja ju
ż
s
ą
posortowane lub nie ma potrzeby realizacji sortowania
(bo np. istnieje odpowiedni indeks).
•
Główny koszt – koszt wczytania obu relacji do pami
ę
ci i ich
posortowania.
•
Brak podziału na relacj
ę
zewn
ę
trzn
ą
i wewn
ę
trzn
ą
.
•
Algorytm:
1. Posortowanie obu relacji ze wzgl
ę
du na warto
ś
ci kolumn w warunku
poł
ą
czeniowym.
2. Poł
ą
czenie rekordów o tych samych warto
ś
ciach kolumn w warunku
poł
ą
czeniowym.
(c) Instytut Informatyki Politechniki Poznańskiej
6
A
A
B
B
C
C
D
D
3
3
2
2
1
1
3
3
2
2
1
1
2
2
3
3
a
a
b
b
c
c
d
d
1
1
e
e
C
C
B
B
A
A
D
D
1
1
2
2
3
3
3
3
1
1
1
1
2
2
2
2
b
b
e
e
a
a
c
c
3
3
d
d
sortowanie
zł
ą
czenie
C
C
C
C
B
B
B
B
1
1
1
1
2
2
2
2
A
A
3
3
D
D
3
3
1
1
1
1
2
2
2
2
b
b
e
e
a
a
c
c
3
3
d
d
3
3
d
d
Algorytm sort merge (2)
(c) Instytut Informatyki Politechniki Poznańskiej
7
Algorytm hash join (1)
•
Stosowany, gdy:
• warunek poł
ą
czeniowy jest warunkiem równo
ś
ciowym, i
• ł
ą
czone relacje o du
ż
ym rozmiarze lub wi
ę
ksza cz
ęść
rekordów
mniejszej relacji bierze udział w poł
ą
czeniu.
•
Główny koszt – zbudowanie tabeli haszowej dla relacji zewn
ę
trznej i
odczyt rekordów z relacji wewn
ę
trznej.
•
Relacja zewn
ę
trzna – mniejsza z relacji, najlepiej, je
ś
li mie
ś
ci si
ę
w
pami
ę
ci.
•
W planie wykonania pierwsza relacja, z której zbudowano tablic
ę
haszow
ą
:
HASH JOIN
relacja_zewn
ę
trzna
relacja_wewn
ę
trzna
(c) Instytut Informatyki Politechniki Poznańskiej
8
Algorytm hash join (2)
•
Algorytm:
A
A
B
B
C
C
D
D
3
3
2
2
1
1
3
3
2
2
1
1
2
2
3
3
a
a
b
b
c
c
d
d
1
1
e
e
F
H
A
A
3
3
B
B
2
2
C
C
1
1
D
D
3
3
0
1
2
B
B
C
C
B
B
A
A
2
2
1
1
2
2
3
3
D
D
3
3
C
C
1
1
2
2
1
1
2
2
3
3
a
a
b
b
c
c
d
d
3
3
d
d
1
1
e
e
Funkcja_haszuj
ą
ca=
kolumna_poł
ą
czeniowa mod 3
Relacja zewn
ę
trzna
Relacja wewn
ę
trzna
Wynik
Tablica haszowa
(c) Instytut Informatyki Politechniki Poznańskiej
9
•
SORT ORDER BY – gdy w poleceniu wyra
ż
enie ORDER BY.
•
SORT AGGREGATE – gdy w poleceniu wyliczana funkcji grupowa
na całym zbiorze rekordów.
•
SORT (HASH) GROUP BY – gdy w poleceniu wyliczana funkcji
grupowa dla kilku grup rekordów.
SELECT * FROM zespoly
ORDER BY adres DESC;
SELECT MAX(zatrudniony)
FROM pracownicy;
SELECT etat, AVG(placa_pod)
FROM pracownicy GROUP BY etat;
Operacje sortowania (1)
(c) Instytut Informatyki Politechniki Poznańskiej
10
•
SORT (HASH) UNIQUE – gdy w poleceniu u
ż
yto klauzuli DISTINCT.
Uwaga!
Nie mo
ż
na zakłada
ć
uzyskania posortowanego zbioru rekordów
przy operacjach GROUP BY i DISTINCT.
•
SORT JOIN – przy wykonywaniu operacji poł
ą
czenia wg algorytmu
sort merge.
SELECT *
FROM pracownicy JOIN etaty ON placa_pod between
placa_min and placa_max;
SELECT DISTINCT etat
FROM pracownicy;
Operacje sortowania (2)
Zmienne wi
ą
zania w poleceniu SQL (1)
•
Pozwalaj
ą
na „sparametryzowanie” polecenia
(c) Instytut Informatyki Politechniki Poznańskiej
11
SQL> variable zespol number;
SQL> exec :zespol := 10
Procedura PL/SQL została zako
ń
czona pomy
ś
lnie.
SQL> print :zespol
ZESPOL
------
10
SQL> SELECT count(*) FROM PRACOWNICY WHERE id_zesp = :zespol;
COUNT(*)
--------
2
SQL> exec :zespol := 20
Procedura PL/SQL została zako
ń
czona pomy
ś
lnie.
SQL> SELECT count(*) FROM PRACOWNICY WHERE id_zesp = :zespol;
COUNT(*)
--------
7
Zmienne wi
ą
zania w poleceniu SQL (2)
•
Umo
ż
liwiaj
ą
wielokrotne u
ż
ycie tego samego planu wykonania przy
kolejnych wywołania polecenia z ró
ż
nymi warto
ś
ciami zmiennej
wi
ą
zania – tzw. „współdzielenie kursora” (domy
ś
lne działanie)
•
Przy pierwszym wywołaniu polecenia ze zmienn
ą
wi
ą
zania
optymalizator „spogl
ą
da” na warto
ść
zmiennej celem
wygenerowania optymalnego planu
•
Problem – kolejne wywołania tego samego polecenia z innymi
warto
ś
ciami dla zmiennej wi
ą
zania mog
ą
przetwarza
ć
dane o
innej
charakterystyce
ni
ż
te z pierwszego wywołania
•
Rozwi
ą
zanie – optymalizator obserwuje kolejne wywołania i
podejmuje decyzje, czy dla kolejnego wywołania polecenia z inn
ą
warto
ś
ci
ą
zmiennej wi
ą
zania wygenerowa
ć
nowy plan
•
Efekt – by
ć
mo
ż
e wiele planów wykonania dla tego samego
polecenia
(c) Instytut Informatyki Politechniki Poznańskiej
12
(c) Instytut Informatyki Politechniki Poznańskiej
13
Wskazówki (1)
•
Wskazówki (ang. hints) umo
ż
liwiaj
ą
okre
ś
lenie bezpo
ś
rednio w
poleceniu nast
ę
puj
ą
cych elementów pracy optymalizatora:
• celu optymalizacji,
•
ś
cie
ż
ki dost
ę
pu do danych,
• kolejno
ś
ci ł
ą
czonych relacji przy operacji poł
ą
czenia,
• sposobu realizacji poł
ą
czenia
•
Wskazówki umieszcza si
ę
w komentarzu bezpo
ś
rednio po
klauzulach SELECT, INSERT, UPDATE, DELETE, przy czym
pierwszym znakiem wskazówki musi by
ć
+ (plus).
•
Uwaga! Bł
ę
dnie sformułowana wskazówka nie powoduje bł
ę
du
wykonania polecenia – jest ignorowana!
SELECT
/*+ wskazówka */
… FROM …;
SELECT
--+ wskazówka
… FROM …;
(c) Instytut Informatyki Politechniki Poznańskiej
14
Wskazówki (2)
•
Wybór celu optymalizacji:
• ALL_ROWS
– przepustowo
ść
,
• FIRST_ROWS
– czas odpowiedzi (wycofywana od Oracle10g),
• FIRST_ROWS(n)
– czas odpowiedzi (pierwszych n krotek).
•
Sposób dost
ę
pu do danych:
•
FULL
(tabela) – pełne przegl
ą
dni
ę
cie tabeli,
• INDEX
(tabela [indeks]) – dost
ę
p za pomoc
ą
indeksu,
• NO_INDEX
(tabela [indeks]) – zakazanie u
ż
ycia indeksu,
• INDEX_COMBINE
(tabela [indeks]) – dost
ę
p za pomoc
ą
indeksu
bitmapowego,
• INDEX_DESC
(tabela [indeks]) – dost
ę
p za pomoc
ą
odwróconego
przeszukiwania indeksu,
(c) Instytut Informatyki Politechniki Poznańskiej
15
Wskazówki (3)
•
Sposób dost
ę
pu do danych (cd):
• INDEX_FFS
(tabela [indeks]) – dost
ę
p za pomoc
ą
szybkiego
przeszukania indeksu,
• NO_INDEX_FFS
(tabela [indeks]) – zakazanie u
ż
ycia szybkiego
przeszukania indeksu,
• INDEX_SS
(tabela [indeks]) – dost
ę
p za pomoc
ą
przegl
ą
dni
ę
cia indeksu
z pomini
ę
ciem kolumn,
• NO_INDEX_SS
(tabela [indeks]) – zakazanie u
ż
ycia przegl
ą
dni
ę
cia
indeksu z pomini
ę
ciem kolumn,
• INDEX_JOIN
(tabela [indeks] …) – wykonanie poł
ą
czenia indeksów,
•
Kolejno
ść
ł
ą
czenia relacji:
• LEADING
(tabela1 tabela2 ...) – okre
ś
la zbiór tabel, które maj
ą
by
ć
ł
ą
czone jako pierwsze,
• ORDERED
– okre
ś
la,
ż
e tabele maj
ą
by
ć
ł
ą
czone w takiej kolejno
ś
ci, jak
zostały wymienione w klauzuli FROM.
(c) Instytut Informatyki Politechniki Poznańskiej
16
Wskazówki (4)
•
Algorytm ł
ą
czenia relacji:
• USE_NL
(tabela_wewn
ę
trzna ...) - poł
ą
czenie NESTED LOOPS
• USE_HASH
(tabela_wewn
ę
trzna ...) - poł
ą
czenie HASH JOIN
• USE_MERGE
(tabela1 tabela2 ...) - poł
ą
czenie SORT MERGE
• NO_USE_NL
(...),
NO_USE_HASH
(...),
NO_USE_MERGE
(...) – zakaz
u
ż
ycia odpowiedniego algorytmu.
•
Inne:
• USE_CONCAT
– wymuszenie zast
ą
pienia zapytania z warunkiem
zło
ż
onym z operatorem OR przez kilka zapyta
ń
, poł
ą
czonych
operatorem UNION_ALL,
• NO_EXPAND
– zabronienie wykonania powy
ż
szej transformacji.
• NO_QUERY_TRANSFORMATION
– zakazanie wszystkich transformacji
polecenia (przed budow
ą
planu wykonania)
• DYNAMIC_SAMPLING
(tabela poziom_próbkowania) – okre
ś
lenie
poziomu dynamicznego próbkowania (wy
ż
szy poziom – wi
ę
kszy zakres
próbkowania, zakres: 0-10)
(c) Instytut Informatyki Politechniki Poznańskiej
17
Wskazówki (5)
•
Ł
ą
czenie wskazówek:
SELECT /*+ LEADING(p e) USE_MERGE(p e z) */ *
FROM pracownicy p NATURAL JOIN zespoly z JOIN ETATY e
ON placa_pod between placa_min and placa_max
WHERE nazwa = 'ALGORYTMY';