HWM – High Water Mark

Hoje vou falar-vos sobre um conceito denominado High Water Mark, ou simplesmente HWM, que basicamente define no Oracle a divisão de um segmento entre blocos usados e blocos livres. Um segmento, para os menos entendidos é um container de objectos, sejam eles tabelas, indices, cache, etc.

Ora então, para que serve isto do HWM? Imaginemos que por exemplo temos uma tabela recentemente criada e que a tabela é basicamente uma estrutura linear, seria parecido com isto:

 

+---- high water mark numa tabela nova
|
v
+-----------------------------------+
HWM| | | | | | | | | | | | | | | | |
HWM| | | | | | | | | | | | | | | | |
+--+--+--+--+--+--+--+--+--+--+--+--+

 

Se conseguirem perceber o desenho, num objecto recém-criado (neste caso tabelas, um pouco diferente do indice) que o HWM começa no primeiro bloco da tabela. Se por exemplo, inserirem 10k registos na tabela terão isto:

High water mark depois de inserir 10,000 registos:

 

+------------------------------------------+
|x |x |x |x |x |x |x |x |x |HWM | | | | | | |
|x |x |x |x |x |x |x |x |x |HWM | | | | | | |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--++

 

 

Como podem reparar no desenho o HWM avançou, sendo clara agora a divisão entre blocos livres e blocos usados. O Oracle pode agora perceber quais são os blocos usados e os livres, e caso, haja necessidade de um FTS (full table scan) apenas o blocos à esquerda (ou abaixo, depende da prespectiva do desenho) do HWM serão lidos. O problema começa agora, quando por exemplo efectuam um DELETE na tabela e apagam por exemplo 1000 registos. A esquematização será a seguinte:

High water mark depois de inserir 10,000 registos e apagar 1000:

 

 

+-----------------------------------------+
|x |x |x |x |x |x |x | | | |HWM | | | | | |
|x |x |x |x |x |x |x | | | |HWM | | | | | |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

 

Como podem perceber o HWM não mexeu, dado que o Oracle não ajusta o HWM em operações DML deste tipo. Isto causa sérios problemas de performance, caso precisem que o Oracle leia todos os blocos usados (FTS, por exemplo)
e à esquerda do HWM existem muitos blocos sem dados e outros com dados. Quando dão por isso, numa BD de >3TB por exemplo com uma elevada dinâmica de DDLs, vão acabar por fazer muita leitura de blocos à esquerda do HWM que não contêm dados. O I/O é bastanto caro actualmente, portanto minimizar a leitura do número de blocos (lendo apenas os realmente com dados) é uma prioridade.

Sugiro assim uma análise ao HWM periodicamente, ajustando o HWM com operações de rebuild,truncate ou shrink, ajustando assim o valor real do HWM.

Havia ainda algumas coisas importantes a dizer sobre o HWM, mas são desinteressantes e não contribuem para o entendimento do conceito em si 🙂

Espero ter sido claro.

 

Nota: Este post foi originalmente escrito por mim para o blol.org

Advertisements

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