Entendendo o B-Tree Scanner

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

O B-Tree Scanner é um recurso interno do Informix que tem por objetivo manter as estruturas dos índices otimizadas para evitar degradação na performance de buscas.

  1. Introdução
    1. Quando ele é utilizado?
  2. B-Tree Cleaner (versão antiga)
  3. B-Tree Scanner
  4. Modo de funcionamento
    1. Como escolher entre os modos
    2. Identificando problema de performance
    3. Forçar remoção de itens excluidos
    4. Reiniciar thread
    5. Checagem de indice
  5. Outras refêrencias


Introdução


Ele foi introduzido no Informix versão 7, porém teve seu código práticamente reescrito na versão 9 e então portado de volta para versão 7.31 xD8 .
Ele efetivamente é uma thread interna que é ativada de tempos em tempos :
# Thread na versão 7.31 
$ onstat -g ath |egrep "bt|tid"
 tid     tcb              rstcb            prty status                vp-class      name
 102     c00000008afd97f0 c00000008a36a7f8 2    sleeping secs: 43       1cpu        btclean

# Thread na versão 11.50
$ onstat -g ath |egrep "tid|bt"
 tid     tcb              rstcb            prty status                vp-class       name
 149     29ead2aa8        29e7b40c8        1    yield time             13cpu         btscanner_0

Na primeira versão criada a thread tinha o nome btclean e nas documentações era sempre referênciada como "B-Tree Cleaner", na segunda versão a thread mudou o nome para btscanner e passou a ser referênciada como "B-Tree Scanner".
A diferença entre as duas versões é considerável, principalmente na eficiência de seu trabalho.

A primeira versão não permitia praticamente nenhuma parametrização onde você possuia apenas uma thread e o máximo que conseguia fazer com ela era parar e iniciar ela e ainda assim é de modo "não documentado".
A segunda versão já veio com novas técnologias, muito mais eficiente e parâmetrizavel, permitindo configurar a quantidade de threads, definição de parâmetros, parar/iniciar as threads.

Quando ele é utilizado?


Quando um dado é excluido, alterado ou incluido em uma tabela e estas modificações afetam o indice o B-Tree Scanner/Cleaner é ativado para entrar em ação em seu próximo "loop de wait".

Quando B-Tree Scanner encontra muitos dados excluidos/alterados (com flag de apagado) ele analisa estas páginas e efetivamente remove estes dados, se for necessário ele junta duas ou mais paginas . No caso de inclusões de dados ele verifica a necessidade de dividir a pagina em duas. No final de todo processo ele ainda realiza uma compressão (semelhante ao FILLFACTOR) .
Realizando este serviço ele mantém as páginas de indices balanceadas e sem dados apagados, aumentando a eficiencia do I/O e evitando processamento desnecessário nas buscas.


B-Tree Cleaner (versão antiga)


Não há muito o que falar e o que fazer quando se trabalha com a versão antiga devido as próprias limitações impostas por ela, onde não é possível ter controle sobre seu comportamento.
As informações mais relevantes que se pode aplicar em um ambiente que ainda utiliza ela é parar/iniciar a thread.

B-Tree Scanner


O B-Tree Scanner tem seu funcionamento diferente do B-Tree Cleaner. Trabalha de modo mais eficiente além de ser dinâmico quando se trata de seu funcionamento e parâmetrização.
Na versão atual ele possui três meios de analisar os índices, onde um deles pode ser parâmetrizado para ser utilizado apenas em certas situações ou fixar a utilização para um entre os três modos.

Os três meios para analise são:

  • Leaf: Este é o modo menos eficiente, recomendado apenas para pequenos indices.
    Ele pode ser utilizado em três casos:
    • Quando não é configurado o modo RANGE/ALICE (parâmetros rangesize / alice).
    • Quando é configurado um tamanho máximo do indice para utiliza-lo (parâmetro rangesize).
    • Quando a tabela possui dois ou mais indices do tipo attached, neste caso ele é utilizado independente da configuração realizada.
  • Portanto esta já é uma boa justificativa para não se ter grandes índices do tipo attached, o que não é recomendável. Indices attached são recomendados apenas para tabelas pequenas.
  • Range: É bem mais eficiente que o modo Leaf.
    Ao iniciar uma analise no indice ele define um range de páginas, iniciando com a menor página até a maior página solicitada. Ele faz light scans I/Os o que evita a utilização dos buffers, aumentando a performance.
    O modo range é ativado apenas quando o modo ALICE estiver desativado e o parâmetro rangesize com valor definido.
  • Alice: Sigla para Autonomic Linear Index Cleaning. É o modo mais eficiente de trabalhar, onde o indice é mapeado em pequenos blocos e então quando houver a necessidade de analisar uma pagina, apenas as paginas do bloco serão analisados.
    Este modo é suportado a partir da versão 10 xC5, porém nas primeiras releases ele esteve meio instável e não era recomendado seu uso, ative apenas se estiver trabalhando com o release 10 xC8 ou superior.
    Ele também utiliza light scans I/O evitando os buffers e aumentando a performance.
    Para versão 11, ele já é o modo padrão de trabalho do banco.

Modo de funcionamento


A parametrização do B-Tree Scanner é feita inicialmente pelo ONCONFIG, parametro BTSCANNER
BTSCANNER [num=scanner_threads][,threshold=dirty_hits][,rangesize=size]
          [,alice=mode][,compression=level]

# threshold  : Quantidade de alterações realizadas em um indice para 
#              que ele ganhe prioridade na analise (hot-list).
# rangesize  : Tamanho máximo em KBytes do tamanho do indice (ou partição)
#              para que seja utilizado o modo Leaf.
# alice      : Se informado valor > 0, ativa o modo ALICE e define a configuração 
#              do modo de trabalho .
# compression: Define qual será o nível de compressão aplicado nas páginas
#              analisadas. Este nível de compressão é semelhando ao realizado 
#              pelo FILLFACTOR

Os parâmetros podem ser dinâmicamente alterados através do comando onmode -C ou SqlAdmin API e monitorados pelo comando onstat -C


Como escolher entre os modos


Quando definido os parâmetros no ONCONFIG, se informado o parâmetro alice= com valor maior ou igual a 1 o modo ALICE será utilizado. Para utilizar o modo RANGE é necessário definir o parâmetro alice igual a 0 (zero) e definir um valor no parâmetero rangesize.
Exemplos
    # Cria 2 threads e utiliza modo LEAF
    BTSCANNER num=2,threshold=10000,rangesize=-1,compression=low
    
    # Cria 1 threads e utiliza modo LEAF para indices (partição) com menos
    # de 1 MByte, para indice maiores será utilizado o modo RANGE
    BTSCANNER num=1,threshold=10000,rangesize=1000,alice=0,compression=med
    
    # Cria 4 threads e utiliza modo LEAF para indices (partição) com menos
    # de 50 MByte, para indice maiores será utilizado o modo ALICE
    BTSCANNER num=4,threshold=10000,rangesize=50000,alice=6,compression=high
    
    # Em todos os exemplos acima, quando um indice tiver mais de 10.000 
    # modificações antes que seja analisado ele será incluido no hot-list
    


Identificando problema de performance


Há situações que o B-Tree Scanner pode afetar a performance do banco de dados, onde ele passa a analisar um índice que teve muitas alterações , se este índice tiver um tamanho considerável este processo pode levar um tempo, gerando um alto I/O e utilização de CPU.
Isso normalmente ocorre quando ele está configurado para trabalhar com modo LEAF ou o modo ALICE não está bem definido.
Para identificar estas situações , monitore o banco de dados com os comandos:
  • onstat -C: Conforme documentações da IBM, se na parte "outstands request" tiver mais de 100.000 itens, pode-se considerar com sérios problemas.
    Válido apenas para o B-Tree Cleaner (IDS versão < 7.31 xD8)
  • onstat -g act: Observe com qual frequencia a thread btscanner aparece.
  • onstat -g spi: Observar para o item btclnr se a coluna "Avg Loop/Wait" possui altos valores .
  • onstat -C: Verificar se não está configurado para trabalhar no modo LEAF.

Forçar remoção de itens excluidos


Este item é válido para todas as versões (antiga e atual), onde ao executar um UPDATE STATISTICS que leia o índice, este automaticamente ativa o B-Tree Scanner para remover os itens marcados como apagados.


Reiniciar thread


Para reiniciar a thread nas versões do Informix que ainda utilizam o B-Tree Cleaner (IDS < 7.31 xD8) deve-se ativar uma variável e então utilizar o comando onmode
    $ export KVLOCKING_TEST=1
    # Para parar a thread
    $ onmode -C 1 
    # Para iniciar a thread
    $ onmode -C 0 
    

Para reiniciar a thread nas versões mais recentes, utilize o comando onmode -C start / stop.


Checagem de indice


Até a versão 10, é possível ativar através do parâmetro CCFLAGS com valor igual a 0x20 a checagem do indice, onde ao analisar um indice a thread também valida sua estrutura. Caso encontre algum probema um Assert Failed é gerado.
Não há documentações se este parâmetro é válido para versão 11.


Outras refêrencias


Artigo no site da IBM: Understand the Informix Dynamic Server B-tree scanner
Artigo no site ONINIT (muito bom): BTScanner

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.