Como interpretar o formato dos endereços de ROWID , Partnum, Physical Address, Logical Page

Versão para impressãoEnviar para amigoVersão PDF

Entendendo o que é


Comentário pessoal: A nomenclatura utilizada no Informix (exibido pelos comandos) e nos manuais são um pouco confusas, onde as vezes utiliza a mesma nomenclatura para escopos diferentes.
Esta nomenclatura é válida apenas para funções relacionadas ao armazenamento de dados em disco e pagina de dados.

O que é Partnum / TBLspace number?
Tblspace number, também identificado como partnum é um numero interno que todo *fragmento* (espaço alocado) de uma tabela ou indice recebe. Uma tabela ou indice não fragmentada/particionada possui apenas um único partnum. Este valor é unico para toda instancia, ou seja, não se repete mesmo quando há mais de um banco de dados.

O que é Physical Address / Page Address?
É o endereço fisico válido para o Informix, o endereço de dentro de um chunk, pois este é a menor objeto de alocação de espaço que o Informix trabalha.
Há situações que o Informix identifica o endereço fisico de uma tabela, nestes casos ele se refere ao endereço de pagina no chunk onde o "TBLSPACE TBLSPACE" da tabela se encontra.
Em outras situações trata-se apenas de uma pagina de dados.
tblspace tblspace é um tipo de pagina que contém as informações de todos os tblspaces existentes no chunk. Portanto todo chunk possui paginas tblspace tblspace.

O que é Logical Page?
É o endereço lógico de uma pagina em uma partição (partnum), independente da fragmentação dos extents da tabela entre os chunks do dbspace.
Por exemplo, uma tabela de 10 GBytes, em um dbspace que possui 5 chunks de 2 GBytes, o Logical Page possui uma sequencia unica, independente do chunk.
Por utilizar 3 bytes para o endereçamento (0xFFFFFF) possui a limitação de 16.777.215 paginas. Quando o fragmento de uma tabela atinge este limite, o DBA precisa realizar uma manutenção para contornar o problema, onde como solução ele pode reorganizar a tabela em um dbspace com paginas maiores ou fragmentar em mais pedaços a tabela.

O que é ROWID?
É um identificador de um *unico* registro em uma tabela. É um Logical Page extendido, onde além da informação da pagina lógica do registro, também possui o numero do slot de dentro da pagina.

Estrutura do PARTNUM


O PARTNUM é utilizado/exibido nestes locais:
  • Comandos: oncheck -pt, onstat -g ppf , onstat -g opn, onstat -T , onstat -t, etc
  • Tabelas: systables, sysmaster:systabnames, sysfragments, etc
Em grande parte dos comandos ele é ser exibido em valor decimal , é composto pelo numero do dbspace e numero da pagina lógica, assim para identificar o numero do dbspace é necessário converte-lo para hexadecimal.
 Estrutura
 0xDDDppppp
  DDD   = Numero do dbspace  (exibido no comando onstat -d )
  ppppp = Pagina lógica da localização do "tblSpace tblspace" da 
          tabela dentro do dbspace
          Obs.: Baseado em testes, nem sempre este valor é 100% correto, devido 
          situações onde o 'tblspace tblspace' é criado em um segundo chunk. Para
          identificar a localização com exatidão , utilizar o physical address
          fornecido com o comando oncheck -pt

Exemplos
# Identificando o partnum com oncheck
  $ oncheck -pt db_teste:tab_teste2 | grep partnum
     Partition partnum              247463938

  247463938 = 0xEC00002 = EC 0002 = dbspaces 236 + pagina 2 

# Identificando o partnum com SQL
  select partnum, hex(partnum) from systables where tabname = 'tab_teste';

  partnum (expression)
  13631552 0x00D00040

# Utilizando o partnum com onstat (em hexadecimal)
  $ onstat -T | egrep -i "address|D00040"
    n address  flgs ucnt tblnum   physaddr         npages nused  npdata nrows  nextns
  678 4d3b93e0 2    0    d00040   13:590           4      2      1      16     1

# Realizando um dump de *pagina* a partir do partnum
# Observação: é necessário identificar com o valor hexadecimal com "0x" 
  $ oncheck -pp 0xD0003E 2
  addr             stamp    chksum nslots flag type         frptr frcnt next     prev
  13:1306          5023466  a3b1   82     801  DATA         3316  448   0        0       
          slot ptr   len   flg                                                           
          1    24    34    0                                                             
          2    58    48    0                                                             
          3    106   44    0                                                             
          4    150   36    0              

