Optymalizacja poleceń SQL Część 2. Statystyki (1) Statystyki (2

Transkrypt

Optymalizacja poleceń SQL Część 2. Statystyki (1) Statystyki (2
Statystyki (1)
• Informacje, opisujące dane i struktury obiektów bazy danych.
• Przechowywane w słowniku danych.
Optymalizacja poleceń SQL
Część 2.
• Używane przez optymalizator do oszacowania:
•
•
•
•
Statystyki i histogramy,
metody dostępu do danych
selektywności predykatów polecenia,
kosztu użycia ścieżek dostępu,
kosztu operacji I/O i czasu procesora,
kosztu planu wykonania polecenia.
• Tylko aktualne statystyki użyteczne!
• Statystyki są statyczne – nie są automatycznie uaktualniane przy
zmianie danych.
(c) Instytut Informatyki Politechniki Poznańskiej
1
Statystyki (2)
(c) Instytut Informatyki Politechniki Poznańskiej
2
Statystyki (3)
• Przykłady statystyk:
• Statystyki mogą być gromadzone automatycznie (przez
dedykowany proces SZBD) lub ręcznie (na żądanie użytkownika)
przy użyciu pakietu DBMS_STATS.
• dla relacji:
• liczba rekordów,
• liczba bloków,
• średnia długość rekordu,
• W przypadku braku statystyk dla obiektów używanych w zapytaniu
przed wykonaniem zapytania optymalizator realizuje dynamiczne
próbkowanie statystyk.
• dla atrybutu relacji:
• liczba różnych wartości,
• liczba rekordów, w których atrybut ma wartość pustą,
• rozkład wartości (histogram),
• dla indeksu:
• liczba bloków-liści,
• wysokość drzewa,
• wskaźnik zgrupowania indeksu,
• statystyki systemowe:
• wykorzystanie procesora,
• liczba operacji we/wy.
(c) Instytut Informatyki Politechniki Poznańskiej
3
(c) Instytut Informatyki Politechniki Poznańskiej
4
Histogramy (1)
Histogramy (2)
• Histogram – szczegółowa statystyka opisująca rozkład wartości
określonej kolumny relacji.
• Rodzaje:
• Rodzaje (cd):
• histogram częstotliwości (ang. frequency) – każda wartość kolumny
odpowiada jednemu przedziałowi, każdy przedział zawiera liczbę
wystąpień tej wartości; tworzony wtedy, gdy liczba wartości kolumny
jest mniejsza bądź równa żądanej liczbie przedziałów histogramu.
• histogram o zrównoważonej wysokości (ang. height balanced) – zbiór
wartości kolumny dzielony jest na przedziały o tej samej (w
przybliżeniu) liczbie rekordów; przykład (zakres wartości: <1, 100>,
liczba przedziałów: 10):
• równomierny rozkład wartości atrybutu:
1
10
20
30
40
50
60
70
80
• Histogramy należy tworzyć tylko dla kolumn z nierównomiernym
rozkładem wartości (ang. skewed data), często używanych w
warunkach zapytania.
90 100
• Gdy zmieni się rozkład danych kolumny, konieczne jest ponowne
wygenerowanie histogramu,
• nierównomierny rozkład wartości atrybutu:
1
10
10
10
30
40
40
40
65
80
100
(c) Instytut Informatyki Politechniki Poznańskiej
5
(c) Instytut Informatyki Politechniki Poznańskiej
Ręczne zbieranie statystyk
Zbieranie statystyk dla indeksu
• Metody:
• na podstawie pełnych danych,
• szacowanie na podstawie próbki, próbka określana w
procentach liczby rekordów.
• Procedury zbierające statystyki:
• DBMS_STATS.GATHER_INDEX_STATS – dla indeksu,
• DBMS_STATS.GATHER_TABLE_STATS – dla relacji.
• Procedury usuwające statystyki:
• DBMS_STATS.DELETE_INDEX_STATS – dla indeksu,
• DBMS_STATS.DELETE_TABLE_STATS – dla relacji,
• DBMS_STATS.DELETE_COLUMN_STATS – dla kolumny.
exec DBMS_STATS.GATHER_INDEX_STATS(
ownname => <nazwa_schematu>, indname => <nazwa_indeksu>,
estimate_percent => <procentowa_wielkość_próbki>);
•
jeśli wartość <procentowa_wielkość_próbki> określono jako:
• null, wówczas statystyki zbierane na podstawie pełnych danych,
• liczbę z przedziału <0,00001; 100>, wówczas szacowanie na podstawie
próbki o zadanym rozmiarze,
• DBMS_STATS.AUTO_SAMPLE_SIZE – rozmiar próbki dobiera system.
exec DBMS_STATS.GATHER_INDEX_STATS(
ownname => 'SCOTT', indname => 'PK_PRAC', estimate_percent => 20);
•
(c) Instytut Informatyki Politechniki Poznańskiej
6
7
Uwaga! Od Oracle10g statystyki dot. indeksów są gromadzone automatycznie podczas tworzenia lub przebudowy indeksu.
(c) Instytut Informatyki Politechniki Poznańskiej
8
Zbieranie statystyk dla relacji (1)
Zbieranie statystyk dla relacji (2)
exec DBMS_STATS.GATHER_TABLE_STATS(
ownname => <nazwa_schematu>, tabname => <nazwa_relacji>,
estimate_percent => <procentowa_wielkość_próbki>,
method_opt => <rodzaj_statystyk>,
cascade =><DBMS_STATS.AUTO_CASCADE | TRUE | FALSE> );
•
METHOD_OPT – określa zakres zbieranych statystyk:
• FOR TABLE – tylko statystyki dla tabeli bez statystyk dla kolumn,
• FOR ALL COLUMNS [<klauzula SIZE>] – statystyki dla tabeli i statystyki
dla wszystkich kolumn,
• FOR ALL INDEXED COLUMNS [<klauzula SIZE>] – statystyki dla tabeli i
statystyki dla poindeksowanych kolumn,
• FOR COLUMNS [<klauzula SIZE>] kolumna1 [<klauzula SIZE>], kolumna2
[<klauzula SIZE>], ... – statystyki dla tabeli i statystyki dla wskazanych
kolumn.
(c) Instytut Informatyki Politechniki Poznańskiej
9
Zbieranie statystyk dla relacji (3)
•
FOR ALL COLUMNS SIZE AUTO – wartość domyślna dla par. METHOD_OPT:
• statystyki tabeli,
• podstawowe statystyki wszystkich kolumn tabeli,
• histogramy dla kolumn wyznaczonych na podstawie wcześniejszych
obserwacji dotyczących obciążenia i rozkładu wartości.
(c) Instytut Informatyki Politechniki Poznańskiej
10
• Dla relacji:
• USER_TABLES, USER_TAB_STATISTICS
• Dla kolumn:
• USER_TAB_COLUMNS, USER_TAB_COL_STATISTICS,
USER_TAB_HISTOGRAMS
• Dla indeksów:
• USER_INDEXES, USER_IND_STATISTICS
exec DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCOTT', tabname => 'PRACOWNICY',
method_opt => 'FOR ALL INDEXED COLUMNS',
cascade => TRUE);
SELECT num_rows, blocks, last_analyzed, sample_size
FROM USER_TAB_STATISTICS
WHERE table_name = 'PRACOWNICY';
Uwaga! Od Oracle12c statystyki dotyczące tabel zostają zebrane automatycznie
w sytuacji, gdy tabela, do której ładowane są dane ścieżką bezpośrednią
(polecenie INSERT /*+ APPEND */, dane umieszczane od razu w plikach bazy
danych z pominięciem bufora bazy danych), była poprzednio pusta:
• tabela została dopiero co utworzona i nie posiada jeszcze rekordów, lub
• usunięto z tabeli wszystkie rekordy.
(c) Instytut Informatyki Politechniki Poznańskiej
<klauzula SIZE> – SIZE { liczba | REPEAT | AUTO | SKEWONLY }:
• liczba – liczba przedziałów w histogramie, zakres: <1, 254>,
• REPEAT – powtórzenie zbierania histogramów dla kolumn, które mają już
histogramy,
• AUTO – SZBD określi, dla których kolumn zbierać histogramy na podstawie
obciążenia i rozkładu danych kolumny,
• SKEWONLY – SZBD określi, dla których kolumn zbierać histogramy tylko na
podstawie rozkładu danych kolumny (bez analizy obciążenia).
Statystyki w słowniku bazy danych
exec DBMS_STATS.GATHER_TABLE_STATS(
ownname => 'SCOTT', tabname => 'PRACOWNICY',
estimate_percent => DBMS_STATS.AUTO_SAMPLE_SIZE,
method_opt => 'FOR COLUMNS placa_pod SIZE AUTO, nazwisko SIZE AUTO');
•
•
SELECT num_distinct, low_value, high_value, num_buckets, histogram
FROM USER_TAB_COL_STATISTICS
WHERE table_name = 'PRACOWNICY'
AND column_name = 'NAZWISKO';
11
(c) Instytut Informatyki Politechniki Poznańskiej
12
Usuwanie statystyk
Metody dostępu do danych
• Określają, w jaki sposób dane polecenia SQL są odczytywane z
miejsca ich fizycznej lokalizacji.
• Dostęp do tabeli:
exec DBMS_STATS.DELETE_INDEX_STATS(
ownname => <nazwa_schematu>, indname => <nazwa_indeksu>);
• pełne przeglądnięcie,
• dostęp przy pomocy adresu rekordu.
exec DBMS_STATS.DELETE_TABLE_STATS(
ownname => <nazwa_schematu>, tabname => <nazwa_relacji>);
• Dostęp do indeksu:
• unikalne przeglądnięcie indeksu,
• (odwrócone) zakresowe przeglądnięcie indeksu,
• przeglądnięcie indeksu z pominięciem kolumn,
• pełne przeglądnięcie indeksu,
• szybkie pełne przeglądnięcie indeksu,
• dostęp do indeksu bitmapowego,
• połączenie indeksów.
Przy dostępie do indeksu dane zwykle zwracane w kolejności rosnącej.
exec DBMS_STATS.DELETE_COLUMN_STATS(
ownname => <nazwa_schematu>, tabname => <nazwa_relacji>,
colname => <nazwa_kolumny>, col_stat_type => <rodzaj_usuwanych_statystyk>);
• COL_STAT_TYPE:
• HISTOGRAM – usuwany jest histogram dla kolumny, podstawowe
statystyki kolumny pozostają,
• ALL – usuwane są wszystkie statystyki dla kolumny (wartość
domyślna).
(c) Instytut Informatyki Politechniki Poznańskiej
• Ogólne zasady dostępu do danych:
• odczyt dużej części rekordów relacji – pełne przeglądnięcie relacji,
• odczyt pojedynczych rekordów relacji – dostęp za pomocą indeksu.
13
Dostęp do tabeli
(c) Instytut Informatyki Politechniki Poznańskiej
14
Dostęp do tabeli
Pełne przeglądniecie tabeli
Dostęp przy pomocy adresu rekordu
• Ang. full table scan
• Sekwencyjny odczyt wszystkich bloków danych, w których tabela
przechowuje swoje rekordy, odfiltrowanie rekordów nie
spełniających zdefiniowanych w poleceniu SQL kryteriów selekcji
(np. w klauzuli WHERE).
• Stosowane gdy:
• Ang. rowid scan
• Odszukanie rekordu relacji na podstawie dostarczonego adresu
rekordu (rowid).
• Najszybszy sposób dostępu
do rekordów tabeli.
• Źródło adresu rekordu:
• warunek selekcji polecenia SQL,
• brak indeksu dla relacji lub
nie można użyć istniejących
indeksów,
DB_FILE_MULTIBLOCK_READ_COUNT
• zostanie odczytana duża część
wszystkich bloków, w których tabela składuje swoje dane,
• rozmiar tabeli jest niewielki.
SELECT * FROM pracownicy
WHERE rowid = ‘AAAMMUAAEAAAAAtAAG’;
• pobranie z indeksu tabeli.
• Możliwy odczyt wieloblokowy – pobranie w jednej operacji I/O wielu
przyległych bloków danych, bardziej efektywne niż wiele odczytów
pojedynczych bloków.
(c) Instytut Informatyki Politechniki Poznańskiej
15
(c) Instytut Informatyki Politechniki Poznańskiej
16
Dostęp do indeksu
Dostęp do indeksu
Unikalne przeglądnięcie indeksu
Zakresowe przeglądnięcie indeksu
• Ang. index unique scan
• Dostęp do indeksu unikalnego, operacja zwraca co najwyżej jeden
adres rekordu.
• Stosowane, gdy w poleceniu SQL zastosowano warunek
równościowy z atrybutem, na którym zdefiniowano indeks unikalny
(również ograniczenia klucz podstawowy i klucz unikalny).
• Ang. index range scan
• Dostęp do indeksu unikalnego (warunek inny niż równościowy) lub
nieunikalnego, operacja zwraca zakres adresów rekordów.
• Stosowane, gdy w poleceniu SQL:
(c) Instytut Informatyki Politechniki Poznańskiej
• warunek selekcji z kolumnami z części wiodącej indeksu, takie jak:
• kolumna = ‘wartość’, kolumna > ‘wartość’, kolumna < ‘wartość’
(również kombinacje powyższych)
• kolumna like ‘ABC%’ (% nie może być na początku wzorca),
• warunek złożony z ww. warunków ze spójnikiem AND,
• klauzula ORDER BY lub GROUP BY z atrybutami z części wiodącej
indeksu.
17
Dostęp do indeksu
18
Dostęp do indeksu
Odwrócone zakresowe przeglądnięcie indeksu
•
•
•
•
(c) Instytut Informatyki Politechniki Poznańskiej
Przeglądnięcie indeksu z pominięciem kolumn
Ang. index range scan descending
Odmiana zakresowego przeglądnięcia indeksu.
Dane zwracane w kolejności malejącej .
Stosowane, gdy:
• Ang. index skip scan
• Operacja korzystająca z indeksu złożonego dla polecenia, w którym
nie występuje kolumna z początku części wiodącej klucza
indeksowego:
• indeks dzielony jest na mniejsze podindeksy, liczba podindeksów jest
równa liczbie wartości pierwszej kolumny w kluczu indeksowym,
• podindeksy skanowane są kolejno – operacja zastępuje pełne
przeglądnięcie relacji.
• w poleceniu konieczne posortowanie danych w porządku malejącym,
• przy poszukiwaniu wartości mniejszych niż wartość wyspecyfikowana.
• Przykład:
• relacja Pracownicy(id_prac, adres, płeć), indeks o strukturze klucza:
(płeć, id_prac), zapytanie: select * from Pracownicy where id_prac =
100
• indeks zostaje podzielony na dwa podindeksy: dla wartości płeć = ‘M’ i
dla wartości płeć = ‘K’, podindeksy zostają przeskanowane kolejno.
(c) Instytut Informatyki Politechniki Poznańskiej
19
(c) Instytut Informatyki Politechniki Poznańskiej
20
Dostęp do indeksu
Dostęp do indeksu
Pełne przeglądnięcie indeksu
Szybkie pełne przeglądnięcie indeksu
• Ang. full index scan
• Stosowane, gdy:
• Ang. fast full index scan
• Stosowane, gdy:
• w warunku polecenia SQL odwołania do kolumn z klucza indeksowego,
kolumny nie muszą być częścią wiodącą klucza,
• brak odwołań do poindeksowanych kolumn w warunku polecenia, ale:
• wszystkie kolumny, które są używane w poleceniu SQL, występują w
kluczu indeksowym,
• co najmniej jedna z tych kolumn ma zdefiniowane ograniczenie NOT
NULL.
• wszystkie kolumny, do których występuje odwołanie w poleceniu (np. w
klauzuli SELECT), znajdują się w kluczu indeksowym,
• przynajmniej jedna z tych kolumn nie jest pusta.
• Zastępuje pełne przeglądnięcie relacji – wynik polecenia SQL
uzyskuje się bezpośrednio z indeksu, bez konieczności dostępu do
relacji.
• Odczytywane są wszystkie liście indeksu przy zastosowaniu
odczytu wieloblokowego – większa wydajność niż pełne
przeglądnięcie indeksu, ale nie zostaje zachowane uporządkowanie.
• Nie może być używany do eliminacji operacji sortowania relacji –
dane nie są posortowane wg klucza indeksowego.
• Odczytywane są wszystkie liście indeksu w porządku, bloki indeksu
odczytywane pojedynczo.
• Używane głównie do eliminacji operacji sortowania relacji – dane są
posortowane wg klucza indeksowego.
(c) Instytut Informatyki Politechniki Poznańskiej
21
Dostęp do indeksu
•
22
Dostęp do indeksu
Dostęp do indeksu bitmapowego
•
(c) Instytut Informatyki Politechniki Poznańskiej
Połączenie indeksów
Składa się z dwóch kroków:
1. dostęp do bitmapy,
2. konwersja bitmapy do adresów rekordów (krok opuszczany w
przypadku możliwości realizacji polecenia bez dostępu do
relacji).
W przypadku poleceń z warunkiem złożonym (spójniki AND i OR,
negacja), operacje koniunkcji, alternatywy i negacji wykonywane
bezpośrednio na bitmapach (widoczne w planie wykonania
polecenia).
• Ang. index join
• Stosowane w przypadku, gdy wszystkie kolumny, używane w
poleceniu SQL, znajdują się w kluczach kilku różnych indeksów.
• Wynik polecenia uzyskuje się tylko z indeksów, bez konieczności
dostępu do relacji.
• Nie może być stosowane do eliminacji operacji sortowania relacji.
• Przykład:
SELECT id_prac FROM pracownicy WHERE placa_pod >1000;
Range scan(indeks na placa_pod)
placa_pod ROWID
1600
00000001.001.001
...
...
2000
00000001.0A1.01E
join (hash)
(c) Instytut Informatyki Politechniki Poznańskiej
23
(c) Instytut Informatyki Politechniki Poznańskiej
Fast Full Scan(indeks na id_prac)
id_prac
120
...
140
ROWID
00000001.0A1.01E
...
00000001.001.001
120
...
140
24
Wskaźnik zgrupowania indeksu (1)
Wskaźnik zgrupowania indeksu (2)
• Minimalną jednostką operacji I/O jest blok dyskowy a nie rekord
• Interpretacja:
• mała wartość (równa lub bliska liczbie bloków tabeli) – dobrze, użycie
indeksu jest korzystne w stosunku do pełnego przeglądnięcia tabeli z
powodu konieczności wykonania mniejszej liczby operacji odczytu
bloków tabeli (odczytu danych) po dostępie do indeksu (po odczycie
adresów rekordów)
• Statystyka, pozwalająca na porównanie kosztu operacji
przeglądnięcia indeksu z kosztem pełnego przeglądnięcia tabeli
• Określa, jak mocno indeks jest "zsynchronizowany" z tabelą:
• duża wartość (równa lub bliska liczbie rekordów tabeli) – źle, użycie
indeksu jest niekorzystne w stosunku do pełnego przeglądnięcia tabeli
z powodu konieczności wykonania większej liczby operacji odczytu
bloków tabeli po dostępie do indeksu
• mała wartość – rekordy tabeli z tymi samymi (lub zbliżonymi)
wartościami poindeksowanej kolumny są skupione w niewielkiej liczbie
bloków
• duża wartość – rekordy tabeli z tymi samymi (lub zbliżonymi)
wartościami poindeksowanej kolumny są rozproszone w dużej liczbie
bloków
• Słownik danych
SELECT clustering_factor FROM user_indexes
WHERE index_name = ‘PRAC_PK’;
(c) Instytut Informatyki Politechniki Poznańskiej
25
Wskaźnik zgrupowania indeksu (3)
• Przykład – tabela posiada 9 rekordów, poindeksowana kolumna K1
posiada trzy wartości A, B i C (po trzy rekordy), rekordy zajmują 3
bloki.
• Przypadek 1. Mała wartość wskaźnika. Niski koszt skanu indeksu –
odczyt A wymaga dostępu do jednego bloku tabeli
BLOK 1
A
A
BLOK 2
A
B
B
BLOK 3
B
C
C
C
• Przypadek 2. Duża wartość wskaźnika. Wyższy koszt skanu indeksu
– odczyt A wymaga dostępu do wszystkich trzech bloków tabeli
BLOK 1
A
B
BLOK 2
C
(c) Instytut Informatyki Politechniki Poznańskiej
A
B
BLOK 3
C
A
B
C
27
(c) Instytut Informatyki Politechniki Poznańskiej
26

Podobne dokumenty