In articolul precedent am arătat cum se poate compresa o tabelă Oracle și spuneam că opțiunea de compresare a tabelelor a apărut o dată cu Oracle 9i dar până acum ceva timp nu a existat nici o opțiune de a compresa indecșii, această opțiune făcându-și apariția o dată cu Oracle 11g iar în ultima versiune a bazei  de date Oracle 12.1.0.2 iată  că a apărut o versiune îmbunătățită de compresare a indecșilor. Pentru a afla mai multe vă invit să mă urmăriți mai departe.

Am folosit aceeași tabelă ca în articolul precedent dar am căutat o coloană cu cât mai multe înregistrări duplicate pe care să o indexez.

SQL> select count(*) from (select distinct odate from test.no_compress);

  COUNT(*)
----------
     10000

Rezulta ca avem zece mii de înregistrări distincte din doua milioane, prin urmare va trebui să obținem o rată de compresie destul de mare. Pentru început creez indexul necompresat pentru a-l compara la sfârșit.

SQL> create index test.idx1 on test.no_compress(odate);

Index created.

Fără a intra prea mult în detalii, leaf-urile stochează valoarea indexului și corespondenta rowid-ului, compresând datele putem utiliza mai multe valori într-un leaf_block ceea ce ne permite sa utilizam mai puține leaf-uri.

SQL> select index_name,compression,leaf_blocks from dba_indexes where index_name = 'IDX1';

INDEX_NAME COMPRESSION   LEAF_BLOCKS
---------- ------------- -----------
IDX1       DISABLED             5306

Analizând statisticile indexului putem avea o valoare estimativă a factorului de compresie cat și procentul leaf-urilor care pot fi compresate:

SQL> validate index test.idx1;

Index analyzed.

SQL> select name,opt_cmpr_count,opt_cmpr_pctsave from index_stats where name = 'IDX1';

NAME       OPT_CMPR_COUNT OPT_CMPR_PCTSAVE
---------- -------------- ----------------
IDX1                    1               41

Necompresat indexul ocupă aproximativ 45 MB

SQL> SELECT segment_name,segment_type,bytes,extents FROM dba_segments where owner='TEST' and SEGMENT_TYPE='INDEX';

SEGMENT_NA SEGMENT_TYPE            BYTES    EXTENTS
---------- ------------------ ---------- ----------
IDX1       INDEX                45088768         58

Si repet procedura pentru același index dar de data aceasta compresat:

SQL> alter index test.idx1 rebuild compress advanced low;

Index altered.

SQL> select index_name,compression,leaf_blocks from dba_indexes where index_name = 'IDX1';

INDEX_NAME COMPRESSION   LEAF_BLOCKS
---------- ------------- -----------
IDX1       ADVANCED LOW         3093

Dacă initial leaf block-urile erau 5306 acum după compresie valoarea acestora s-a redus la 3093, rezultă o rată de compresie de 42%, adică foarte aproape de cat a fost estimat prin analiza indexului!

SQL> SELECT segment_name,segment_type,bytes,extents FROM dba_segments where owner='TEST' and SEGMENT_TYPE='INDEX';


SEGMENT_NA SEGMENT_TYPE            BYTES    EXTENTS
---------- ------------------ ---------- ----------
IDX1       INDEX                26214400         40

Dimensiunea a scăzut de la 43 MB la 26 MB, reducându-se cu 40 de procente.

Sper că am reușit să trezesc măcar puțin interesul pentru a explora una dintre cele mai interesante opțiuni disponibile în 12.1.0.2

2 comentarii

Lasă un răspuns

Completează mai jos detaliile tale sau dă clic pe un icon pentru a te autentifica:

Logo WordPress.com

Comentezi folosind contul tău WordPress.com. Dezautentificare / Schimbă )

Poză Twitter

Comentezi folosind contul tău Twitter. Dezautentificare / Schimbă )

Fotografie Facebook

Comentezi folosind contul tău Facebook. Dezautentificare / Schimbă )

Fotografie Google+

Comentezi folosind contul tău Google+. Dezautentificare / Schimbă )

Conectare la %s