# Realizando um dump de *registros* a partir do partnum
  $ oncheck -pd 0xD0003E 2
  TBLspace data check for teste1:informix.tab1

  page_type  rowid    length fwd_ptr 
  HOME       201      34     0       
      0:  0  0  c b9  0  c  0 2f 62 69 6e 2f 6f 70 65 6e   ...9.../bin/open
     16: 76 74  b 2f 62 69 6e 2f 6f 70 65 6e 76 74  0  0   vt./bin/openvt..
     32:  0 66                                             .f..............

Estrutura do Physical address / Page Address


Estrutura
IDS versão 7.31
  0xCCCooooo 
   CCC   = numero do chunk (em hexadecimal)
   ooooo = offset da pagina dentro do chunk (em hexadecimal)
IDS versão 9.40
  CC:oooooo
   CCC   = numero do chunk (em decimal)
   ooooo = offset da pagina dentro do chunk (em decimal)

Exemplo

# Exibir o "tblspace tblspace" de uma tabela
  $ oncheck -pt teste1:tab1 | grep -i physical
    Physical Address               13:586
  $ oncheck -pP 13 586
  addr             stamp    chksum nslots flag type         frptr frcnt next     prev
  13:586           11319181 b566   5      802  PARTN        196   3876  0        0
          slot ptr   len   flg
          1    24    100   0
          2    124   32    0
          3    156   16    0
          4    172   0     0
          5    172   24    0
  slot   1:
      0: 3e  0 d0  0  2  9  0  0 ff  2  0  0  2  0  0  0   >.P.............
     16:  2  0  0 10 f9  5 49 49 cc 1a  1  0  8  0  0  0   ....y.IIL.......
     32:  8  0  0  0 b8  8  0  0 b8  8  0  0 b7  8  0  0   ....8...8...7...
     48: ff ff ff ff 3e  0 d0  0 52 19  1  0  1  0  0  0   ....>.P.R.......
     64:  0  0  0  0  1  0  0  0  1  0  0  0  0  0  0  0   ................
     80:  1  0  0  0 43  0  0  0 bc 53 74  0  1  0  0  0   ....C...<St.....
     96:  0  0  0  0                                       ................
  slot   2:
      0: 74 65 73 74 65 31  0 69 6e 66 6f 72 6d 69 78  0   teste1.informix.
     16: 74 61 62 31  0 70 74 5f 42 52 2e 38 31 39  0  8   tab1.pt_BR.819..
  slot   3:
      0:  4  0  0  0 f5  1  0  b fb  1  0  0 ff  0  0  8   ....u...{.......
  slot   4:
  slot   5:
      0:  0  0  0  0 16  5  0  0  4  0  0  0 26  5  0  0   ............&...
     16: b8  8  0  0  0  0  0  0                           8...............

# Lista as paginas de uma tabela para pegar o endereço 
 $ oncheck -pe 
 Chunk Pathname                             Pagesize(k)  Size(p)  Used(p)  Free(p)
    11 /ifmxdados/L_dados1.ch1                        2    25000    11073    13927
 Description                                                   Offset(p)  Size(p)
 dbcim:'ix_dbsa'.t_pergunta                                        1649      128
 ....
 Chunk Pathname                             Pagesize(k)  Size(p)  Used(p)  Free(p)
    13 /ifmxdados/L_dados2.ch1                        4    18750     2947    15803
 Description                                                   Offset(p)  Size(p)
 teste1:'informix'.tab1                                             659     2228
 
# Exibe a pagina da tabela "t_pergunta" ( que está em um dbspace com paginação de 2 KB)
 $ oncheck -pP 11 1649 
  addr             stamp    chksum nslots flag type         frptr frcnt next     prev
  11:1649          2434634  2015   1      2801 DATA         1146  894   0        0
          slot ptr   len   flg
          1    24    1122  0
  slot   1:
      0:  0  0  0  8  0 1a  0  0  0  0  0  1  0  0  0 5c   ...............\
     16:  0  0  0  7  0  0  0 63  0  0  0 5f  0  0  0 67   .......c..._...g
     32:  0  3  0  0  0 b0  0 4e  0  0  0  0  0  0  0  0   .....0.N........
     48:  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0   ................
     64:  0  0  0  0  0  0  0  1  0  0  0  0  0 b0  0 4e   .............0.N
     80:  0  0  0 53  0  0  0  0 43 6f 6d 6f 20 6f 20 42   ...S....Como o B
     96: 44 20 73 65 20 63 6f 6d 70 6f 72 74 61 20 61 6f   D se comporta ao

# O offset exibido no oncheck -pe é na unidade de pagina do dbspace, 
# porém o comando oncheck -pP trabalha com o tamanho de pagina do sistema
# (neste caso 2 KB) sendo assim é necessário converter com a seguinte formula:
#  ( [numero da pagina] * [tamanho da pagina] )  / 2 (paginas de 2 KBytes)
#  (       659          *          4          )  / 2  = 1318
# Para confirmar que o valor está correto pode verificar com o comando 
# oncheck -pt no bloco de extents que relaciona as paginas logicas 
# com as paginas fisicas, onde o valor encontrado deverá fazer parte de algum
# dos extents listados. Veja abaixo
 $ oncheck -pt teste1:tab1
   ...
   Pagesize (k)                   4
   ...
      Extents
      Logical Page     Physical Page        Size Physical Pages
                 0           13:1302           4          8
                 4           13:1318        2228       4456

# Exibir a pagina da tabela "tab1" ( um dbspace com paginação de 4 KB)
 $ oncheck -pP 13 1318 
  addr             stamp    chksum nslots flag type         frptr frcnt next     prev
  13:1618          5030214  c755   24     801  DATA         3370  626   0        0       
          slot ptr   len   flg                                                           
          1    24    146   0                                                             
          2    170   160   0                                              
  ...
  slot   1:                                                                              
    0:  0  0  5 ff  0 44  0 2f 6c 69 62 2f 6d 6f 64 75   .....D./lib/modu              
   16: 6c 65 73 2f 32 2e 36 2e 32 35 2e 31 38 2d 30 2e   les/2.6.25.18-0.              
   32: 32 2d 70 61 65 2f 6b 65 72 6e 65 6c 2f 73 6f 75   2-pae/kernel/sou              
   48: 6e 64 2f 69 32 63 2f 6f 74 68 65 72 2f 73 6e 64   nd/i2c/other/snd              
   64: 2d 70 74 32 32 35 38 2e 6b 6f 43 2f 6c 69 62 2f   -pt2258.koC/lib/              
   80: 6d 6f 64 75 6c 65 73 2f 32 2e 36 2e 32 35 2e 31   modules/2.6.25.1              
   96: 38 2d 30 2e 32 2d 70 61 65 2f 6b 65 72 6e 65 6c   8-0.2-pae/kernel              
  112: 2f 73 6f 75 6e 64 2f 69 32 63 2f 6f 74 68 65 72   /sound/i2c/other              
  128: 2f 73 6e 64 2d 70 74 32 32 35 38 2e 6b 6f  0  0   /snd-pt2258.ko..              
  144: 15 f6                                             .v..............      

Estrutura do Logical Page


O Logical Page não possui formatação, ele é apenas uma sequencia numérica.
O Logical Page pode ser obtido dos seguintes modos:
  • Comandos: oncheck -pt , oncheck -pd
  • SQL: select rowid ...
# Exemplos de como visualizar uma pagina através do seu endereço lógico 
# obtido atravé do ROWID. 

# Exibir a pagina lógica 0x9A (154) da tabela tab1 (partnum d0003e) através do 
# comando oncheck -pp
 $ oncheck -pp 0xD0003E 0x9a
   addr             stamp    chksum nslots flag type         frptr frcnt next     prev    
  13:1618          5030214  c755   24     801  DATA         3370  626   0        0       
          slot ptr   len   flg                                                           
          1    24    146   0                                                             
          2    170   160   0                                                             
          3    330   146   0                                                             
          4    476   146   0                                                             
  ...
  slot   1:                                                                              
      0:  0  0  5 ff  0 44  0 2f 6c 69 62 2f 6d 6f 64 75   .....D./lib/modu              
     16: 6c 65 73 2f 32 2e 36 2e 32 35 2e 31 38 2d 30 2e   les/2.6.25.18-0.              
     32: 32 2d 70 61 65 2f 6b 65 72 6e 65 6c 2f 73 6f 75   2-pae/kernel/sou              
     48: 6e 64 2f 69 32 63 2f 6f 74 68 65 72 2f 73 6e 64   nd/i2c/other/snd              
     64: 2d 70 74 32 32 35 38 2e 6b 6f 43 2f 6c 69 62 2f   -pt2258.koC/lib/              
     80: 6d 6f 64 75 6c 65 73 2f 32 2e 36 2e 32 35 2e 31   modules/2.6.25.1              
     96: 38 2d 30 2e 32 2d 70 61 65 2f 6b 65 72 6e 65 6c   8-0.2-pae/kernel              
    112: 2f 73 6f 75 6e 64 2f 69 32 63 2f 6f 74 68 65 72   /sound/i2c/other              
    128: 2f 73 6e 64 2d 70 74 32 32 35 38 2e 6b 6f  0  0   /snd-pt2258.ko..              
    144: 15 f6                                             .v..............       

# Utilizando comando para dump de registro
 $ oncheck -pd 0xD0003E 0x9a
  TBLspace data check for teste1:informix.tab1
  page_type  rowid    length fwd_ptr 
  HOME       9a01     146    0       
      0:  0  0  5 ff  0 44  0 2f 6c 69 62 2f 6d 6f 64 75   .....D./lib/modu
     16: 6c 65 73 2f 32 2e 36 2e 32 35 2e 31 38 2d 30 2e   les/2.6.25.18-0.
     32: 32 2d 70 61 65 2f 6b 65 72 6e 65 6c 2f 73 6f 75   2-pae/kernel/sou
     48: 6e 64 2f 69 32 63 2f 6f 74 68 65 72 2f 73 6e 64   nd/i2c/other/snd
     64: 2d 70 74 32 32 35 38 2e 6b 6f 43 2f 6c 69 62 2f   -pt2258.koC/lib/
     80: 6d 6f 64 75 6c 65 73 2f 32 2e 36 2e 32 35 2e 31   modules/2.6.25.1
     96: 38 2d 30 2e 32 2d 70 61 65 2f 6b 65 72 6e 65 6c   8-0.2-pae/kernel
    112: 2f 73 6f 75 6e 64 2f 69 32 63 2f 6f 74 68 65 72   /sound/i2c/other
    128: 2f 73 6e 64 2d 70 74 32 32 35 38 2e 6b 6f  0  0   /snd-pt2258.ko..
    144: 15 f6                                             .v..............

Estrutura do ROWID


O ROWID pode ser obtido dos seguintes modos:
  • Comandos: oncheck -pd , oncheck -pD
  • SQL: select rowid ...

  0xPPPPPPSS (4 bytes)
  PPPPPP = Numero da Pagina lógica ( logical page) dentro do tblspace (tabela) , 
           tamanho em 3 bytes o que limita o tblspace possuir no máximo 
           0xFFFFFF (16777215) de paginas (pagina de 2k = 32 GB , 4k = 64 GB, 
           8k = 128 GB, etc).
  SS = Slot do registro dentro da pagina (não pode passar de 255 porque é apenas um byte)

# Exemplos 

# Obter o ROWID de um registro
  select first 1 hex(rowid) rowid , * from tab1
  where desc matches "*/snd-pt2258.ko"

  rowid  0x00009A01
  cod    1535
  desc   /lib/modules/2.6.25.18-0.2-pae/kernel/sound/i2c/other/snd-pt2258.ko
  desc2  /lib/modules/2.6.25.18-0.2-pae/kernel/sound/i2c/other/snd-pt2258.ko
  seq    5622

# Exibir o dump da pagina através do ROWID 
 $  oncheck -pd teste1:tab1 0x9a01
  TBLspace data check for teste1:informix.tab1
  page_type  rowid    length fwd_ptr 
  HOME       9a01     146    0       
      0:  0  0  5 ff  0 44  0 2f 6c 69 62 2f 6d 6f 64 75   .....D./lib/modu
     16: 6c 65 73 2f 32 2e 36 2e 32 35 2e 31 38 2d 30 2e   les/2.6.25.18-0.
     32: 32 2d 70 61 65 2f 6b 65 72 6e 65 6c 2f 73 6f 75   2-pae/kernel/sou
     48: 6e 64 2f 69 32 63 2f 6f 74 68 65 72 2f 73 6e 64   nd/i2c/other/snd
     64: 2d 70 74 32 32 35 38 2e 6b 6f 43 2f 6c 69 62 2f   -pt2258.koC/lib/
     80: 6d 6f 64 75 6c 65 73 2f 32 2e 36 2e 32 35 2e 31   modules/2.6.25.1
     96: 38 2d 30 2e 32 2d 70 61 65 2f 6b 65 72 6e 65 6c   8-0.2-pae/kernel
    112: 2f 73 6f 75 6e 64 2f 69 32 63 2f 6f 74 68 65 72   /sound/i2c/other
    128: 2f 73 6e 64 2d 70 74 32 32 35 38 2e 6b 6f  0  0   /snd-pt2258.ko..
    144: 15 f6                                             .v..............

# Para exibir o dump da pagina através do logical page obtido pelo ROWID
# deve-se separar o número da pagina do slot: 0x9a01 = Pagina 0x9a , slot 1
# Para execuçãodo comando veja exemplos do logical page


0
Ainda não votado
Sua avaliação: Nenhum

Comentar

O conteúdo deste campo é privado não será exibido ao público.
  • Endereços de páginas de internet e emails viram links automaticamente.
  • Você pode usar tags BBCode no texto.
  • Tags HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>

Mais informações sobre as opções de formatação

CAPTCHA
Este teste é para bloquear programas automatizados e previnir spams
CAPTCHA de Imagem
Digite o texto exibido na imagem.