Sunteți pe pagina 1din 8

SQL TUNING – METODE DE PARTIŢIONARE

TEHNICI DE PARTIȚIONARE

Tehnica de partiționare este utilizată pentru gruparea logică a valorilor dintr-o anumită
coloană dintr-o tabelă. Partițiile trebuie specificate în momentul în care este creată tabela, iar
înregistrările adăugate sunt automat repartizate în partiția de care aparțin (fig 1).

Figura 1. Tabele ne-partiționate vs tabele partiționate (sursa:


http://docs.oracle.com/cd/B10501_01/server.920/a96524/c12parti.htm)
Partițiile pot fi:
Partiții de tip Range – în care se specifică un interval de valori în funcție de care se
grupează înregistrările;
Partiții de tip List - în care se specifică o listă de valori în funcție de care se grupează
înregistrările.
Sintaxa pentru crearea partițiilor este următoarea:
CREATE TABLE t
(col_id NUMBER(5),
col_name VARCHAR2(30),
col_value NUMBER(10),
col_date DATE)

1
SQL TUNING – METODE DE PARTIŢIONARE

PARTITION BY LIST/RANGE(col_date)
(
PARTITION trim1 VALUES …
PARTITION trim2 VALUES …
PARTITION trim3 VALUES …,
PARTITION trim_other VALUES(DEFAULT)
);

In cadrul tabelelor partiționate se pot specifica și subpartiții, existând astfel o combinație între
partiții de tip RANGE si cele de tip LIST.
Pentru conexiunea in SQL Developer folositi urmatoarele detalii in fereastra New database
Connection (click dr pe Connection-> New Connection):

Connection Name: numele Dvs


Username: NUME_initialaPrenume_MBD (lista conturilor este pe platforma)
Parola: stud
Server
Host: 37.120.250.20
Port 1521
Service_name: oracle

In exemplele următoare se vor crea trei tabele: BALANTA_A – nepartiționată,


BALANTA_B – partiționată de tip RANGE în funcție de coloana data, BALANTA_C -
partiționată de tip RANGE în funcție de data și sub-partiționată de tip LIST în funcție de
coloana DIVIZIA.
Tabela BALANTA_A:
create table balanta_a
( data date not null,
perioada varchar2(15) not null,
rulaj_d number,
rulaj_c number,
cont varchar2(25),
divizia varchar2(50),
SECTOR varchar2(100),
directie varchar2(100));
Inregistrările se preiau dintr-o schemă existentă (MS_DBA):
Insert into balanta_a select * from MS_DBA.balanta_a;

2
SQL TUNING – METODE DE PARTIŢIONARE

Tabela BALANTA_B va avea partiții pentru fiecare trimestru.


create table balanta_b
( data date not null,
perioada varchar2(15) not null,
rulaj_d number,
rulaj_c number,
cont varchar2(25),
divizia varchar2(50),
SECTOR varchar2(100),
directie varchar2(100))
partition by range (data)
(partition QT1 values less than (to_date('01-APR-2007', 'dd-mon-yyyy')),
partition QT2 values less than (to_date('01-JUL-2007', 'dd-mon-yyyy')),
partition QT3 values less than (to_date('01-OCT-2007', 'dd-mon-yyyy')),
partition QT4 values less than (to_date('01-JAN-2008', 'dd-mon-yyyy')));
Înregistrările sunt încărcate din tabela BALANTA_A:
insert into balanta_b select * from balanta_a;
Pentru această tabelă se pot vizualiza partițiile create:
select * from user_tab_partitions s
where s.table_name = 'BALANTA_B';
Tabela BALANTA_C va fi partiționată pe trimestre și sub-partiționată pe divizii
astfel:
create table BALANTA_C
( data date not null,
perioada varchar2(15) not null,
rulaj_D number,
rulaj_C number,
cont varchar2(25),
divizia varchar2(50),
sector varchar2(100),
directie varchar2(100))
partition by range (data)
subpartition by list (DIVIZIA)
(partition QT1 values less than (to_date('01-APR-2007', 'dd-mon-yyyy'))

3
SQL TUNING – METODE DE PARTIŢIONARE

(subpartition QT1_OP values ('a.MTN','b.CTM','c.TRS','d.WOD','e.DMA'),


subpartition QT1_GA values ('f.GA operare','g.GA corporativ'),
subpartition QT1_AFO values ('h.AFO divizii','i.AFO corporativ'),
subpartition QT1_EXT values ('j.EXT','k.Implicit')),
partition QT2 values less than (to_date('01-JUL-2007', 'dd-mon-yyyy'))
(subpartition QT2_OP values ('a.MTN','b.CTM','c.TRS','d.WOD','e.DMA'),
subpartition QT2_GA values ('f.GA operare','g.GA corporativ'),
subpartition QT2_AFO values ('h.AFO divizii','i.AFO corporativ'),
subpartition QT2_EXT values ('j.EXT','k.Implicit')),
partition QT3 values less than (to_date('01-OCT-2007', 'dd-mon-yyyy'))
(subpartition QT3_OP values ('a.MTN','b.CTM','c.TRS','d.WOD','e.DMA'),
subpartition QT3_GA values ('f.GA operare','g.GA corporativ'),
subpartition QT3_AFO values ('h.AFO divizii','i.AFO corporativ'),
subpartition QT3_EXT values ('j.EXT','k.Implicit')),
partition QT4 values less than (to_date('01-JAN-2008', 'dd-mon-yyyy'))
(subpartition QT4_OP values ('a.MTN','b.CTM','c.TRS','d.WOD','e.DMA'),
subpartition QT4_GA values ('f.GA operare','g.GA corporativ'),
subpartition QT4_AFO values ('h.AFO divizii','i.AFO corporativ'),
subpartition QT4_EXT values ('j.EXT','k.Implicit')));

Înregistrările sunt încărcate din tabela balanta_a:


insert into balanta_c select * from balanta_a;
Pentru această tabelă se pot vizualiza sub-partițiile create:
select * from user_tab_subpartitions s
where s.table_name = 'BALANTA_C';
Pentru a obține rezultate corecte se pot colecta statistici referitoare la înregistrările din cele 2
tabele:
Pentru tabela BALANTA_B:
ANALYZE TABLE balanta_b PARTITION (QT1) COMPUTE STATISTICS;
ANALYZE TABLE balanta_b PARTITION (QT2) COMPUTE STATISTICS;
ANALYZE TABLE balanta_b PARTITION (QT3) COMPUTE STATISTICS;
ANALYZE TABLE balanta_b PARTITION (QT4) COMPUTE STATISTICS;
Pentru tabela BALANTA_C:
ANALYZE TABLE balanta_c SUBPARTITION (QT4_OP) COMPUTE STATISTICS;

4
SQL TUNING – METODE DE PARTIŢIONARE

ANALYZE TABLE balanta_c SUBPARTITION (QT4_GA) COMPUTE STATISTICS;


ANALYZE TABLE balanta_c SUBPARTITION (QT4_AFO) COMPUTE STATISTICS;
ANALYZE TABLE balanta_c SUBPARTITION (QT4_EXT) COMPUTE STATISTICS;
În momentul interogării acestor tabele partiționate se poate specifica utilizarea partițiilor prin
clauza PARTITION (nume_partiție).
De exemplu pentru utilizarea partiției QT1 din tabela BALANȚA_B se utilizează următoarea
comandă:
SELECT * FROM BALANTA_b
partition (QT1)
where extract (month from DATA) =1;
În mod asemănător se poate specifica utilizarea unor sub-partiții din tabela BALANTA_C:
SELECT * FROM BALANTA_c
SUBPARTITION (QT1_GA)
where extract (month from DATA) =1 AND DIVIZIA LIKE '%GA%';
Analiza costurilor de execuție obținute pe aceste tabele sunt prezentate în continuare.
Exemplul 1: se selectează comparativ toate înregistrările din luna ianuarie.
Exemplul 1 COST COST COST
BALANTA_A BALANTA_B BALANTA_C
SELECT * FROM 125 202 103
BALANTA_T
where extract
(month from DATA)
=1;
SELECT * FROM - 69 41
BALANTA_T
partition (QT1)
where extract
(month from DATA)
=1;

Exemplul 2: se selectează comparativ toate înregistrările din luna ianuarie din dizivia 'h.AFO
divizii'.
Exemplul 2 COST COST COST
BALANTA_A BALANTA_B BALANTA_C
SELECT * FROM 124 201 6

5
SQL TUNING – METODE DE PARTIŢIONARE

BALANTA_T
where extract
(month from DATA)
=1 AND
divizia='h.AFO
divizii';
SELECT * FROM - 68 3
BALANTA_T
partition (QT1)
where extract
(month from DATA)
=1 AND
divizia='h.AFO
divizii';
SELECT * FROM - - 3
BALANTA_T
subpartition
(QT1_AFO)
where extract
(month from DATA)
=1 AND
divizia='h.AFO
divizii';

Exemplul 3: se selectează comparativ, pe fiecare luna, suma rulajelor debitoare si creditoare


din lunile ianuarie și februarie din dizivia 'h.AFO divizii'.
Exemplul 3 COST COST COST
BALANTA_A BALANTA_B BALANTA_C
SELECT 139 203 7
extract(month from
data) luna,
sum(rulaj_d)
Total_debit,
sum(rulaj_c)
Total_credit

6
SQL TUNING – METODE DE PARTIŢIONARE

FROM
BALANTA_a
where extract
(month from DATA)
in (1,2) AND
divizia='h.AFO
divizii'
group by
extract(month from
data);
SELECT - 70 4
extract(month from
data) luna,
sum(rulaj_d)
Total_debit,
sum(rulaj_c)
Total_credit
FROM
BALANTA_B
PARTITION(QT1)
where extract
(month from DATA)
in (1,2) AND
divizia='h.AFO
divizii'
group by
extract(month from
data);
SELECT - - 4
extract(month from
data) luna,
sum(rulaj_d)
Total_debit,
sum(rulaj_c)

7
SQL TUNING – METODE DE PARTIŢIONARE

Total_credit
FROM
BALANTA_T
subpartition
(QT1_AFO)
where extract
(month from DATA)
in (1,2) AND
divizia='h.AFO
divizii'
group by
extract(month from
data);

Din rezultatele prezentate se observă că cele mai mici costuri de execuție sunt obținute pentru
tabela BALANTA_C cu sub-partiții.

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