HWM (High Water Mark) Oracle
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.
Bom artigo, imagine-i me logo um guru de oracle.
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 .
[...] viaHWM (High Water Mark) Oracle | Mais um blog inútil.. Share this:TwitterFacebookGostar disso:GostoSeja o primeiro a gostar disso post. [...]