Oracle’da High Water Mark Kavramı

Herkese selam, bu yazımda sizlere Oracle’daki HWM(High Water Mark) kavramından ve HWM’nin olası gözden kaçabilecek etkilerinden bahs etmek istiyorum.

Öncelikle High Water Mark’ın kısaca ne olduğundan bahs edelim.

High Water Mark: HWM’yi basit olarak bir pointer olarak düşünebiliriz. Bu pointer bir tablo için kullanılan en son data block’un yerini göstermektedir. Örneğin bir tabloyu yarattığımızda henüz tabloda kayıt olmadığını varsayarsak HWM ilk etapta başlangıç data block’unu gösterecektir. Tablo insert aldıkça High Water Mark dolan son data block’u gösterecektir. Aşağıdaki şekilde bu durumu gözlemleyebilirsiniz.

Tablo her insert aldığında High Water Mark’ın seviyesi yükselecektir. Peki HWM’nin gösterdiği nokta hangi işlem için kullanılmakta.? Cevabı tahmin etmek çokta zor değil. Oracle Full Table Scan yapan sorgularda hangi data block’a kadar okuma yapacağını HWM’nin nerede olduğuna bakarak karar vermektedir. HWM nereyi gösteriyorsa o noktaya kadar olan data bloklar tablo kapsamında okunacaktır. Böylelikle tablodaki tüm bilgiler okunmuş olacaktır. Peki tablodan data silindiğinde(delete operasyonu uygulandığında) HWM’nin konumu nasıl değişecektir.? Bu sorunun cevabına aşağıdaki şekilden bakalım.

Şekilden’de görüldüğü gibi taboldan belli bir sayıda kayıt delete edildiğinde, hatta tablonun tamamı delete edildiğinde bile HWM’nin konumu değişmemektedir. İşte dikkat edilmesi gerek tehlikeli durum bu noktadan sonra başlıyor.

Tablomuzdaki tüm bilgiyi delete yöntemi ile sildiğimizde dahi HWM’nin yerinin değişmediğini söyledik. Tabloda hiç bir bilgi olmamasına rağmen bu tabloya erişmek için full table  scan planı çıkarılan bir sorguda (Örneğin tabloda kayit olup olmadığını anlmak için yazacağımız select count(*) sorgusu) HWM’nin gösterdiği noktaya kadar sistem I/O yapmak durumunda kalacak. Tabloda döndürülecek kayıt olmamasına rağmen boş yere bu kadar I/O yapılması sorgu performanslarımızı kötü yönde etkileyecektir.

Şimdi bir örnekle bu etkiyi inceleyelim.

1- 2 Kolonu olan bir tablo yaratalım.

CREATE TABLE hwm_deneme(col NUMBER,col2 VARCHAR2(50));

2- Daha Sonra HWM şuan başlangıç konumundayken tablomuza bir count sorgusu atalım ve ne kadar sürdüğüne bakalım.

SET timing on;
SELECT COUNT (*)
FROM hwm_deneme;
–Elapsed: 00:00:00.25

3- HWM’nin konumunu değiştirmek için tabloya 10 Milyom kayıt yazalım ve bu 10 milyon kayıdı silip yeniden bir count sorgusu atıp ne kadar sürdüğüne bakalım.

BEGIN
FOR i IN 1 .. 10000000
LOOP
EXECUTE IMMEDIATE ‘INSERT INTO hwm_deneme
VALUES (:i, ”HWM_DENEME”)’
USING i;
END LOOP;

COMMIT;
END;

–Tablodaki tüm kayitları temizleyim.

SET timing on;
DELETE      hwm_deneme;

SET timing on;
SELECT COUNT (*)
FROM hwm_deneme;
–Elapsed: 00:00:02.06

Evet örnekten de görüldüğü gibi tablomuzda kayıt olmamasına rağmen HWM’nin gösterdiği yer insert işlemi sonunda gösterdiği nokta olduğu için Oracle boş yere I/O yapmak zorunda kalmıştır. Bundan dolayı sorgumuzun çalışma süresi, tabloyu ilk yarattığımızda çalıştırdığımız sorgumuzun süresine göre daha yavaş olmuştur.

