Sunteți pe pagina 1din 18

Tabele partitionate in Oracle

Obiective :
conceptul de tabela partitionata
avantajele partitionarii datelor
tipuri de partitionare
indexi partitionati
gestiunea partitiilor
1. Tabele partitionate.
Tehnica de partitionare permite divizarea datelor intr-o tabela in portiuni mai mici, unde fiecare
portiune de date se numeste partitie. Fiecare partitie are nume propriu si, optional, poate avea
caracteristici de stocare proprii. De asemenea, fiecare partitie poate fi la randul sau impartita in
subpartitii. De asemenea, indexii pot fi partitionati in mod asemanator. Fiecare partitie este stocata in
segmentul propriu si poate fi gestionata in mod individual. O partitie poate functiona in mod
independent de alte partitii, furnizand astfel o structura ce poate fi optimizata pentru disponibilitate si
performanta.
Din punctul de vedere al unui administrator de baze date, o tabela partitionata are mai multe
componente (partitii) care pot fi gestionate individual sau colectiv. Din punctul de vedere al aplicatiei,
o tabela partitionata este identica cu o tabela ne-partitionata, astfel incat nu sunt necesare modificari ale
instructiunilor SQL de interogare sau modificare (DML).
In figura urmatoare se observa diferentele intre o tabela normala si o tabela partitionata:

Fig.1: Comparatie intre tabela normala si tabela partitionata.

Fiecare linie (rand) intr-o tabela partitionata este asignata in mod univoc unei singure partitii.
Cheia de partitionare (Partitioning Key) este compusa din una sau mai multe coloane care
determina in ce partitie se va stoca fiecare linie a tabelei. Serverul Oracle efectueaza in mod automat
operatiile DML pentru fiecare partitie in functie de cheia de partitionare.
Orice tabela poate fi partitionata cu exceptia celor care au coloane de tipul LONG sau LONG
RAW. Se pot partitiona tabele avand coloane de tipul CLOB or BLOB.
Cand se partitioneaza o tabela:
-

cand tabela este mai mare de 2GB

cand tabela contine date istorice, astfel incat datele noi sa fie adaugate in partitii noi

cand continutul tabelei trebuie sa fie distribuit pe diferite spatii de stocare

Cand se partitioneaza un index:


pentru a evita reconstruirea indexului cand sunt sterse date din tabela
se actualizeaza cantitati de date fara a fi necesara invalidarea intregului index
2. Avantajele partitionarii
Tehnica partitionarii poate furniza beneficii majore prin imbunatatirea performantei
interogarilor, gestionarii datelor si disponibilitatii acestora. Partitionarea este un instrument cheie
pentru construirea sistemelor multi-terabyte sau sistemelor cu cerinte de disponibilitate ridicate.
2.1. Imbunatatirea performantei
Se poate imbunatati performanta operatiilor cu tabelele partitionate prin limitarea volumului de
date citit sau operat si prin distribuirea datelor pentru executii paralele.
a) Reducerea partitiilor (partition pruning)
Se poate reduce substantial timpul unei interogari prin tehnica numita reducerea partitiilor
(partition pruning), in special cand se gestioneaza date istorice. De exemplu, in tabela Orders sunt
stocate comnenzile unui depozit din domeniul comercial. Astfel, presupunem ca depozitul gestioneaza
intre 100 si 200 de comenzi zilnice, impreuna cu detaliile corespunzatoare. Daca tabela Orders este
partitionata pe luni calendaristice si este stocata activitatea a 4 ani, atunci inseamna ca exista 48 de
partitii. Astfel, o interogare ce analizeaza comenzile dintr-o anumita luna calendaristica va citi datele
dintr-o singura partitie si nu din cele 48 de partitii totale. Astfel, teoretic, acea interogare se poate
executa de 48 de ori mai repede decat una care sa citeasca toate datele. In mod suplimentar, interogarea
poate utiliza, pe langa reducerea partitiilor si celalte tehnici de optimizare: indexare, join, acces paralel.
b) Partition-Wise Joins
O alta tehnica de optimizarea performantelor inteorgarilor pentru tabele partitionate si
relationate se numeste partition-wise join. Aceasta tehnica se poate aplica atunci cand doua tabele
sunt corelate printr-un join si ambele tabele sunt partitionate dupa cheia de join sau cand o tabela
partitionata referita este corelata cu tabelul parinte. Aceasta tehnica sparge un join mai mare in joinuri mai mici care apar pentru fiecare partitie.
2

2.2. Imbunatatirea gestiunii (manageability)


Partitionarea permite tabelelor si indexilor sa fie impartite in grupuri mai mici, care pot fi
gestionate mai usor de administratorii de baze date (tehnica "divide and conquer" ). Astfel, un DBA
poate salva o copie de siguranta pentru o singura partitie in loc de intregul tabel. Un alt avantaj este
atunci cand, de exemplu, se adauga date noi intr-o tabela istorica partitionata. Astfel, aceste date noi se
pot adauga intr-o partitie noua, iar operatiile si structurile pentru celelalte partitii raman neschimbate.
2.3.Imbunatatirea disponibilitatii (availability)
De exemplu, daca avem o tabela partitionata pe mai multe medii de stocare (tablespace-uri
diferite), iar o partitie devine inaccesibila, se pot executa operatii in continuare pe celelalte partitii,
chiar daca exista doar un singur tabel la nivel logic. In acest timp, DBA poate restaura datele de pe un
backup pentru partitia defecta, fara a afecta operatiile curente in desfasurare.
3. Tehnici de partitionare:
Serverul Oracle furnizeaza 3 metode de partitionare a unei tabele:
- partitionare de tip lista (List Partitioning)
- partitionare de tip interval (Range Partitioning)
partitionare de tip hash (Hash Partitioning)

Fig.2: Metode de partitionare in Oracle


Astfel, o tabela poate fi partitionata conform uneia dintre aceste metode (single level
partitioning) sau combinand doua dintre aceste metode (composite partitioning).

3.1. Partitionarea dupa interval (range partitioning)


Datele intr-o tabela partitionata dupa interval sunt stocate in partitiile definite conform valorilor
cheii de partitionare. Cel mai folosit criteriu pentru cheia de partitionare este data calendaristica
(coloanele de tip date). Fiecare partitie are o clauza de tipul VALUE LESS THAN, clauza care
specifica limita superioara (ne-inclusiva) a valorii cheii de partitionare pentru acea partitie. Toate
partitiile, exceptand pe prima au ca limita inferioara valoarea maxima a cheii de partitionare pentru
partitia anterioara. O valoarea maxima (MAXVALUE) poate fi definita pentru cea mai mare partitie,
valoare care poate fi oricat de mare. In aceasta partitie se vor stoca si liniile care au valoarea NULL
pentru cheia de partitionare.
Exemplu:
create table sales_range (year number(4),
product_id number,
amount number(10,2)
)
partition by range (year)
( partition p1 values less than (2010) ,
partition p2 values less than (2011) ,
partition p3 values less than (2012) ,
partition p4 values less than (2013) ,
partition p5 values less than (MAXVALUE)
);

3.2. Partitionarea hash (Hash Partitioning)


Prin partitionarea hash, datele din tabel sunt impartite conform unui algoritm de hash pe care
serverul Oracle il aplica valorilor din cheia de partitionare, cheie definita la crearea tabelei. Algoritmul
de hash distribuie in mod uniform liniile tabelului intre partitii, astfel incat partitiile sa aiba aproximativ
aceeasi marime.
Partitionarea hash este ideala pentru a distribuie in mod uniform datele pe diverse spatii de
stocare. Se recomanda a se aplica atunci cand datele nu sunt istorice sau nu au o cheie evidenta de
partitionare.
CREATE TABLE products_hash
(product_id NUMBER,
description VARCHAR2 (60))
PARTITION BY HASH (product_id)
PARTITIONS 4 ;

3.3 Partitionarea lista (List Partitioning)


Acest tip de partitionare permite controlul explicit al modului in care randurile din tabel sunt
alocate partitiilor, prin specificarea liste de valori pentru cheia de partitionare din descrierea fiecarei
partitii. Avantajul partitionarii de tip lista este ca se poate grupa si organiza in mod natural seturi de
date neordonate si nerelationate.
4

De exemplu, pentru o tabela avand coloana region ca si cheie de partitionare, partitita North
America poate contine valorile Canada, USA, si Mexico.
Partitia DEFAULT permite stocarea tuturor liniilor ale caror valori ale cheilor de partitionare nu
se incadreaza in lista de valori specificata la crearea tabelei partitionate. Astfel, liniile care nu se
mapeaza la o partitie din lista de valori specificata se pot totusi insera in tabela, in aceasta partitie
DEFAULT.
CREATE TABLE clients_list(client_id NUMBER
,name VARCHAR2(50)
,country VARCHAR2(2))
PARTITION BY LIST(country)
(PARTITION clients_benelux VALUES ('BE','NE','LU')
,PARTITION clients_uk
VALUES ('UK')
,PARTITION clients_other
VALUES (DEFAULT));

4. Tehnici de partitionare compusa (Composite partitioning)


Partitionarea compusa este o combinatie a metodelor de partitionare de baza: range, hash, list. O
tabela poate fi partitionata printr-o metoda de baza, iar fiecare partitie poate fi subdivizata mai departe
in subpartitii, folosind o a doua metoda de partitionare. Toate subpartitiile unei partitii date reprezinta
un subset logic al datelor.

