Thursday, May 15, 2008

High-water mark (HWM)

High-water mark is an indicator or pointer up to which table or index has ever contain data. Suppose we create an empty table , the high-water mark would be at the beginning of the table segment



Unused block or extent occupied by the table segment on initial creation.


After inserting data in the table segment , the HWM moves and point the position up to which the data is in the segment

DATA

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

Un-Used Block

By inserting more data in the table segment, HWM moves further to point the position up to which the data is in the segment

------ DATA-----------------


Un-Used

Blocks

Now let us delete the data and see the pointer of HWM

DATA

-------

Empty Blocks

Un-Used Blocks


Full Table Scan

As you seen above by deleting the data , HWM does not move. The main disadvantage of this is that oracle always read the blocks up to high water mark in case of full table scan . You may have ever notice that doing a count(*) on empty table , takes time to show you 0 rows. The reason for delay is setting of HWM at higher position.


Now the question arises in front of us , how we set the high-water mark at lower position ?

The one way to set the HWM is to truncate a table (but all row will be deleted !). Let us see how truncate set the HWM.

No data in the segmen


HWM is reset now , after truncating data.

Another way is SEGMENT SHRINKING (it will hold all data) . To see how it works please go through the article on Oracle tuning on this blog

Table where lots of deletion or insertion takes place , probably has High HWM. If the HWM is high , it is better to rebuild table segment for performance sake.


Calculate the HWM as follows

HWM % = (HWM BLOCKS - Actual DATA BLOCKS / HWM BLOCKS ) * 100



2 comments:

Anonymous said...

nice one and clear conecpts helped me to understand HWM

Mohammad Hasan Shaharear said...

Thanks for your comment. Feeling glad to know that the topic is useful for the readers