Anasayfa > EXADATA, HCC (Hybrid Columnar Compression) > HCC (Hybrid Columnar Compression) Sıkıştırma Yöntemlerinin Exadata X3 Quarter Üzerinde Karşılaştırılması

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                   3809

SQL> 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      BASIC

SQL> 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      OLTP

SQL> 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 LOW

SQL> 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 HIGH

SQL> 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 LOW

SQL> 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 HIGH

SQL> 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

  1. Yasin Baskan
    06/02/2013, 9:09 pm

    Selamlar,

    Bir düzeltme yapayım. OLTP ortam ile ne kastedildiği önemli. Concurrent session’lar tarafından update edilen tablolardan bahsediliyorsa HCC yöntemleri bu tablolarda kullanılamaz. HCC Oracle’ın bilinen row locking mekanizmasını değiştirir, tek tek kayıtların lock edilmesi yerine birden fazla block (compression unit) içindeki tüm kayıtları lock eder. Bu nedenle aynı anda çalışan update’ler aynı block’lar içinde işlem yapıyorlarsa enqueue beklemeleri yaşamaya başlarlar. OLTP compression’da veya uncompressed durumda görülmeyen beklemeler ortaya çıkmaya başlar.

    Bu nedenle OLTP ortamlarda OLTP compression kullanılması gerekir. OLTP sistemlerde HCC kullanımı partitioning ile beraber mümkün oluyor, az DML gören veya concurrent DML görmeyen eski partition’lar HCC ile sıkıştırılırken güncel ve çok concurrent DML gören partition’lar OLTP compression ile sıkıştırılabilir veya uncompressed bırakılabilir.

    • 07/02/2013, 8:03 pm

      Selamlar Yasin Hocam. Çok önemli bir noktaya değinmişsiniz. Paylaşımınız için çok teşekkür ederim. Aslında farklı bir yazı ile HCC ‘yi detaylandırmak lazım. Bende partitionlı tabloları düşünerek son cümlemi yazdım. Dediğiniz gibi birden fazla blok içindeki tüm kayıtlar kilitleniyor.

  2. 07/02/2013, 5:11 am

    Talip gozel bir yazi olmus, Ellerine saglik.

    Mahir

  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: