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
Salut
Se poate comprima doar o partitie a unui index in 12cR1/2 sau 11gR2 ?
Salut George,
Se pot comprima doar anumite partiții începând cu Oracle 11g, iar dacă vorbim despre 12c atunci fiecare partiție se pot comprima cu o compresie diferita