Fig.3: Metode de partitionare compuse in Oracle


In Oracle exista urmatoarele metode de partitionare compuse:
-

Composite Range-Range Partitioning: permite partitionarea pe interval dupa doua dimensiuni,


de exemplu partitionare dupa coloana order_date si apoi sub-partitionare dupa coloana
shipping_date.

CREATE TABLE shipments_range_range


( order_id

NUMBER NOT NULL

, order_date

DATE NOT NULL

, delivery_date DATE NOT NULL


, customer_id

NUMBER NOT NULL

, sales_amount

NUMBER NOT NULL

PARTITION BY RANGE (order_date)


SUBPARTITION BY RANGE (delivery_date)
( PARTITION p_2006_jul VALUES LESS THAN (TO_DATE('01-AUG-2006','dd-MON-yyyy'))
( SUBPARTITION p06_jul_e VALUES LESS THAN (TO_DATE('15-AUG-2006','dd-MON-yyyy'))
, SUBPARTITION p06_jul_a VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy'))
, SUBPARTITION p06_jul_l VALUES LESS THAN (MAXVALUE)
)
, PARTITION p_2006_aug VALUES LESS THAN (TO_DATE('01-SEP-2006','dd-MON-yyyy'))
( SUBPARTITION p06_aug_e VALUES LESS THAN (TO_DATE('15-SEP-2006','dd-MON-yyyy'))
, SUBPARTITION p06_aug_a VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))
, SUBPARTITION p06_aug_l VALUES LESS THAN (MAXVALUE)
)
, PARTITION p_2006_sep VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))
( SUBPARTITION p06_sep_e VALUES LESS THAN (TO_DATE('15-OCT-2006','dd-MON-yyyy'))
, SUBPARTITION p06_sep_a VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy'))
, SUBPARTITION p06_sep_l VALUES LESS THAN (MAXVALUE)
)
, PARTITION p_2006_oct VALUES LESS THAN (TO_DATE('01-NOV-2006','dd-MON-yyyy'))
( SUBPARTITION p06_oct_e VALUES LESS THAN (TO_DATE('15-NOV-2006','dd-MON-yyyy'))
, SUBPARTITION p06_oct_a VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy'))
, SUBPARTITION p06_oct_l VALUES LESS THAN (MAXVALUE)
)
, PARTITION p_2006_nov VALUES LESS THAN (TO_DATE('01-DEC-2006','dd-MON-yyyy'))
( SUBPARTITION p06_nov_e VALUES LESS THAN (TO_DATE('15-DEC-2006','dd-MON-yyyy'))
, SUBPARTITION p06_nov_a VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
, SUBPARTITION p06_nov_l VALUES LESS THAN (MAXVALUE)
)
, PARTITION p_2006_dec VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
( SUBPARTITION p06_dec_e VALUES LESS THAN (TO_DATE('15-JAN-2007','dd-MON-yyyy'))
, SUBPARTITION p06_dec_a VALUES LESS THAN (TO_DATE('01-FEB-2007','dd-MON-yyyy'))
, SUBPARTITION p06_dec_l VALUES LESS THAN (MAXVALUE)
)
);

Composite Range-Hash Partitioning: partitionare dupa interval si apoi subpartitionare folosind


algortim hash.

CREATE TABLE sales_range_hash


( prod_id

NUMBER(6)

, cust_id

NUMBER

, time_id

DATE

, channel_id

CHAR(1)

, promo_id

NUMBER(6)

, quantity_sold NUMBER(3)
, amount_sold

NUMBER(10,2)

)
PARTITION BY RANGE (time_id) SUBPARTITION BY HASH (cust_id)
SUBPARTITIONS 8
(PARTITION sales_q1_2006 VALUES LESS THAN (TO_DATE('01-APR-2006','dd-MON-yyyy'))
, PARTITION sales_q2_2006 VALUES LESS THAN (TO_DATE('01-JUL-2006','dd-MON-yyyy'))
, PARTITION sales_q3_2006 VALUES LESS THAN (TO_DATE('01-OCT-2006','dd-MON-yyyy'))
, PARTITION sales_q4_2006 VALUES LESS THAN (TO_DATE('01-JAN-2007','dd-MON-yyyy'))
);

Composite Range-List Partitioning: partitionarea datelor pe interval si apoi, pentru fiecare


partitie, subpartitionare dupa lista.

CREATE TABLE regional_sales_range_list


