Partycje

Autor: Marcin Kasiński
21.01.2011 13:24:00 +0200

Partycjonowanie jest mechanizmem pozwalającym na podział tabel lub indeksów ma mniejsze części - "partycje". Stosuje się je najczęściej przy bardzo dużych tablicach, czy indeksach, kiedy mimo stosowania indeksów, wydajność nie jest zadowalająca. Dzieje się tak ponieważ partycje są mniejsze i dostęp do nich jest bardziej wydajny. Partycje można uznać za podzbiór tabeli w jakiś sposób ze sobą związanych ograniczając dane zapisane w tabeli do węższego grona. Przykładem może być tutaj tabela zawierająca dane o sprzedaży. Tabele taka, jeśli byłaby tak duża, ze dostęp do niej byłby mało wydajny można podzielić na partycje, gdzie każda partycja będzie zawierała dane o sprzedaży tylko i wyłącznie z jednego roku. Zbiór wszystkich partycji będzie stanowił dopiera pełną tabelę. Partycje, podobnie jak to ma miejsce w przypadku indeksów zakłada się na kluczach określających kolumnę bądż kolumny tabeli. We wcześniej podanym przypadku takim kluczem będzie rok. Tak samo jak to ma miejsce w innych przypadkach podstawa do zaprojektowania partycji powinna być charakterystyka zapytań odwołujących się do tej tabeli.

Rozróżniamy kilka sposobów partycjonowania:

  • partycjonowanie zakresowe
  • z lista wartości
  • z kluczem haszowym
  • partycje złożone

Partycjonowanie zakresowe

Kluczem w takich partycjach jest konkretny zakres danych. Przykład:

CREATE TABLE sales (
id number,
name varchar(200),
sales_date DATE)
PARTITION BY RANGE (sales_date) (
PARTITION january2003 VALUES LESS THEN (TO_DATE('02/01/2003',
'MM/DD/YYYY')),
PARTITION february2003 VALUES LESS THEN (TO_DATE('03/01/2003',
'MM/DD/YYYY')),
...
PARTITION december2003 VALUES LESS THEN (TO_DATE('01/01/2004',
'MM/DD/YYYY')),
PARTITION max_value VALUES LESS THEN (MAXVALUE)
);

W powyższym przykładzie tabele dzielimy wg daty zapisanej w kolumnie sales_date. Ciekawostka jest tu ostatni przedział, który nie ma konkretnej granicy swojego przedziału. Jest to dość logiczne i zaleca się stosowanie takiego rozwiązania. Jeśli w powyższym przypadku nie wprowadzilibyśmy ostatniej partycji z zakresem kończącym się na max_value, w przypadku kiedy pojawi się rekord z kolumną sales_date poza zakresem wszystkich partycji system wygenerowałby błąd. Ostatnia partycja zabezpiecza nas przed taka sytuacja umieszczając takie rekordy w dodatkowej partycji. Przytoczony tu przykład może nie jest najbardziej trafny do ukazania konieczności wprowadzenia takiej partycji z przedziałem ograniczonym poprzez MAXVALUE. W tym przypadku znając charakterystykę działania aplikacji i np. to, że w tej kolumnie nie znajdzie się data większa niż bieżąca możemy przygotować dodatkowe partycje odpowiadające kilku przedziałom na przód, a następnie pilnować zbliżania się tych przedziałów do końca ostatniego zakresu. Jednak w wielu przypadkach nie będziemy mieli możliwości stwierdzić, kiedy wartość klucza może wyjść poza zakres. W takiej sytuacji zastosowanie partycji ograniczonej poprzez MAXVALUE wydaje się jak najbardziej wskazane.

Partycje z lista wartości

W partycjach z lista wartości zamiast na przedziałach klucz partycji zakłada się na konkretnych wartościach kolumn.

Przykład:


CREATE TABLE tab2 (
id_group NUMBER(10),
name VARCHAR(100))

PARTITION BY LIST (id_group) (
PARTITION pgroup1 VALUES (1,2,3),
PARTITION pgroup2 VALUES (4,5,6),
PARTITION pgroup3 VALUES (7,8,9)
);

Warto tu zauważyć iż w tym wypadku nie mamy możliwości użycia klauzuli MAXVALUE, dlatego należy w partycjach umieścić wszystkie możliwe wartości znajdujące się w kolumnie będącej kluczem partycji.

Partycje z kluczem haszowym

Partycje takie używają specjalnej funkcji haszujacej do określenia w której partycji znajdzie się konkretny rekord. Stosuje się ja dla bardzo dużych tabel, gdzie nie ma żadnych reguł umożliwiających wykorzystanie poprzednich dwóch sposobów, ale ze względu na swoja wielkość mamy pewność, że taka partycja poprawi wydajność. W tego rodzaju partycjach podajemy tylko ilość i nazwy partycji, a system sam zadba o odpowiednie rozłożenie rekordów pomiędzy tymi partycjami.

Przykład:


CREATE TABLE tab2 (
id_group NUMBER(10),
name VARCHAR(100))

PARTITION BY HASH (id_group)
PARTITIONS 4
STORE IN (p1, p2, p3, p4);

W powyższym przykładzie tabele dzielimy na 4 partycje p1, p2, p3 oraz p4.

Partycje złożone

Partycje złożone polegają na podziale tabeli na 2 kryteria. Najpierw tabele można podzielić zakresowo i dodatkowo te partycje można wewnętrznie podzielić wg klucza haszowego.

Przykład:


CREATE TABLE tab2 (
id_group NUMBER(10),
name VARCHAR(100))

PARTITION BY RANGE(id_group)
SUBPARTITION BY HASH(name)
SUBPARTITIONS 4 (
PARTITION january2003 VALUES LESS THEN (TO_DATE('02/01/2003',
'MM/DD/YYYY'))(
SUBPARTITION january2003_1 TABLESPACE tspace1,
SUBPARTITION january2003_2 TABLESPACE tspace2,
SUBPARTITION january2003_3 TABLESPACE tspace3,
SUBPARTITION january2003_4 TABLESPACE tspace4),
PARTITION february2003 VALUES LESS THEN (TO_DATE('03/01/2003',
'MM/DD/YYYY'))(
SUBPARTITION february2003_1 TABLESPACE tspace1,
SUBPARTITION february2003_2 TABLESPACE tspace2,
SUBPARTITION february2003_3 TABLESPACE tspace3,
SUBPARTITION february2003_4 TABLESPACE tspace4),
...
PARTITION maxvalue VALUES LESS THEN (MAXVALUE));

powrót
Zachęcam do przedstawienia swoich uwag i opinii w polu komentarzy.

Komentarze

Dodaj Komentarz