Szacowanie Współczynnika Kompresji Danych
Dużą ilość danych można upakować do nieco bardziej akceptowalnych rozmiarów poprzez wykonanie mechanizmu kompresji danych. Który typ kompresji będzie najbardziej optymalny, można oszacować z wykorzystaniem procedury DBMS_COMPRESSION.get_compression_ratio.
DROP TABLE T1 / CREATE TABLE T1(id NUMBER, val CHAR(2000) DEFAULT 'A') / INSERT INTO T1(id) SELECT rownum FROM dual CONNECT BY ROWNUM <= 10000 / DECLARE v_blkcnt_cmp NUMBER; v_blkcnt_uncmp NUMBER; v_row_cmp NUMBER; v_row_uncmp NUMBER; v_cmp_ratio NUMBER; v_comptype_str VARCHAR2(100); BEGIN DBMS_COMPRESSION.GET_COMPRESSION_RATIO ( scratchtbsname => 'DW_DATA', ownname => USER, objname => 'T1', subobjname => NULL, comptype => TYP KOMPRESJI, blkcnt_cmp => v_blkcnt_cmp, blkcnt_uncmp => v_blkcnt_uncmp, row_cmp => v_row_cmp, row_uncmp => v_row_uncmp, cmp_ratio => v_cmp_ratio, comptype_str => v_comptype_str); DBMS_OUTPUT.put_line('v_blkcnt_cmp: '||v_blkcnt_cmp); DBMS_OUTPUT.put_line('v_blkcnt_uncmp: '||v_blkcnt_uncmp); DBMS_OUTPUT.put_line('v_row_cmp: '||v_row_cmp); DBMS_OUTPUT.put_line('v_row_uncmp: '||v_row_uncmp); DBMS_OUTPUT.put_line('v_cmp_ratio: '||v_cmp_ratio); DBMS_OUTPUT.put_line('v_comptype_str: '||v_comptype_str); END; /
TYP KOMPRESJI: DBMS_COMPRESSION.COMP_NOCOMPRESS
v_blkcnt_cmp: 0
v_blkcnt_uncmp: 0
v_row_cmp: 0
v_row_uncmp: 0
v_cmp_ratio: 1 <-- brak kompresji, więc współczynnik kompresji wynosi 1
v_comptype_str: "uncompressed" <-- brak kompresji
TYP KOMPRESJI: DBMS_COMPRESSION.COMP_ADVANCED
v_blkcnt_cmp: 9
v_blkcnt_uncmp: 1408
v_row_cmp: 1095
v_row_uncmp: 6
v_cmp_ratio: 156,4 <-- bardzo duży współczynnik przy zaawansowanej kompresji
v_comptype_str: "Compress Advanced" <-- Advance Compression
TYP KOMPRESJI: DBMS_COMPRESSION.COMP_BASIC
v_blkcnt_cmp:
v_blkcnt_uncmp:
v_row_cmp:
v_row_uncmp:
v_cmp_ratio:
v_comptype_str:
Niestety to ostatnie nie zwróci żadnych danych, a sypnie tylko nieprzyjemny komunikat ORA-00933: polecenie SQL niepoprawnie zakończone. Wyjaśnienie choć niejasne zostało podane w dokumentacji pakietu DBMS_COMPRESSION.
Note: The following compression types cannot be specified in this parameter for any type of object:
COMP_BLOCK
(value64
) andCOMP_BASIC
(value4096
).
Więcej natomiast udostępnia opis na stronie blogs.oracle.com, w którym czytamy:
Advanced Row Compression is the data compression feature of Advanced Compression that uses the same algorithm as Basic Compression, but differs from Basic Compression in that Advanced Row Compression maintains data compression during all types of data manipulation operations, including conventional DML such as INSERT and UPDATE.
…
In general, organizations typically see a compression ratio in the range of 2x to 4x when using Advanced Row Compression (Basic compression produces similar compression ratios). That is, the amount of space consumed by uncompressed data will be two to four times larger than that of the compressed data.
Zatem szacunkowo można założyć, że współczynnik kompresji dla COMP_BASIC, będzie taki sam jak dla COMP_ADVANCED.
Zasada im większa wartość współczynnika (v_cmp_ratio), tym lepiej, nie zawsze się sprawdza. Wszystko zależy od charakterystyki środowiska bazy danych (OLTP, OLAP), tego, czy dane pełnią rolę archiwalną i dostęp do nich będzie sporadyczny, czy to, jakiego typu dane przechowujemy. Aby skorzystać z któregoś typu kompresji trzeba wybierać świadomie, a procedura get_compression_ratio, ma dać podgląć jak bardzo dane zostaną upakowane. Po opis typów kompresji i szczegółowe omówienie DBMS_COMPRESSION odsyłam do dokumentacji Oracle.