(deptno number, item_no varchar2(20),
txn_date date, txn_amount number, state varchar2(2))
PARTITION BY RANGE (txn_date)
SUBPARTITION BY LIST (state)
(PARTITION q1_1999 VALUES LESS THAN (TO_DATE('1-APR-1999','DD-MON-YYYY'))
(SUBPARTITION q1_1999_northwest VALUES ('OR', 'WA'),
SUBPARTITION q1_1999_southwest VALUES ('AZ', 'UT', 'NM'),
SUBPARTITION q1_1999_northeast VALUES ('NY', 'VM', 'NJ'),
SUBPARTITION q1_1999_southeast VALUES ('FL', 'GA'),
SUBPARTITION q1_1999_northcentral VALUES ('SD', 'WI'),
SUBPARTITION q1_1999_southcentral VALUES ('OK', 'TX')
),
PARTITION q2_1999 VALUES LESS THAN ( TO_DATE('1-JUL-1999','DD-MON-YYYY'))
(SUBPARTITION q2_1999_northwest VALUES ('OR', 'WA'),
SUBPARTITION q2_1999_southwest VALUES ('AZ', 'UT', 'NM'),
SUBPARTITION q2_1999_northeast VALUES ('NY', 'VM', 'NJ'),
SUBPARTITION q2_1999_southeast VALUES ('FL', 'GA'),
SUBPARTITION q2_1999_northcentral VALUES ('SD', 'WI'),
SUBPARTITION q2_1999_southcentral VALUES ('OK', 'TX')
),
PARTITION q3_1999 VALUES LESS THAN (TO_DATE('1-OCT-1999','DD-MON-YYYY'))
(SUBPARTITION q3_1999_northwest VALUES ('OR', 'WA'),
SUBPARTITION q3_1999_southwest VALUES ('AZ', 'UT', 'NM'),
SUBPARTITION q3_1999_northeast VALUES ('NY', 'VM', 'NJ'),
SUBPARTITION q3_1999_southeast VALUES ('FL', 'GA'),
SUBPARTITION q3_1999_northcentral VALUES ('SD', 'WI'),
SUBPARTITION q3_1999_southcentral VALUES ('OK', 'TX')
),

PARTITION q4_1999 VALUES LESS THAN ( TO_DATE('1-JAN-2000','DD-MON-YYYY'))


(SUBPARTITION q4_1999_northwest VALUES ('OR', 'WA'),
SUBPARTITION q4_1999_southwest VALUES ('AZ', 'UT', 'NM'),
SUBPARTITION q4_1999_northeast VALUES ('NY', 'VM', 'NJ'),
SUBPARTITION q4_1999_southeast VALUES ('FL', 'GA'),
SUBPARTITION q4_1999_northcentral VALUES ('SD', 'WI'),
SUBPARTITION q4_1999_southcentral VALUES ('OK', 'TX')
)
);

Composite List-Range Partitioning: partitionare dupa lista de valori si subpartitionare dupa


interval; de exemplu, partitionare dupa coloana country_id si subpartitionare dupa coloana
order_date.

Composite List-Hash Partitioning: permite subpartitionarea hash subpartitioning a unor partitii


dupa lista de valori.
CREATE TABLE clients_list_hash (client_id NUMBER
,name

VARCHAR2(50)

,country

VARCHAR2(2)

)
PARTITION BY LIST(country) SUBPARTITION BY HASH(name)

SUBPARTITIONS 5

(PARTITION clients_benelux VALUES ('BE','NE','LU')


,PARTITION clients_uk

VALUES ('UK')

,PARTITION clients_other

VALUES (DEFAULT)

);

Composite List-List Partitioning: permite partitionarea dupa lista de valori pentru doua
dimensiuni; de exemplu, partitionare dupa coloana country_id si subpartitionare dupa
coloana sales_channel.
CREATE TABLE accounts
( id
NUMBER
, account_number NUMBER
, customer_id
NUMBER
, balance
NUMBER
, branch_id
NUMBER
, region
VARCHAR(2)
, status
VARCHAR2(1)
)
PARTITION BY LIST (region)
SUBPARTITION BY LIST (status)
( PARTITION p_northwest VALUES ('OR', 'WA')
( SUBPARTITION p_nw_bad VALUES ('B')
, SUBPARTITION p_nw_average VALUES ('A')
, SUBPARTITION p_nw_good VALUES ('G')
)
, PARTITION p_southwest VALUES ('AZ', 'UT', 'NM')
( SUBPARTITION p_sw_bad VALUES ('B')
, SUBPARTITION p_sw_average VALUES ('A')
, SUBPARTITION p_sw_good VALUES ('G')

)
, PARTITION p_northeast VALUES ('NY', 'VM', 'NJ')
( SUBPARTITION p_ne_bad VALUES ('B')
, SUBPARTITION p_ne_average VALUES ('A')
, SUBPARTITION p_ne_good VALUES ('G')
)
, PARTITION p_southeast VALUES ('FL', 'GA')
( SUBPARTITION p_se_bad VALUES ('B')
, SUBPARTITION p_se_average VALUES ('A')
, SUBPARTITION p_se_good VALUES ('G')
)
, PARTITION p_northcentral VALUES ('SD', 'WI')
( SUBPARTITION p_nc_bad VALUES ('B')
, SUBPARTITION p_nc_average VALUES ('A')
, SUBPARTITION p_nc_good VALUES ('G')
)
, PARTITION p_southcentral VALUES ('OK', 'TX')
( SUBPARTITION p_sc_bad VALUES ('B')
, SUBPARTITION p_sc_average VALUES ('A')
, SUBPARTITION p_sc_good VALUES ('G')
)
);