Peki HWM’nin yerini nasıl değiştirebiliriz.?

HWM’nin konumunu değiştirmenin birkaç yolu var. Bunlardan biri tablonun içindeki tüm kayıtları sildiğimiz durumu düşünürsek bu işlemi delete ile yapmak yerine TRUNCATE söz deyimini kullanarak yapmaktır.  Truncate ile tablo içindeki kayıtları sildiğimizde HWM başlangıç noktasını gösterecektir. Ancak TRUNCATE işleminin ROLLBACK edilemiyeceği unutulmamalıdır. Aksi takdirde yanlışlıkla TRUNCATE ettiğimiz tablodaki datayı geri getiremeyiz.!!!.

Diğer bir yöntem ise Alter Table tablo_adi Move; işlemidir.  Bu işlemi uygulayarak HWM’in altında kalan ancak silinmiş yada boş olan alanlarında kullanılması sağlanarak HWM aşağılara çekilebilmektedir. Ancak bu case’de dikkat edilmesi gereken durum Oracle kayıtları boş blocklara taşırken kayıtların rowid lerinde değişim olma söz konusudur. Bu durumda rowid üzerinden kurulacak index yapısını ortadan kaldıracaktır. Bu işlem yapıldıktan sonra rowid üzerinden yeniden index yaratmak gerekecektir.

Başka bir yöntem ise Alter Table tablename shrink space; cümlesini yazmaktır. Bu cümle ilede HWM’ın gösterdiği yeri değiştirip full table scan performansımızı arttırabiliriz.

Bu yazıda High Water Mark yapısını ve bu yapının Full Table Scan performansımızı nasıl etkilediğini ayrıntılı şekilde inceledik. Full Table Scan performansımızın artması konusunda bir çalışma yapmak istiyorsak HWM’yi kontrol altında tutmak işimizi görecektir.

 

Kaynaklar:

1- http://docs.oracle.com/

2- “Expert Oracle Database Architecture 2011″, Tom KYTE

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Oracle, Uncategorized and tagged , , , , , , , , , , . Bookmark the permalink.

10 Responses to Oracle’da High Water Mark Kavramı

  1. Pingback: Veriye Etkin Erişim Yöntemleri – 2 | Emrah METE

  2. It’s an remarkable article in favor of all the web viewers; they will get benefit from it I am sure.

  3. Pingback: Data/Tablo Silme ve HWM Kavramı | alimesut

  4. Bekar says:

    çox sağ olun, çox gözəl izah etmisiz. təşəkkür edirəm!

  5. Pingback: Oracle Dersleri 4 Oracle’da High Water Mark Kavramı | Murat Bilginer

  6. martineden87 says:

    Merhaba,
    Shrink space komutunu kullanarak programımın performansını artırmaya çalışıyorum.
    EXECUTE IMMEDIATE ‘alter table xxtest.xxtable shrink space’;

    İki sorum olucaktı.
    Bu işlemden sonra analyze etmek gerekir mi?
    shrinc space “compact” gibi komutlar var bunları eklemek gerekir mi?

    Tşkler 🙂

    • Shrink operasyonu sonucunda tablodaki toplam datablock miktarı değişebileceğinden best practice olarak istatistik toplatmanız faydalı olabilir diye düşünüyorum.
      İkinci soruya gelecek olursak. Daha önce kullanmadığım belirterek şunu söylemek isterim, compact komutu High Water MArk’ın yerini değiştirmiyor diye biliyorum. High Water Mark’ın yerini değiştirmek için compact opsyonsuz bir shirck operasyonu yapmakta fayda olabilir. Aşağıdaki linkten detaylı inceleyebilirsiniz.

      https://oracle-base.com/articles/10g/space-object-transaction-management-10g

  7. Pingback: 4 Oracle Dersleri 4 Oracle’da High Water Mark Kavramı – Online Oyun Hileleri.net – Wolfteam, Metin2 Hileleri

  8. Pingback: Oracle Eğitimleri - Oracle’da High Water Mark Kavramı

  9. Pingback: Oracle Eğitimleri - Oracle’da High Water Mark Kavramı

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s