Kategori: EXADATA
HCC (Hybrid Columnar Compression) Sıkıştırma Yöntemlerinin Exadata X3 Quarter Üzerinde Karşılaştırılması
Merhaba Arkadaşlar,
Oracle 11g öncesi varolan BASIC sıkıştıma yöntemi daha çok veri ambarı ortamlarında öneriliyordu. Oracle 11g ile birlikte OLTP veritabanları için tavsiye edilen OLTP sıkıştırma yöntemini kullanabilir durumdayız. Oracle Exadata ile birlikte QUERY LOW, QUERY HIGH, ARCHIVE LOW ve ARCHIVE HIGH sıkıştırma yöntemlerini de kullanabiliriz. Exadata X3 – Quarter üzerinde sıkıştırma yöntemlerini test ettim ve sonuçları süre/boyut olarak karşılaştırdım.
Şimdi testimize geçelim.
TALIP_TEST adında 3.8 GB boyutunda bir tablo oluşturdum.
SQL> select segment_name, bytes/1024/1024 as size_MB from dba_segments
2 where segment_name=’TALIP_TEST’;SEGMENT_NAME SIZE_MB
———— ———-
TALIP_TEST 3809SQL> select count(*) from talip_test;
COUNT(*)
———-
22919193
Önce BASIC sıkıştırma yöntemini deneyelim. Bunun için COMPRESS kelimesini kullanıyorum.
SQL> create table talip_test_basic nologging compress as select * from talip_test where 1=2;
Table created.
SQL> select table_name,logging,compression,compress_for from dba_tables
2 where table_name=’TALIP_TEST_BASIC’;TABLE_NAME LOGGING COMPRESS COMPRESS_FOR
—————————— ———— ————– ————
TALIP_TEST_BASIC NO ENABLED BASICSQL> set timing on
SQL> insert /*+ append */ into talip_test_basic select * from talip_test;22919193 rows created.
Elapsed: 00:01:32.28
SQL> commit;Commit complete.
Elapsed: 00:00:00.02
COMPRESS FOR OLTP kelimesini kullanarak tablomuzu OLTP sıkıştırma yöntemi ile sıkıştıralım.
SQL> create table talip_test_oltp compress for oltp as select * from talip_test where 1=2;
Table created.
SQL> select table_name,logging,compression,compress_for from dba_tables
2 where table_name=’TALIP_TEST_OLTP’;TABLE_NAME LOGGING COMPRESS COMPRESS_FOR
—————————— ———— ————- ————
TALIP_TEST_OLTP NO ENABLED OLTPSQL> insert into talip_test_oltp select * from talip_test;
22919193 rows created.
Elapsed: 00:04:27.09
SQL> commit;Commit complete.
Elapsed: 00:00:00.00
Şimdi Exadata sıkıştırma yöntemlerine geçelim. COMPRESS FOR QUERY LOW kelimesini kullanarak sıkıştırmamızı yapalım.
SQL> create table talip_test_query_low nologging compress for query low as select * from talip_test where 1=2;
Table created.SQL> select table_name,logging,compression,compress_for from dba_tables
2 where table_name=’TALIP_TEST_QUERY_LOW’;TABLE_NAME LOGGING COMPRESS COMPRESS_FOR
—————————— ——- ——– ————
TALIP_TEST_QUERY_LOW NO ENABLED QUERY LOWSQL> insert /*+ append */ into talip_test_query_low select * from talip_test;
22919193 rows created.
Elapsed: 00:01:04.92
SQL> commit;Commit complete.
Elapsed: 00:00:00.01
Daha fazla yer kazanmak istiyorsak COMPRESS FOR QUERY HIGH yöntemini kullanmamız gerekir. Ama burada insert süresi uzayacaktır.
SQL> create table talip_test_query_high nologging compress for query high as select * from talip_test where 1=2;
Table created.
SQL> select table_name,logging,compression,compress_for from dba_tables
2 where table_name=’TALIP_TEST_QUERY_HIGH’;TABLE_NAME LOGGING COMPRESS COMPRESS_FOR
—————————— ———– ————— ————
TALIP_TEST_QUERY_HIGH NO ENABLED QUERY HIGHSQL> insert /*+ append */ into talip_test_query_high select * from talip_test;
22919193 rows created.
Elapsed: 00:02:16.49
SQL> commit;Commit complete.
Elapsed: 00:00:00.01
Eğer arşiv verilerimiz varsa compress for archive sıkıştırma yöntemini kullanmak daha mantıklı olacaktır.
SQL> create table talip_test_archive_low nologging compress for archive low as select * from talip_test where 1=2;
Table created.
SQL> select table_name,logging,compression,compress_for from dba_tables
2 where table_name=’TALIP_TEST_ARCHIVE_LOW’;TABLE_NAME LOGGING COMPRESS COMPRESS_FOR
———————————— ———– ————– ————
TALIP_TEST_ARCHIVE_LOW NO ENABLED ARCHIVE LOWSQL> insert /*+ append */ into talip_test_archive_low select * from talip_test;
22919193 rows created.
Elapsed: 00:03:05.70
SQL> commit;Commit complete.
Elapsed: 00:00:00.01
Arşiv verilerimizi sıkıştırırken süre çok önemli değil ise ve daha çok yer kazanmak istiyorsak COMPRESS FOR ARCHIVE HIGH kelimesini kullanmalıyız.
SQL> create table talip_test_archive_high nologging compress for archive high as select * from talip_test where 1=2;
Table created.SQL> select table_name,logging,compression,compress_for from dba_tables
2 where table_name=’TALIP_TEST_ARCHIVE_HIGH’;TABLE_NAME LOGGING COMPRESS COMPRESS_FOR
————————————— ———– ————— ————
TALIP_TEST_ARCHIVE_HIGH NO ENABLED ARCHIVE HIGHSQL> insert /*+ append */ into talip_test_archive_high select * from talip_test;
22919193 rows created.
Elapsed: 00:12:02.97
SQL> commit;Commit complete.
Elapsed: 00:00:00.01
Son olarak tablo boyutlarımızı görelim.
SQL> set line 1000
SQL> select segment_name,bytes/1024/1024 as size_MB from dba_segments
2 where segment_name like ‘TALIP_TEST%’ order by 1;
SEGMENT_NAME SIZE_MB TALIP_TEST 3809 TALIP_TEST_ARCHIVE_HIGH 424 TALIP_TEST_ARCHIVE_LOW 488 TALIP_TEST_BASIC 2500 TALIP_TEST_OLTP 2997 TALIP_TEST_QUERY_HIGH 512 TALIP_TEST_QUERY_LOW 856 7 rows selected.
Tablomuza sıkıştırma sürelerini de eklersek son durum aşağıdaki gibi olacaktır.
SEGMENT_NAME | SIZE_MB | TIME |
TALIP_TEST | 3809 | |
TALIP_TEST_ARCHIVE_HIGH | 424 | 00:12:02.97 |
TALIP_TEST_ARCHIVE_LOW | 488 | 00:03:05.70 |
TALIP_TEST_BASIC | 2500 | 00:01:32.28 |
TALIP_TEST_OLTP | 2997 | 00:04:27.09 |
TALIP_TEST_QUERY_HIGH | 512 | 00:02:16.49 |
TALIP_TEST_QUERY_LOW | 856 | 00:01:04.92 |
OLTP bir ortamda COMPRESS FOR QUERY LOW kullanmak sanırım en mantıklısı olacaktır.
Talip Hakan Öztürk