5. Partitionarea de tip referinta (Reference Partitioning)


Partitionarea de tip referinta permite partitionarea a doua tabele relationate intre ele prin
constrangea de tip Foreign Key. Cheia de partitionare este rezolvata prin existenta unei relatii de tip
parinte-copil, implementata prin constrageri Foreign Key - Primary Key. Avantajul acestui tip de
partitionare pentru tabelele parent-child este ca pot fi partitionate logic prin mostenirea cheii de
partitionare din tabelul parinte, fara duplicarea coloanelor cheie.
De exemplu se dau doua tabele Orders si OrderItems relationate prin constrangerea de
referinta refconstraint. Astfel, coloana OrderItems.OrderID refera Orders.OrderID.
Tabela Orders este partitionata dupa interval pe coloana OrderDate. Partitionarea referinta dupa
orderid_refconstraint pentru tabela OrderItems duce la partitionarea acesteia conform
partitionarii tabelei parinte Orders, ca in figura urmatoare:

Fig.4: Partitionarea referinta in Oracle inainte de partitionare

Fig.5: Partitionarea referinta in Oracle dupa partitionare

10

Exemplu partitionare de tip referinta:


CREATE TABLE orders_p
( order_id

NUMBER(12),

order_date

DATE,

order_mode

VARCHAR2(8),

customer_id

NUMBER(6),

order_status

NUMBER(2),

order_total

NUMBER(8,2),

sales_rep_id

NUMBER(6),

promotion_id

NUMBER(6),

CONSTRAINT orders_pk PRIMARY KEY(order_id)


)
PARTITION BY RANGE(order_date)
( PARTITION Q1_2005 VALUES LESS THAN (TO_DATE('01-APR-2005','DD-MON-YYYY')),
PARTITION Q2_2005 VALUES LESS THAN (TO_DATE('01-JUL-2005','DD-MON-YYYY')),
PARTITION Q3_2005 VALUES LESS THAN (TO_DATE('01-OCT-2005','DD-MON-YYYY')),
PARTITION Q4_2005 VALUES LESS THAN (TO_DATE('01-JAN-2006','DD-MON-YYYY'))
);
CREATE TABLE orderItems_c
( order_id

NUMBER(12) NOT NULL,

line_item_id

NUMBER(3)

NOT NULL,

product_id

NUMBER(6)

NOT NULL,

unit_price

NUMBER(8,2),

quantity

NUMBER(8),

CONSTRAINT order_items_fk
FOREIGN KEY(order_id) REFERENCES orders_p(order_id)
)
PARTITION BY REFERENCE(order_items_fk);

6. Indexi partitionati
Indexii partitionati pot fi de 2 tipuri:
1. indexi partitionati global
2. indexi partitionati local (legati direct de partitiile tabelelor)

Pentru a decide tipul de index partitionat necesar, se urmaresc pasii:


11

a) daca tabela este partionata dupa o coloana care este un subset al cheii de indexare, atunci se foloseste
un index partitionat local; daca nu se trece la pasul b);
b) daca indexul este unic si nu include coloane ale cheii de partitionare atunci se foloseste un index
partitionat global; daca nu se trece la pasul c);
c) daca prioritara este gestiunea datelor atunci se foloseste un index partitionat local; daca nu se trece la
pasul d);
d) daca aplicatia este una tranzactionala (OLTP) si utilizatorii au nevoie de timp de raspuns rapid,
atunci se foloseste un index partitionat global; daca aplicatia este analitica (DSS) atunci se foloseste un
index partitionat local;
Indexii partitionati:
- Local toate intrarile indexului pe o singura partitie corespund unei singure partitii a tabelei;
acest tip de index este creat avand cuvantul cheie LOCAL si suporta independenta partitiilor.
- Global indexul dintr-o partitie poate corespunde si celorlalte partitii din tabela; acestia sunt
creati avand cuvantul cheie GLOBAL si nu suporta independenta partitiilor.
Ambele tipuri de indexi pot fi divizati in 2 categorii:
- Prefixati (Prefixed) - Cheia de partitionare reprezinta coloanele cele mai din stanga ale
indexului; astfel, la o interogare daca in clauza WHERE se mentioneaza cheia de partitionare
atunci se foloseste tehnica partition pruning si nu toate partitiile sunt cautate;
- Ne-prefixati (Non-Prefixed) - Nu suporta tehnica partition pruning, dar acceseaza eficient
datele stocate in diverse partitii; de obicei, se foloseste cand cheia de indexare nu corespunde cu
cheia de partitionare a tabelei, si dorim ca indexul sa fie partitionat dupa aceeasi cheie ca si tabela
corespunzatoare.
Presupunem o tabela INVOICES (invoice_no, invoice_date, client_id, amount), care este
partitionata pe interval dupa coloana INVOICE_DATE.
Exemplu de index local prefixat:
CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL;
CREATE INDEX invoices_idx ON invoices (invoice_date) LOCAL
(PARTITION invoices_q1 TABLESPACE users,
PARTITION invoices_q2 TABLESPACE users,
PARTITION invoices_q3 TABLESPACE users,
PARTITION invoices_q4 TABLESPACE users);

