Sunday, June 7, 2009

Data Warehouse’da büyük datalar ile işlem yapmak tablo sıkıştırma ( COMPRESS )

Bu yazıda veri ambarlarında bulunan büyük tablolarda sıkıştırma (compress) işlemi ilgili birkaç durumu açıklamak istiyorum.

Öncelik ile tablomuzdaki kayıt sayısına bakalım

select count(*) From buyuk_tablom;


COUNT(*)

--------------------

81,941,980

--Aşağıda ki formatlama kodu ile görmek istediğimiz şekilde ekrana yazıdırırız. Okuması daha kolay olsun diye

column sum(bytes) format 999,999,999,999,999;

select sum(bytes) from dba_segments where ...segment_Name = 'BUYUK_TABLOM';


SUM(BYTES)

--------------------

4,571,004,928

--Bildiğiniz Üzere dba_segments görünümde databasede bulunan neslerin boyunu bulabiliriyoruz.

Nocompress durumunda olan toblomuzu sıkıştırma işlemini yapmayı deneyelim.

alter table buyuk_tablom compress;

alter table buyuk_tablom compress

*

ERROR at line 1:

ORA-14646: Specified alter table operation involving compression cannot be performed in the presence of usable bitmap indexes

Böyle bir hata aldık çünkü tablomda bir index var. öncelik ile index’i silmemiz gerekecek.

drop index indeksim_bindx1;

--indeksi sildikten sonra sıkıştırma işlemini yapabiliriz.

alter table buyuk_tablom compress;

Table altered.


Elapsed: 00:00:02.83


Bu işlemin arkasıdan tabloda bulunan herbir partition’u sıkıştırıyoruz.

BEGIN

FOR rec IN ( SELECT partition_name

FROM DBA_SEGMENTS

WHERE ... segment_name = 'BUYUK_TABLOM'

ORDER BY partition_name

) LOOP

EXECUTE IMMEDIATE

'ALTER TABLE buyuk_tablom MOVE PARTITION '

||rec.partition_name||' COMPRESS ';

END LOOP;

END;

/


PL/SQL procedure successfully completed.


Elapsed: 00:10:38.65

--daha once silmiş olduğumuz indeksimizi yeniden yaratmamız gerekecek. Bu işin uzun kısmı olabilir. Ama bundan kaçmak mümkün gibi görünmüyor.

CREATE BITMAP INDEX TABLOM_BINDX1

ON BUYUK_TABLOM

(SOURCE)

TABLESPACE ODS_INDX

LOCAL (

PARTITION PAR_1994

....

....

....

)

NOPARALLEL


Index created.


Elapsed: 00:03:23.45

--indeksimizin durumuna bakınca kullanılamaz (unusable) olduğunu görüyoruz.

select index_name, status from user_indexes where table_name = 'BUYUK_TABLOM';

INDEX_NAME STATUS

------------------------------ --------

TABLOM_BINDX1 N/A

TABLOM_INDEX1 UNUSABLE

TABLOM_PK UNUSABLE

Bundan kurtulmak için hemen alter index komutu ile durumunu online yapıyoruz.

alter index buyuk_tablom_pk rebuild online compute statistics;


Index altered.


Elapsed: 00:10:16.19 -- about 8 million records per minute.


select index_name, status from user_indexes where table_name = 'BUYUK_TABLOM';

INDEX_NAME STATUS

------------------------------ --------

TABLOM_BINDX1 N/A

TABLOM_INDEX1 UNUSABLE

TABLOM_PK VALID


alter index buyuk_tablom_index1 rebuild online compute statistics;


Index altered.


Elapsed: 00:08:07.48


INDEX_NAME STATUS

------------------------------ --------

TABLOM_BINDX1 N/A

TABLOM_INDEX1 VALID

TABLOM_PK VALID

En son olarak tablomuzun istatistiğini toplayalım.

BEGIN

DBMS_STATS.GATHER_TABLE_STATS (

ownname=>NULL,tabname=>'BUYUK_TABLOM',

partname=>NULL,

estimate_percent=>DBMS_STATS.AUTO_SAMPLE_SIZE,

method_opt=>'FOR ALL INDEXED COLUMNS SIZE AUTO',

cascade=>true);

END;

/

PL/SQL procedure successfully completed.


Elapsed: 00:14:04.03

Evet şimdide işin en keyifli kısmı geliyor. Aradaki boyut farkını görelim.

Compress yapmadan once

select sum(bytes) from dba_segments where ...segment_Name = 'BUYUK_TABLOM';


SUM(BYTES)

--------------------

4,571,004,928

Compress yaptıktan sonra

select sum(bytes) from dba_segments where ...segment_Name = 'BUYUK_TABLOM';



SUM(BYTES)

---------------------

2,319,155,200


4.6 GB dan 2.3GB’a yarı yarıya bir azalma oldu . Bu dikkate değer bir durum.

No comments: