12 Şubat 2008 Salı

HWM (High Water Mark)

HWM yani High Water Mark, Oracle'da segmentleri kullanılan ve kullanılmayan bloklar olmak üzere böler. High Water Mark'ın altında kalan blocklarda veri bulunuyor demektir ve silinebilir.
Dolayısıyla Oracle "Full Table Scan" yaparken HWM'ın altında kalan yerleri tarar. Oracle'da HWM asla inmez ve sürekli artan bir grafik çizer. Bu grafik ise kullanıcının tabloya girdiği verilerle ilişkilidir. Tablo extent ve blocklar aldıkça, HWM'da genişlemeye devam eder. Yüksek kayıtlı bir tablonun verileri az kayıtlı bir tabloya göre daha yavaş getirmesinin ana sebebi budur.
Ne yazık ki Oracle'da HWM'ı otomatik olarak düşüren bir yapı yoktur. Bir tablodan "delete from" komutu ile silinen kayıtların HWM'ı her zaman sabit kalır. Ve azalmadığı içinde her zaman full table scan eski HWM kadar kayıt olduğunu zannederek tabloyu tarar. Bundan kurtulmanın bir takım yolları vardır.

"alter table move;" diyerek tablo'nun rowid'lerini değiştirir. Buda öncelikle o rowidler üzerine çalışan index varsa kırılmasına sebep olur. Aynı zamanda da HWM'ın da o an tablodaki kayıt kadar extent ve block'a inmesini sağlar.
Bir başka yol ise "row movement"dır. "alter table enable row movement" diyerek o tablonun rowidlerinin hareket edebilmesini sağlarız. Ardından da "alter table shrink space compact" diyerek HWM'ın gördüğü boş alanlardaki çarpık duran verileri defragment ederiz. Son olarak "alter table shrink space" diyerekde HWM'ın gördüğü yüksek blockları tablonun normal blocklarına indiririz.

HWM, production veri tabanları için çoğu zaman baş ağrısı yaratabilen bir durum olabileceği gibi fark edilmeside zaman alabilir. "user_segments, dba_segments" bunlardan gerekli bilgiler toplanabilir.

İyi çalışmalar,

Ogan

Hiç yorum yok:

Takip et: @oganozdogan