Exemplu de index local ne-prefixat:


CREATE INDEX invoices_idx ON invoices (invoice_no) LOCAL
(PARTITION invoices_q1 TABLESPACE users,
PARTITION invoices_q2 TABLESPACE users,
PARTITION invoices_q3 TABLESPACE users,
PARTITION invoices_q4 TABLESPACE users);

12

Exemplu de index global prefixat:


CREATE INDEX invoices_idx ON invoices (invoice_date)
GLOBAL PARTITION BY RANGE (invoice_date)
(PARTITION invoices_q1 VALUES LESS THAN (TO_DATE('01/04/2001', 'DD/MM/YYYY'))
TABLESPACE users,
PARTITION invoices_q2 VALUES LESS THAN (TO_DATE('01/07/2001', 'DD/MM/YYYY'))
TABLESPACE users,
PARTITION invoices_q3 VALUES LESS THAN (TO_DATE('01/09/2001', 'DD/MM/YYYY'))
TABLESPACE users,
PARTITION invoices_q4 VALUES LESS THAN (MAXVALUE) TABLESPACE users);

Cuvantul cheie GLOBAL inseamna ca Oracle nu poate presupune ca cele doua chei de partitionare
(tabela si index) sunt identice.
Nu exista indexi globali neprefixati.
7. Gestionarea partitiilor

Exista o serie de operatii care pot fi executate asupra unei tabele partitionate:
Adaugare partitii (adding partitions)
Stergerea partitiilor (dropping partitions)
Unirea partitiilor (coalescing patitions, merging partitions)
Divizarea, shimbarea, redenumirea partitiilor (splitting, exchanging, renaming partitions)
Modificarea atributelor

7.1. Adaugarea partitiilor


Pentru adaugarea unei partitii la partea superioara a tabelei (corespunzatoare cheii de
partitionare) se foloseste clauza ADD PARTITION a instructiunii ALTER TABLE:
ALTER TABLE ... ADD PARTITION.

Pentru a adauga o partitie in interiorul tabelei partitionate se foloseste clauza SPLIT PARTITION.
-partitionare range
ALTER TABLE sales
ADD PARTITION jan96 VALUES LESS THAN ( '01-FEB-1999' )
TABLESPACE example;

- partitionare hash
ALTER TABLE scubagear
ADD PARTITION p_named TABLESPACE example;

- partitionare lista
ALTER TABLE q1_sales_by_region
ADD PARTITION q1_nonmainland VALUES ('HI', 'PR');

- partitionare range-hash
ALTER TABLE sales ADD PARTITION q1_2000
VALUES LESS THAN (2000, 04, 01)
SUBPARTITIONS 8 STORE IN example;

- adaugare partitie la tabela partitionata range-list


ALTER TABLE quarterly_regional_sales
ADD PARTITION q1_2000 VALUES LESS THAN (TO_DATE('1-APR-2000','DD-MON-YYYY'))
STORAGE (INITIAL 20K NEXT 20K) TABLESPACE example NOLOGGING
(
SUBPARTITION q1_2000_northwest VALUES ('OR', 'WA'),
SUBPARTITION q1_2000_southwest VALUES ('AZ', 'UT', 'NM'),

13

SUBPARTITION
SUBPARTITION
SUBPARTITION
SUBPARTITION
);

q1_2000_northeast VALUES ('NY', 'VM', 'NJ'),


q1_2000_southeast VALUES ('FL', 'GA'),
q1_2000_northcentral VALUES ('SD', 'WI'),
q1_2000_southcentral VALUES ('OK', 'TX')

- adaugare subpartitie la o tabela partitionata range-list


ALTER TABLE quarterly_regional_sales
MODIFY PARTITION q1_1999
ADD SUBPARTITION q1_1999_south
VALUES ('AR','MS','AL') tablespace example;

7.2. Stergerea partitiilor


Pentru stergerea partitiilor se folosesc urmatoarele instructiuni:
ALTER TABLE ... DROP PARTITION

pentru a sterge partitia unei tabele

ALTER TABLE ... DROP SUBPARTITION

pentru a sterge o subpartitie

Exemple:
ALTER TABLE sales DROP PARTITION dec98;
ALTER INDEX sales_area_ix REBUILD;

DELETE FROM sales WHERE TRANSID < 10000;


ALTER TABLE sales DROP PARTITION dec98;

ALTER TABLE sales DROP PARTITION dec98


UPDATE GLOBAL INDEXES;

ALTER TABLE sales


DISABLE CONSTRAINT dname_sales1;
ALTER TABLE sales DROP PARTITTION dec98;
ALTER TABLE sales
ENABLE CONSTRAINT dname_sales1;

7.3. Unirea partitiilor


Exista doua clauze pentru unirea partitiilor in functie de tipul de partitionare al tabelei, astfel:
a) Clauza Coleascing care se aplica partitionarii hash:
ALTER TABLE ... COALESCE PARTITION
ALTER TABLE diving MODIFY PARTITION us_locations
COALESCE SUBPARTITION;

b) Clauza Merging care se aplica partitionarii range si list.

14

CREATE TABLE four_seasons


(
one DATE,
two VARCHAR2(60),
three NUMBER
)
PARTITION BY RANGE ( one )
(
PARTITION quarter_one
VALUES LESS THAN ( TO_DATE('01-apr-1998','dd-mon-yyyy'))
TABLESPACE quarter_one,
PARTITION quarter_two
VALUES LESS THAN ( TO_DATE('01-jul-1998','dd-mon-yyyy'))
TABLESPACE quarter_two,
PARTITION quarter_three
VALUES LESS THAN ( TO_DATE('01-oct-1998','dd-mon-yyyy'))
TABLESPACE quarter_three,
PARTITION quarter_four
VALUES LESS THAN ( TO_DATE('01-jan-1999','dd-mon-yyyy'))
TABLESPACE quarter_four
);
--- Create local PREFIXED index on Four_Seasons
-- Prefixed because the leftmost columns of the index match the
-- Partition key
-CREATE INDEX i_four_seasons_l ON four_seasons ( one,two )
LOCAL (
PARTITION i_quarter_one TABLESPACE i_quarter_one,
PARTITION i_quarter_two TABLESPACE i_quarter_two,
PARTITION i_quarter_three TABLESPACE i_quarter_three,
PARTITION i_quarter_four TABLESPACE i_quarter_four
);

Range partitions:

ALTER TABLE four_seasons


MERGE PARTITIONS quarter_one, quarter_two INTO PARTITION quarter_two;
ALTER TABLE four_seasons MODIFY PARTITION
quarter_two REBUILD UNUSABLE LOCAL INDEXES;

List partitions:

ALTER TABLE q1_sales_by_region


MERGE PARTITIONS q1_northcentral, q1_southcentral
INTO PARTITION q1_central
PCTFREE 50 STORAGE(MAXEXTENTS 20);

Range-list partitions:
ALTER TABLE stripe_regional_sales
MERGE PARTITIONS q1_1999, q2_1999 INTO PARTITION q1_q2_1999;

15

In tabelul urmator sunt trecute toate operatiile care pot fi executate intr-o tabela partitionate:

Operatie
Adding
Partitions

Range
ADD
PARTITION

Hash
ADD
PARTITION

List
ADD
PARTITION

Composite:
Range/Hash
ADD
PARTITION

Composite:
Range/List
ADD PARTITION

MODIFY
MODIFY
PARTITION...A
PARTITION... DD
ADD
SUBPARTITION
SUBPARTITION
Coalescing
Partitions

n/a

COALESCE
PARTITION

n/a

MODIFY
n/a
PARTITION...
COALESCE
SUBPARTITION

Dropping
Partitions

DROP
PARTITION

n/a

DROP
PARTITION

DROP
PARTITION

DROP PARTITION
DROP
SUBPARTITION

Exchanging
Partitions

EXCHANGE
PARTITION

EXCHANGE
PARTITION

EXCHANGE
PARTITION

EXCHANGE
PARTITION

EXCHANGE
PARTITION

EXCHANGE
EXCHANGE
SUBPARTITION SUBPARTITION
Merging
Partitions

MERGE
n/a
PARTITIONS

MERGE
MERGE
PARTITIONS PARTITIONS

MERGE
PARTITIONS
MERGE
SUBPARTITIONS

Modifying
Default
Attributes

MODIFY
MODIFY
MODIFY
MODIFY
DEFAULT
DEFAULT
DEFAULT
DEFAULT
ATTRIBUTES ATTRIBUTES ATTRIBUTES ATTRIBUTES

MODIFY
Modifying
Real Attributes

