W tym kursie opiszę czym są, do czego służą oraz jak działa partycjonowanie w Oracle. Partycjonowanie umożliwia rozkład bardzo dużych tabel i indeksów na mniejsze i łatwiejsze do zarządzania części zwane partycjami. Każda partycja jest niezależnym obiektem z własną nazwą i opcjonalnie własną charakterystyką pamięci.
Ten wpis jest częścią Kursu SQL Oracle
Koncepcja partycjonowania
Koncepcja partycjonowania opiera się, na założeniu dzielenia dużych obiektów na mniejsze. Z perspektywy administratora bazy danych obiekt podzielony na partycje ma wiele elementów, którymi można zarządzać zbiorowo lub indywidualnie. Daje to administratorowi dużą elastyczność w zarządzaniu partycjonowanymi obiektami. Jednak z perspektywy aplikacji tabela podzielona na partycje jest identyczna z tabelą niepodzieloną na partycje; dostęp do partycjonowanej tabeli przy użyciu zapytań SQL i instrukcji DML nie wymaga modyfikacji.
Każda partycja tabeli lub indeksu musi mieć te same atrybuty logiczne, takie jak nazwy kolumn, typy danych i ograniczenia. Na przykład wszystkie partycje w tabeli współużytkują te same definicje kolumn i ograniczeń, a wszystkie partycje w indeksie współużytkują te same indeksowane kolumny. Jednak każda partycja może mieć osobne atrybuty fizyczne, takie jak obszar tabel, do którego należy.
Partycjonowanie umożliwia podział tabeli, indeksu lub tabeli zorganizowanej na indeksy na mniejsze części, przy czym każdy element takiego obiektu bazy danych nazywany jest partycją. Każda partycja ma swoją nazwę i może opcjonalnie mieć własną charakterystykę pamięci.
Poniższy schemat pokazuje przykład partycjonowania tabeli.
Na powyższym schemacie widzimy podział większej tabeli na mniejsze części partycje. Każda partycja jest pewnym wycinkiem pierwotnej tabeli. Fizycznie każda partycja jest osobnym obiektem dlatego istnieje możliwość zarządzania każdą partycją osobno. Z punku widzenia użytkownika baza przed jak i po partycjonowaniu wygląda tak samo. Optymalizator bazy danych decyduje z której partycji pobrać dane.
Wykorzystanie partycji zwiększona wydajność zapytań. Jeżeli zapytanie dotyczy jednej partycji to zamiast skanować całą tabelę baza może przeskanować jedynie partycję w której umieszczone są dane. W kolejnych kursach opiszę dokładnie jak wykorzystać partycjonowanie do przyspieszania zapytań.
Strategie partycjonowania
Tabelę lub index dzieli się na partycje wg. klucza (ang. Partition Key). Klucz partycji to zestaw jednej lub kilku kolumn który określa partycje tj. jednoznacznie określa do której partycji należy rekord tabeli. Jeden wiersz może być przypisany tylko do jednej partycji.
W bazie danych Oracle występują trzy podstawowe strategie partycjonowania:
- Zakres (ang. Range Partition) – Partycjonowanie po zakresie przypisuje dane do partycji na podstawie zakresu klucza partycji. Dla każdej partycji określa się zakresy w których występują. Przykładem takiego partycjonowania może być partycjonowanie po dacie gdzie każdy miesiąc jest osobną partycją.
- Lista (ang. List Partition) – Partycjonowanie po liście przypisuje dane do partycji na podstawie listy określonych wartości. W partycjonowaniu można dodatkowo określić partycję domyślą która zawiera wszystkie niepasujące do listy wartości. Przykładem partycjonowanie po liście może być partycjonowanie względem województwa.
- wg. funkcji skrótu (ang. Hash Partition) – Partycjonowanie wg. funkcji skrótu przypisuje dane do partycji na podstawie algorytmu mieszającego (hash) który stosuje Oracle do zidentyfikowania klucza partycjonowania. Partycjonowanie to pozwala na równomierne rozłożenie danych w partycjach i pozwala partycjonować tabele które nie mają oczywistego klucza partycjonowania.
W kolejnych kursach pokażę dokładnie każdą z strategii partycjonowania.
Istnieje również możliwość kombinacji dwóch strategii partycjonowania. Partycjonowanie kompozytowe (ang. Composite Partition) polega na podzieleniu tabeli jednym typem strategii a następnie podzielenie jej na podsekcje przy pomocy innej strategii.
Indexy i partycje
Tak samo jak tabelę, partycjonować można również indexy. Przy partycjonowaniu tabel występują trzy rodzaje indexów ze względu na podział partycji:
Global Non-Partitioned Indexes – jest to index który nie został podzielony na partycje i zawiera ROWID do każdego rekordu tabeli. Mówiąc inaczej jeden index zawiera ROWID do rekordów z wszystkich partycji.
Poniższy schemat pokazuje powiązanie globalnego indexu niepartycjonowanego z tabelą partycjonowaną:
Local index partitioned – index który jest podzielony na te same kolumny, z taką samą liczbą partycji i tymi samymi granicami partycji co tabela. Powoduje, to że każda partycja tabeli ma swój przypisany index (raczej drzewo indexu).
Poniższy schemat pokazuje organizację lokalnego indexu partycjonowanego w stosunku do partycjonowanej tabeli:
Global Partitioned Indexes – Jest to index podzielony na partycje niezależnie od partycji tabeli. Jest to index partycjonowany innym kluczem niż partycjonowana tabela
Poniższy schemat pokazuje powiązanie globalnego indexu partycjonowanego względem partycjonowanej tabeli:
Podsumowanie
- Partycjonować można tabele, indexy i tabele zorganizowane w index
- Występują trzy główne strategie partycjonowania tabel:
- Range – wg. zakresu
- List – wg. listy
- Hash – wg. funkcji skrótu
- Composite – miszanka powyższych
- Występują trzy rodzaje indexów tabel partycjonowanych:
- Global non-partioned index – jeden niepartycjonowany index do całej tabeli
- Local partitioned index – Każda partycja ma własne drzewo indexu, index partycjonowany wg. tego samego klucza co tabela
- Global partitioned index – Index partycjonowany według innego klucza niż tabela
W kolejnych kursach będę przedstawiał wykorzystanie powyższych zagadnień związanych z partycjonowaniem na konkretnych przykładach, pokażę jak je wykorzystać w SQL. Pokaże również wpływ partycjonowania na organizację struktury logicznej bazy Oracle, wpływ partycjonowania na wydajność oraz przyjrzymy się planom zapytań.