Mais um blog inútil.

Dezembro 5, 2010

HWM (High Water Mark) Oracle

Filed under: Uncategorized — drune @ 15:09

Bom dia Amigos,

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? Imagine-mos 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 (não consegui fazer o ASCII aqui nesta merda de blol...)

+------------------------------------------+
|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, não querendo entrar em muito pormenor técnico.
Obrigado Caros Leitores.

3 comentários a “HWM (High Water Mark) Oracle”

  1. mirage diz:

    Bom artigo, imagine-i me logo um guru de oracle.

  2. vampire diz:

    Boas estava eu pesquisar no google pelo bus pirate e pimba dei com este blog, muito bom mesmo :)
    Já agora acho que percebes mais de electronica e do bus pirate que eu, tenho umas duvidas para flashar um m25p64 SO16, tua agredecia a tua ajuda .

  3. [...] viaHWM (High Water Mark) Oracle | Mais um blog inútil.. Share this:TwitterFacebookGostar disso:GostoSeja o primeiro a gostar disso post. [...]

Leave a Reply for mirage

widgeon
widgeon
widgeon
widgeon