MODIFY

MODIFY
16

MODIFY
DEFAULT
ATTRIBUTES

MODIFY
DEFAULT
ATTRIBUTES
FOR
PARTITION

MODIFY
DEFAULT
ATTRIBUTES
FOR PARTITION

MODIFY

MODIFY

Operatie
of Partitions

Range
PARTITION

Hash
PARTITION

List
PARTITION

Composite:
Range/Hash
PARTITION

Composite:
Range/List
PARTITION

MODIFY
MODIFY
SUBPARTITION SUBPARTITION
Modifying List n/a
Partitions:
Adding Values

n/a

MODIFY
n/a
PARTITION.
..ADD
VALUES

MODIFY
SUBPARTITION.
.. ADD VALUES

Modifying List n/a


Partitions:
Dropping
Values

n/a

MODIFY
n/a
PARTITION.
..DROP
VALUES

MODIFY
SUBPARTITION.
.. DROP
VALUES

Modifying a
Subpartition
Template

n/a

n/a

n/a

SET
SET
SUBPARTITION SUBPARTITION
TEMPLATE
TEMPLATE

Moving
Partitions

MOVE
PARTITION

MOVE
PARTITION

MOVE
PARTITION

MOVE
MOVE
SUBPARTITION SUBPARTITION

Renaming
Partitions

RENAME
PARTITION

RENAME
PARTITION

RENAME
PARTITION

RENAME
PARTITION

RENAME
PARTITION

RENAME
RENAME
SUBPARTITION SUBPARTITION
Splitting
Partitions

SPLIT
PARTITION

n/a

SPLIT
PARTITION

SPLIT
PARTITION

SPLIT PARTITION
SPLIT
SUBPARTITION

Truncating
Partitions

TRUNCATE
PARTITION

TRUNCATE
PARTITION

TRUNCATE
PARTITION

TRUNCATE
PARTITION

TRUNCATE
PARTITION

TRUNCATE
TRUNCATE
SUBPARTITION SUBPARTITION

17

8. Exercitii
1. Testati exemplele din laborator. Acolo unde este nevoie, creati si obiectele auxiliare necesare (ex:
tabele partitionate corespunzatoare pentru indexi).
2. Creati doua tabele partitionate de tip referinta, astfel:
- tabela parinte COMANDA, partitionata pe interval (range), trimestrial pe anul 2015, dupa coloana
data_comanda, avand coloanele: idcomanda, data_comanda, idclient, totalval, data_livare, idagent,
tipvanzare.
- tabela copil ITEM, partitionata referinta (reference) avand coloanele: idcomanda, iditem, idprodus,
cant, pret.
Inserati date de test in cele doua tabele. Afisati primele 3 produse vandute cel mai bine (valoric), in
trimestrul al doilea al anului 2015.
Creati indexi locali si/sau globali necesari pentru optimizarea timpilor de raspuns al interogarii.
3. Creati o tabela partitionata dupa interval (range), care sa stocheze vanzarile unui lant de magazine
in intreaga tara, incepand cu anul 2010 pana in 2016. Tabela VANZARI are coloanele: idmagazin,
idprodus, data, idclient, valoare. Partitionarea de tip range se face semestrial pe coloana data.
Inserati date de test in tabela de vanzari. Creati indexi locali si/sau globali necesari.
4. Creati tabela dimensiune PRODUS corespunzatoare tabelei VANZARI. Tabela contine coloanele:
idprodus, denprodus, furnizor. Tabela este partitionata hash dupa idprodus, in 4 partitii.
Inserati date de test in tabel. Creati indexi locali si/sau globali necesari.
5. Creati tabela dimensiune MAGAZIN corespunzatoare tabelei VANZARI. Tabela contine coloanele:
idmagazin, denmagazin, sefmagazin, localitate, judet. Tabela este partitionata lista in urmatoarele
regiuni istorice: Moldova, Muntenia, Dobrogea, Oltenia, Ardeal, Banat-Crisana, Maramures. Pentru
fiecare regiune se iau in considerare 3 judete reprezentative.
Inserati date de test in tabel. Creati indexi locali si/sau globali necesari.
6. La tabela COMANDA adaugati o subpartitie de tip lista dupa coloana tipvanzare cu urmatoarele
valori: directa, internet, telefonic. Inserati date de test in tabel. Creati indexi locali si/sau globali
necesari. Afisati datele dupa diverse criterii.
7. La tabela ITEM adaugati o subpartitie de tip hash dupa coloana iditem, in 3 subpartitii. Inserati date
de test in tabel. Creati indexi locali si/sau globali necesari. Afisati datele dupa diverse criterii.
8. Testati operatiile de gestiune (unire, divizare, stergere) ale partiilor si subpartitiilor create.

18

S-ar putea să vă placă și