Home / MAKALELER / Veri Tabanı / Oracle da HWM (High Water Mark) kavramı

Oracle da HWM (High Water Mark) kavramı

Bugün Oracle da High Water Mark ve Kısaca shrink işleminden bahsedeceğiz.

 

Oracle da HWM(High Water Mark) ve Shrink İşlemi
-HWM(High Water Mark) Nedir ?
Oracle veri tabanında veriler fiziksel olarak datablock bazında tutulur. HWM, segmentlere (Tablo, index veya partition) ait databloklar üzerinde çalışan bir pointer yapısıdır ve segmentin en son aldığı databloğu işaret eder.
-HWM nasıl çalışır?
Bir tablo yaratıldığında HWM değeri sıfırdır. Segment  (Tablo, index veya partition) büyüdükçe, her yeni gelen data bloğu işaret edeceğinden dolayı HWM değeri de büyür. Bu mantığı aşağıdaki şekille açıklayabiliriz : (Şekilleri üstad Tom Kyte’ın sitesinden aldım, sms vari bir şekillendirme ama çok pratik J)
|
V
+——————————————————–+
| | | | | | | | | | | | | | | | | | | |
| | | | |  | | | | | | | | | | | | | | |
+–+–+–+–+–+–+–+–+–+–+–+–+–+–+–+–+–+–+–+
Burada tablonun ilk create edildiği andaki HWM nin durumunu görüyoruz. Henüz veri olmadığı için başlangıç noktasını gösteriyor.
Şimdi tabloya insert yapıldıktan sonraki durumu görelim :

 

                                    V
+-----------------------------------+--------------------+
|x |x |x |x |x |x |x |x |x |x |x |x | | | | | | | |
|x |x |x |x |x |x |x |x |x |x |x |x | | | | | | | |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

 

Görüldüğü gibi, tablo yeni blok aldıkça büyüyor ve HWM, en son alınan bloğa işaret ediyor.
Şimdi ise insert edilen verilerden bir kısmını delete ederek HWM nin durumuna bakalım :
                                    V
+--------------------------------------------------------+
|x |x |x |x |x |x |x | | | | | | | | | | | | |
|x |x |x |x |x |x |x | | | | | | | | | | | | |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

 

Burada dikkat edilmesi gereken nokta, tabloadan veri silindiği zaman, HWM değerinin eksi yönde gitmemesidir. Yani bir tabloya 1000000 tane kayıt insert ettiğinizde HWM x gibi bir değeri gösteriyorsa; bu kayıtların bir kısmını veya tümünü delete ettiğinizde HWM yine x i gösterecektir.
-HWM ne işe yarar ?
Bir sorgu çalıştırıldığında eğer optimizer “full table scan” yapmaya karar vermiş ise, (full table scan : ilgili segmente ait tüm datablokların okunması) HWM nin gösterdiği değerin altındaki tüm bloklar okunur. Dolayısıyla bir tabloya 1000000 kayıt insert ettiğinizde full table scan 60 sn. sürüyorsa, kayıtların hepsini silseniz dahi, sorgu anında sonuç vermesi gerekirken yine 60 sn sürer. Bu durumu önlemek için aşağıdaki yolu izlememiz gerekecektir :
alter table tablo_adi shrink space;
Bu script, tabloda çokça DML işlemi sonucu fiziksel olarak düzensiz dağılmış verileri fragmante etmemize yarar. Bu tıpkı işletim sistemlerindeki “Disk Birleştirme” işlemine benzer. Bu kod çalıştırıldığında dağılmış veri boş bloklara düzenli bir şekilde yerleştirilir. Fakat burada dikkat edilmesi gereken bir nokta var:
Tabloda shrink space işlemi yapılabilmesi için tablonun “row movement” özelliği enable olmak zorundadır. Eğer bu özellik disable durumda ise;
alter table tablo_adi enable row movement;
scripti çalıştırılarak bloklarda bulunan satırların hareket edebilmesi sağlanmalıdır.
-Örnek:
Önce aşağıdaki gibi sınırsız extend alabilen bir tablo create edelim:
create table HWM_TEST(
ID      NUMBER,
DB_USERVARCHAR2(12),
TARIH   DATE
)
STORAGE(
        MAXEXTENTS       UNLIMITED
       );
Aşağıdaki script ile tabloya birkaç yüzbin kayıt ekleyelim :
insert into HWM_TEST
select level   id,
        user    db_user,
        sysdate tarih
 from dual
connect by level<100001;
/
commit;
/
100000 rows created.
Commit complete.
Bu kayıtları çoklayarak artıralım (amaç yüklü insertler yaparak tablonun blok sayısını artırmak) :
insert into HWM_TEST
select * from HWM_TEST;
/
insert into HWM_TEST
select * from HWM_TEST;
/
insert into HWM_TEST
select * from HWM_TEST;
/
insert into HWM_TEST
select * from HWM_TEST;
/
insert into HWM_TEST
select * fromHWM_TEST;
/
commit;
100000 rows created.
200000 rows created.
400000 rows created.
800000 rows created.
1600000 rows created.
Commit complete.
Şimdi tablodan bir count(*) sorgulayarak süresine bakalım:
set timing on— sorgunun çalışma süresini gösterir..
select count(*) from hwm_test;
Çıktımız aşağıdaki gibi:
 COUNT(*)
———-
   3200000
1 row selected.
Elapsed: 00:00:02.26
Şimdi tablodaki tüm verileri silerek tekrar count(*) çekeceğiz:
delete from HWM_TEST;
/
commit;
set timing on— sorgunun çalışma süresini gösterir..
select count(*)from hwm_test;
 COUNT(*)
———-
         0
1 row selected.
Elapsed: 00:00:02.42
Gördüğünüz gibi  kayıt sayısı sıfır olduğu halde sürede düşüş olmadı. Şimdi bahsettiğimiz shrink işlemini yapalım ve öyle gözlemleyelim:
alter table HWM_TEST enable row movement;
alter table HWM_TEST shrink space;
set timing on— sorgunun çalışma süresini gösterir..
select count(*) from hwm_test;
 COUNT(*)
———-
         0
1 row selected.
Elapsed: 00:00:00.01

 

 

İyi Çalışmalar…

Ercan Yazgan

About Ercan Yazgan

Oracle Technologies Specialist Yalova Doğumluyum, İlköğretimimi İstanbulda, Lise eğitimini ise memleketim olan Gümüşhane'de Anadolu Lisesinde tamamladım. Lisans eğitimimi ise Sakarya Üniversitesinde, hayalim olan bilgisayar mühendisliğinde tamamladım. Üniversitedeyken kariyer hedefimi database teknolojileri üzerine belirledim ve Oracle ile projeler geliştirdim. Her zaman yeniye ve yeniliğe olan ilgimden dolayı lisans projemde ODI ve OBIEE teknolojilerini kullanarak veri ambarı sistemlerine giriş yaptım. Şu an özel bir şirkette PLSQL developer olarak çalışmaktayım. İlgi alanlarım ve bildiğim teknolojiler; PLSQL, Oracle forms/reports, Oracle Administration

İlginizi Çekebilir

SQL Server ile Veri Şifreleme

Bilgi teknolojilerinde verinin güvenliği çok kritik bir öneme sahiptir. Önemli verileri korumak için ekstra bir …

Bir Cevap Yazın