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, Optymalizacja poleceń SQL

wynik z C, albo A z C i wynik z B, itd.).

Część 3.

•

Podstawowe zasady:

• główna zasada: kolejność łączenia tabel powinna jak najbardziej ograniczać zbiór rekordów

Metody połączeń,

• optymalizator szuka w zbiorze łączonych tabel takich, których metody sortowania, wskazówki

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

1

(c) Instytut Informatyki Politechniki Poznańskiej

2

Połączenie (2)

Algorytm nested loops

•

Realizowane przy użyciu jednego z algorytmów:

•

Stosowany, gdy:

• nested loops,

• w połączeniu bierze udział mała część rekordów relacji,

• sort merge,

• istnieje efektywna metoda dostępu do danych relacji wewnętrznej

• hash join.

(indeks założony na kolumnie w warunku połączeniowym).

•

Wybór algorytmu zależy od:

•

Główny koszt – koszt odczytu rekordów relacji zewnętrznej i

• rozmiaru tabeli,

znalezienia odpowiadających rekordów relacji wewnętrznej.

Relacja zewn

• postaci warunku połączeniowego,

•

Algorytm:

ętrzna

Relacja wewnętrzna

• spodziewanego rozmiaru wyniku połączenia,

A

3

2

a

B

2

1

b

• dostępności i rozmiaru obszaru sortowania,

C

1

2

c

• wartości parametru odczytu wieloblokowego

•

W planie wykonania

D

3

3

d

(DB_FILE_MULTIBLOCK_READ_COUNT).

1

e

relacja zewnętrzna

ponad relacją wewnętrzną:

A

3

3

d

NESTED LOOPS

Wynik połączenia

B

2

2

a

relacja_zewnętrzna

B

2

2

c

relacja_wewnętrzna

C

1

1

b

C

1

1

e

(c) Instytut Informatyki Politechniki Poznańskiej

3

(c) Instytut Informatyki Politechniki Poznańskiej

D

3

3

d

4

Algorytm sort merge (1)

Algorytm sort merge (2)

A

3

2

a

•

Stosowany, gdy:

B

2

1

b

•

łączone relacje są niezależne (brak połączenia kluczem obcym), C

1

2

c

•

warunek połączeniowy z operatorami: <, <=, >, >= (ale nie !=) i duże D

3

3

d

rozmiary łączonych relacji (zachowuje się lepiej niż nested loop), 1

e

•

relacja już są posortowane lub nie ma potrzeby realizacji sortowania sortowanie

(bo np. istnieje odpowiedni indeks).

C

1

1

b

•

Główny koszt – koszt wczytania obu relacji do pamięci i ich B

2

1

e

posortowania.

A

3

2

a

•

Brak podziału na relację zewnętrzną i wewnętrzną.

D

3

2

c

3

d

•

Algorytm:

złączenie

1. Posortowanie obu relacji ze względu na wartości kolumn w warunku C

1

1

b

połączeniowym.

C

1

1

e

2. Połączenie rekordów o tych samych wartościach kolumn w warunku B

2

2

a

połączeniowym.

B

2

2

c

A

3

3

d

D

3

3

d

(c) Instytut Informatyki Politechniki Poznańskiej

5

(c) Instytut Informatyki Politechniki Poznańskiej

6

Algorytm hash join (1)

Algorytm hash join (2)

•

Stosowany, gdy:

•

Algorytm:

• 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.

Funkcja_haszująca=

kolumna_połączeniowa mod 3

•

Główny koszt – zbudowanie tabeli haszowej dla relacji zewnętrznej i Tablica haszowa

odczyt rekordów z relacji wewnętrznej.

Relacja wewnętrzna

Relacja zewnętrzna

A

3

0

2

a

•

Relacja zewnętrzna – mniejsza z relacji, najlepiej, jeśli mieści się w A

3

D

3

1

b

pamięci.

B

2

H

2

c

F

1

C

1

•

W planie wykonania pierwsza relacja, z której zbudowano tablicę C

1

3

d

haszową:

D

3

1

e

2

B

2

HASH JOIN

Wynik

relacja_zewnętrzna

B

2 2

a

relacja_wewnętrzna

C

1 1

b

B

2 2

c

A

3 3

d

D

3 3

d

C

1 1

e

(c) Instytut Informatyki Politechniki Poznańskiej

7

(c) Instytut Informatyki Politechniki Poznańskiej

8

Operacje sortowania (1)

Operacje sortowania (2)

•

SORT ORDER BY – gdy w poleceniu wyrażenie ORDER BY.

•

SORT (HASH) UNIQUE – gdy w poleceniu użyto klauzuli DISTINCT.

SELECT * FROM zespoly

SELECT DISTINCT etat

ORDER BY adres DESC;

FROM pracownicy;

•

SORT AGGREGATE – gdy w poleceniu wyliczana funkcji grupowa Uwaga!

na całym zbiorze rekordów.

Nie można zakładać uzyskania posortowanego zbioru rekordów przy operacjach GROUP BY i DISTINCT.

SELECT MAX(zatrudniony)

FROM pracownicy;

•

SORT JOIN – przy wykonywaniu operacji połączenia wg algorytmu sort merge.

•

SORT (HASH) GROUP BY – gdy w poleceniu wyliczana funkcji SELECT *

grupowa dla kilku grup rekordów.

FROM pracownicy JOIN etaty ON placa_pod between SELECT etat, AVG(placa_pod)

placa_min and placa_max;

FROM pracownicy GROUP BY etat;

(c) Instytut Informatyki Politechniki Poznańskiej

9

(c) Instytut Informatyki Politechniki Poznańskiej

10

Zmienne wiązania w poleceniu SQL (1)

Zmienne wiązania w poleceniu SQL (2)

•

Pozwalają na „sparametryzowanie” polecenia

•

Umożliwiają wielokrotne użycie tego samego planu wykonania przy SQL> variable zespol number;

kolejnych wywołania polecenia z różnymi wartościami zmiennej SQL> exec :zespol := 10

wiązania – tzw. „współdzielenie kursora” (domyślne działanie) Procedura PL/SQL została zakończona pomyślnie.

•

Przy pierwszym wywołaniu polecenia ze zmienną wiązania SQL> print :zespol

optymalizator „spogląda” na wartość zmiennej celem ZESPOL

------

wygenerowania optymalnego planu

10

•

Problem – kolejne wywołania tego samego polecenia z innymi SQL> SELECT count(*) FROM PRACOWNICY WHERE id_zesp = :zespol; wartościami dla zmiennej wiązania mogą przetwarzać dane o innej COUNT(*)

charakterystyce niż te z pierwszego wywołania

--------

2

•

Rozwiązanie – optymalizator obserwuje kolejne wywołania i SQL> exec :zespol := 20

podejmuje decyzje, czy dla kolejnego wywołania polecenia z inną Procedura PL/SQL została zakończona pomyślnie.

wartością zmiennej wiązania wygenerować nowy plan SQL> SELECT count(*) FROM PRACOWNICY WHERE id_zesp = :zespol;

•

Efekt – być może wiele planów wykonania dla tego samego COUNT(*)

polecenia

--------

7

(c) Instytut Informatyki Politechniki Poznańskiej

11

(c) Instytut Informatyki Politechniki Poznańskiej

12

Wskazówki (1)

Wskazówki (2)

•

Wskazówki (ang. hints) umożliwiają określenie bezpośrednio w

•

Wybór celu optymalizacji:

poleceniu następujących elementów pracy optymalizatora:

• ALL_ROWS – przepustowość,

• celu optymalizacji,

• FIRST_ROWS – czas odpowiedzi (wycofywana od Oracle10g),

• ścieżki dostępu do danych,

• FIRST_ROWS(n) – czas odpowiedzi (pierwszych n krotek).

• kolejności łączonych relacji przy operacji połączenia,

• sposobu realizacji połączenia

•

Sposób dostępu do danych:

•

Wskazówki umieszcza się w komentarzu bezpośrednio po

•

FULL ( tabela) – pełne przeglądnięcie tabeli, klauzulach SELECT, INSERT, UPDATE, DELETE, przy czym

• INDEX ( tabela [indeks]) – dostęp za pomocą indeksu, pierwszym znakiem wskazówki musi być + (plus).

• NO_INDEX( tabela [indeks]) – zakazanie użycia indeksu,

• INDEX_COMBINE ( tabela [indeks]) – dostęp za pomocą indeksu SELECT /*+ wskazówka */ … FROM …;

bitmapowego,

SELECT --+ wskazówka

• INDEX_DESC ( tabela [indeks]) – dostęp za pomocą odwróconego

… FROM …;

przeszukiwania indeksu,

•

Uwaga! Błędnie sformułowana wskazówka nie powoduje błędu wykonania polecenia – jest ignorowana!

(c) Instytut Informatyki Politechniki Poznańskiej

13

(c) Instytut Informatyki Politechniki Poznańskiej

14

Wskazówki (3)

Wskazówki (4)

•

Sposób dostępu do danych (cd):

•

Algorytm łączenia relacji:

• INDEX_FFS ( tabela [indeks]) – dostęp za pomocą szybkiego

• USE_NL( tabela_wewnętrzna ...) - połączenie NESTED LOOPS

przeszukania indeksu,

• USE_HASH ( tabela_wewnętrzna ...) - połączenie HASH JOIN

• NO_INDEX_FFS( tabela [indeks]) – zakazanie użycia szybkiego

• USE_MERGE ( tabela1 tabela2 ...) - połączenie SORT MERGE

przeszukania indeksu,

• NO_USE_NL(...), NO_USE_HASH(...), NO_USE_MERGE(...) – zakaz

• INDEX_SS ( tabela [indeks]) – dostęp za pomocą przeglądnięcia indeksu użycia odpowiedniego algorytmu.

z pominięciem kolumn,

• NO_INDEX_SS ( tabela [indeks]) – zakazanie użycia przeglądnięcia

•

Inne:

indeksu z pominięciem kolumn,

• USE_CONCAT – wymuszenie zastąpienia zapytania z warunkiem

• INDEX_JOIN ( tabela [indeks] …) – wykonanie połączenia indeksów, złożonym z operatorem OR przez kilka zapytań, połączonych operatorem UNION_ALL,

•

Kolejność łączenia relacji:

• NO_EXPAND – zabronienie wykonania powyższej transformacji.

• LEADING( tabela1 tabela2 ... ) – określa zbiór tabel, które mają być

• NO_QUERY_TRANSFORMATION – zakazanie wszystkich transformacji łączone jako pierwsze,

polecenia (przed budową planu wykonania)

• ORDERED – określa, że tabele mają być łączone w takiej kolejności, jak

• DYNAMIC_SAMPLING( tabela poziom_próbkowania) – określenie zostały wymienione w klauzuli FROM.

poziomu dynamicznego próbkowania (wyższy poziom – większy zakres próbkowania, zakres: 0-10)

(c) Instytut Informatyki Politechniki Poznańskiej

15

(c) Instytut Informatyki Politechniki Poznańskiej

16

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';

(c) Instytut Informatyki Politechniki Poznańskiej

17