Responder a este comentário
Como interpretar o formato dos endereços de ROWID , Partnum, Physical Address, Logical Page
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
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
- 681 leituras




