Mnogomernoe partiționare (partiție) de date Oracle

Una dintre cele mai puternice opțiuni Oracle este abilitatea de a împărți datele din tabel (pentru partiționare), care poate crește în mod semnificativ performanța bazei de date și de a construi o structură mai optimă și frumos logică și fizică a tabelelor și indexurile. În acest caz, Oracle are o limitare semnificativă. Puteți crea doar două nivele de partiționare (partiție - subpartitia). Uneori, acest lucru nu este suficient, și aș dori să creeze o mai bună partiționare a datelor, de exemplu, 3 nivele, 4 sau mai mult.
O să-ți arăt un exemplu concret cât de ușor este de a obține în jurul valorii de acest lucru. Această abordare vă permite să creați orice număr de partiționare imbricate, limitat doar de imaginația noastră. fezabilitatea și limitările Oracle.

DECLARAȚIE PROBLEMEI.
Există un proces de replicare a datelor de la mai multe baze de date simultan într-una, datele trebuie să fie păstrate pentru zilele săptămânii și împărțit pentru utilizare ulterioară de timp. Cantitatea de date în termen de o zi poate ajunge la mai mult de 25 de miliarde. Șiruri, deoarece pentru prelucrarea ulterioară, este de dorit să se separe în momentul sosirii în tabel. Această problemă este reală. În general vorbind, sistemul ar trebui să sprijine pe podea de tranzacționare la bursă pe o bază 24/7. Volumul imens este o consecință a comerțului electronic. și anume păstrarea citate de tranzacționare (ghilimelele Trading) pe tot parcursul zilei. astfel limba Oracle, avem:

TRD_DB_ID -> 1, ..., 30 - baza de date cu ID de la care există o replicare. astfel de baze de date. în acest exemplu, 30
DAY_OF_WEEK_ID -> 1. 5 - zi a săptămânii ID
TIME_SLICE_ID -> 1, ..., 48 - ID perioadă. Toate orele sunt împărțite în intervale de jumătate de oră.

Ideea Fondat este de a împărtăși cantitățile imense de date în părți independente, pentru a permite replicate paralele (TRD_DB_ID), folosit din nou în DATEWARHOUSE paralel și pomparea independent de date (TIME_SLICE_ID) și capacitatea de a sprijini comerțul pe tot parcursul zilei și pe tot parcursul săptămânii. comoditate această diviziune extraordinară constă în faptul. puteți face o repornire a oricărei pompe de proces independent de ceilalți și de a efectua comanda TRUNCATE în mod independent și, dacă este necesar, în paralel, pentru mai multe partiții simultan, ceea ce va reduce semnificativ timpul de pregătire a bazei de date pentru o utilizare ulterioară.
Există o problemă. Este necesar la nivelul 3 partiționarea datelor. Oracle permite doar 2. Dacă te uiți la modul în care Oracle creează o tabelă de partiții cu subpartitia, la nivel fizic și logic, este ușor de văzut că fiecare subpartitia nu este nimic altceva, ca o entitate separată. Iar ideea de bază de a lucra cu un astfel de obiect este. că dezvoltatorul nu cred despre modul în care subpartitia / partiție funcționează. Pentru a face acest lucru, este suficient să se indice în
SELECT .... DE LA ...
UNDE
Valoarea de subpartitia / chei de pereți despărțitori și Oracle va funcționa automat numai cu subpartitia / partiție și nu va utiliza tabelul de scanare completă (FULL SCAN TABLE). Este evident că scanarea de 25 de miliarde. Cozilor nu sunt de fapt, în principiu, dacă spunem un astfel de tabel, utilizați aplicație care funcționează în timp real.

DECIZIE
Vom folosi aceeași idee că, și Oracle. Lista va crea o partiție, în cazul în care baza pentru cheia va fi valoarea combinată a celor trei variabile independente. să ne spunem
PART_22340 - va însemna că în partiția vom stoca datele pentru a 2-a zi a săptămânii, de la baza de date # 23. pentru perioada 40-a zi (19:30 - 20:00). Este evident că este necesar să se creeze un N = 30 * 5 * 48 = 7200 partiții.

CREATE TABLE SQH_AF
(C_1,
... ..
C_N,
PART_KEY INTEGER (10)
)
partiție de lista (part_key)
(
Valori partiție PART_10101 (10101)
Valori partiție PART_10102 (10102)
Valori partiție PART_10103 (01013)
... ..
PART_53047values ​​divizare (53047)
Valori partiție PART_53048 (53048)
);

Apoi creați tabelul auxiliar
CREATE TABLE AF_REF
(
PART_KEY INTEGER (10)
DAY_OF_WEEK_ID INTEGER (1),
TRD_DB_ID INTEGER (2)
TIME_SLICE_ID INTEGER (2)
)
;
CREATE INDEX UNIQUE AF_REF_U1 PE AF_REF
(. DAY_OF_WEEK_ID TRD_DB_ID TIME_SLICE_ID.);
;
Care este completat în modul evident
************************************************** ***
************************************************** ******************************
Și construit în continuare VIEW
a crea sau înlocui vizualizare SQH_AF_V
ca
selecta
a.C_1,
a.C_2,
...
a.C_N,
b.PART_KEY, b.DAY_OF_WEEK_ID, b. TRD_DB_ID, b.TIME_SLICE_ID

din SQH_AF a, AF_ref b
unde
a.part_key = b.part_key;

Este clar că INSERT rezonabil produc, cunoscând pre-valorile tuturor variabilelor pentru a determina PART_KEY. Dar SELECT, folosind SQH_AF_V.
Mai jos este un plan EXPLICAȚI pentru a arăta. că Oracle va lucra cu o anumită partiție, mai degrabă decât un tabel întreg

selectați * de la SQH_AF_V
unde
TRD_DB_ID = 1
și
TIME_SLICE_ID = 4
și
DAY_OF_WEEK_ID = 1;


plan
SELECT Cost DECLARAȚIE ALL_ROWS: 1 Biți: 216 Cardinalitate: 4
5 Bucle imbricate Cost: 1 Biți: 216 Cardinalitate: 4
2 ACCES TABEL DE INDEX ROWID TABEL DBA_ADMIN.AF_REF Cost: 1 Bytes: 46 Cardinalitate: 1
1 INDEX UNIQUE SCAN INDEX (EXCLUSIV) DBA_ADMIN.AF_REF_U1 Cost: 0 Cardinalitate: 1
4 PARTITION LISTA iterator Cost: 0 Bytes: 32 Cardinalitate: 4 partiție #: 4 partiții determinate de valorile cheie
3 TABELUL DE ACCES FULL TABEL DBA_ADMIN.SQH_AF Cost: 0 Bytes: 32 Cardinalitate: 4 Partiția #: 4 Partițiile determinate de Valori cheie

Un mic adaos. Dacă utilizați Oracle 11g și virtuale boxe, puteți construi un tabel

CREATE TABLE SQH_AF
(C_1,
... ..
C_N,
TRD_DB_ID INTEGER (2)
DAY_OF_WEEK_ID INTEGER (1),
TIME_SLICE_ID INTEGER (2)
PART_KEY AS DAY_OF_WEEK_ID * 10000 + TRD_DB_ID * 100 + TIME_SLICE_ID
)
partiție de lista (part_key)
(
Valori partiție PART_10101 (10101)
Valori partiție PART_10102 (10102)
Valori partiție PART_10103 (01013)
... ..
PART_53047values ​​divizare (53047)
Valori partiție PART_53048 (53048)
);
În acest caz, aveți posibilitatea să inserați o coloană într-un tabel imediat și Oracle va determina automat partiția.