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.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment