Documente Academic
Documente Profesional
Documente Cultură
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:
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 contine date istorice, astfel incat datele noi sa fie adaugate in partitii noi
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));
, order_date
, sales_amount
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'))
);
VARCHAR2(50)
,country
VARCHAR2(2)
)
PARTITION BY LIST(country) SUBPARTITION BY HASH(name)
SUBPARTITIONS 5
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')
)
);
10
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),
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)
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);
12
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
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;
13
SUBPARTITION
SUBPARTITION
SUBPARTITION
SUBPARTITION
);
Exemple:
ALTER TABLE sales DROP PARTITION dec98;
ALTER INDEX sales_area_ix REBUILD;
14
Range partitions:
List partitions:
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
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