Leitura de índices B-Tree – treedump

Pegando no exemplo dado no post anterior e usando o mesmo índice, vamos dar uma olhada mais profunda no índice criado anteriormente (i1). O mecanismo aplicado consegue com muito detalhe dar-nos informações interessantes sobre a constituição do índice B-Tree.

O evento associado é o treedump e permite a partir de um object_id que neste caso vai ser um índice obter um ficheiro de trace com o súmario do índice. Vejamos:


SQL> select object_id from user_objects where object_name = 'I1';

OBJECT_ID
----------
73897

SQL> alter session set events 'immediate trace name treedump level 73897';

Session altered.

Viajando até ao directório que contem o trace (ver parametro user_dump_dest) temos:


----- begin tree dump
branch: 0x415129 4280617 (0: nrow: 445, level: 1)
leaf: 0x41512a 4280618 (-1: nrow: 485 rrow: 485)
leaf: 0x41512b 4280619 (0: nrow: 479 rrow: 479)
leaf: 0x41512c 4280620 (1: nrow: 479 rrow: 479)
leaf: 0x41512d 4280621 (2: nrow: 479 rrow: 479)
leaf: 0x41512e 4280622 (3: nrow: 479 rrow: 479)
....
leaf: 0x41543c 4281404 (441: nrow: 449 rrow: 449)
leaf: 0x41543d 4281405 (442: nrow: 449 rrow: 449)
leaf: 0x41543e 4281406 (443: nrow: 16 rrow: 16)
----- end tree dump

Como foi dito o ficheiro gerado contém a estrutura do índice, nomeadamente uma linha no trace por cada  bloco no índice. Estas linhas estão ordenadas conforme a estrutura da árvore e os números hexadecimais/decimais apresentados são o endereço do bloco.

Vamos então tentar entender o resultado deste dump ao índice:

– A primeia linha representa o root block (nó pai) com profundidade 1 (blevel=1). De lembrar que este índice é apenas (é pequeno) constituido pelo nó pai e pelos nós filhos.

– O nrow=445 significa que no root block (nó pai único) existem 445 apontadores para os nós filhos, assim cada vez que for necessário ler o índice, no root block existirá directamente o apontador para o leaf block correspondente.

De notar e muito _importante_ que numa árvore mais complexa (ou seja blevel > 1), este valor teria outro significado, ou seja, o nrow do root block seria o número de apontadores para os branch blocks. Usando uma imagem será mais fácil de entender:

Indice B-Tree

 

Neste exemplo o root block (denominado aqui 122, não importa o valor) teria um nrows=2, ou seja teria dois apontadores para os nós filhos que neste caso são branch blocks.

– A segunda linha que começa por um estranho -1 (tanto quanto percebi, a contagem inicia em -1 para denominar o primeiro bloco seja branch ou leaf) representa o primeiro leaf block, notado também pois não há level, pois não faz sentido nos leaf blocks.

– O rrow e o nrow nos leaf blocks definem respectivamente o número de linhas no bloco e o seu tamanho no block row directory (um dia explico isto, mas basicamente é um conjunto de informação que diz ao Oracle em cada bloco onde cada linha começa e termina).
De notar também que o rrow = nrow em todos os blocos significa que não houve block split, pois não foi feito nenhum insert após o índice ter sido criado.

– Por fim, a última linha (443) é o último leaf block e como podem ver pelo nrow e pelo rrow não está completo (cheio), pois o valor de 16 é aquém do suportado nos blocos anteriores.  Num insert posterior este valor vai concerteza mudar.

Espero que tenha sido claro, e não usem a metodologia “vou-criar-o-índice-e-depois-logo-se-vê-se-melhora-a-performance”, caso contrário este post é inútil.

Referências:
– Lista de eventos: http://www.adp-gmbh.ch/ora/tuning/diagnostic_events/list.html

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