BTREE(3)

NOME
btree - método de acesso a banco de dados 'btree'

SINÓPSE
#include <sys/types.h>
#include <db.h>

DESCRIÇÃO
A rotina dbopen é a interface de biblioteca para arquivos de banco de dados. Um dos formatos de arquivo suportados são os arquivos 'btree'. A descrição geral dos métodos de acesso a banco de dados está em dbopen(3), esta página de manual descreve somente informações específicas de 'btree'.

A estrutura de dados 'btree' é uma estrutura de árvore ordenada e balanceada que armazena pares associados chave/dados.

A estrutura de dados específica do método de acesso 'btree', fornecida para dbopen, é definida no arquivo 'include' <db.h>, como segue:

typedef struct {
    u_long flags;
    u_int cachesize;
    int maxkeypage;
    int minkeypage;
    u_int psize;
    int (*compare)(const DBT *key1, const DBT *key2);
    size_t (*prefix)(const DBT *key1, const DBT *key2);
    int lorder;
} BTREEINFO;

Os elementos desta estrutura são como segue:

flags
    O valor de flags é especificado por or'ing qualquer um dos seguintes valores:

    R_DUP
        Permite chaves duplicadas na árvore, isto é, permite inserção se a chave a ser inserida já existe na árvore. O comportamento padrão, como descrito em dbopen(3), é sobreescrever uma chave encontrada quando se insere uma nova chave, ou falhar se o sinalizador R_NOOVERWRITE é especificada. O sinalizador R_DUP é sobreposta pelo R_NOOVERWRITE, e se R_NOOVERWRITE é especificado, uma tentativa de inserir chaves duplicadas na árvore falhará.

        Se o banco de dados contém chaves duplicadas, a ordem de recuperação dos pares chave/dados é indefinido se a rotina get é usada, porém, chamadas de rotinas seq com o sinalizador R_CURSOR selecionado sempre retornará o 'primeiro' lógico ou qualquer grupo de chaves duplicadas.

cachesize
    Um tamanho máximo sugerido (em bytes) do 'cache' de memória. Este valor é somente para consulta, e o método de acesso alocará mais memória em vez de falhar. Como cada busca examina a página raiz da árvore, fazer um 'cache' das páginas mais recentemente usadas melhorará substancialmente o tempo de acesso. Além disso, escritas físicas são atrasadas tanto quanto possível, de forma que um cache 'moderado' pode reduzir o número de operações de E/S significativamente. Obviamente, o uso de 'cache' aumenta (mas somente aumenta) a probabilidade de corrupçao ou perda de dados, se o sistema falhar enquanto a árvore está sendo modificada. Se cachesize é 0 (nenhum tamanho é especificado), um cache padrão é usado.

maxkeypage
    O número máximo de chaves que serão armazenadas em uma única página. Não implementado atualmente.

minkeypage
    O número mínimo de chaves que serão armazenadas em uma única página. Este valor é usado para determinar quais chaves serão armazenadas em páginas de sobrecarga, isto é, se uma chave ou item de dado é maior que o tamanho da página dividido pelo valor de minkeypage, será armazenado em páginas de sobrecarga, em vez de armazenar na própria página. Se minkeypage é 0 (nenhum número mínimo de chaves é especificado), é usado o valor 2.

psize
    é o tamanho (em bytes) das páginas usadas para os nós da árvore. O tamanho mínimo da página é de 512 bytes, e o máximo é de 64K. Se psize é 0 (nenhum tamanho de página é especificado), um tamanho de página é escolhido com base no tamanho de bloco de E/S do sistema de arquivos.

compare
    é a função de comparação de chaves. Ela deve retornar um inteiro menor, igual ou maior que zero se o primeiro argumento é considerado, respectivamente, menor, igual ou maior que o argumento da segunda chave. O mesma função de comparação deve ser usada em uma dada árvore toda vez que ela for aberta. Se compare é NULL (nenhuma função de comparação é especificada), as chaves são comparadas lexicamente, com chaves mais curtas consideradas menores do que chaves mais longas.

prefix
    é a função de comparação de prefixo. Se especificada, esta rotina deve retornar um número de bytes do argumento da segunda chave, que é necessário para se determinar que é maior que o argumento da primeira chave. Se as chaves são iguais, o comprimento da chave deve ser retornado. Note, a utilidade desta rotina é muito dependente dos dados, mas, em alguns conjuntos de dados pode produzir tamanhos de árvore e tempos de busca significativamente reduzidos. Se prefix é NULL (nenhuma funcção de prefixo é especificada), e nenhuma função de comparação é especificada, é usada uma rotina padrão de comparação léxica. Se prefix é NULL e uma rotina de comparação é especificada, nenhuma comparação de prefixo é feita.

lorder
    A ordem dos bytes para inteiros nos metadados do banco de dados armazenado. O número deve representar a ordem como um inteiro; por exemplo, a ordem 'big endian' deveria ser o número 4,321. Se lorder é 0 (nenhuma ordem é especificada), é usada a ordem corrente do 'host'.

Se o arquivo já existe (e o sinalizador O_TRUNC não está especificado), os valores especificados para os sinalizadore de parâmetros, 'lorder' e 'psize' são ignorados em favor destes valores usados quando a árvore foi criada.

Buscas sequenciais para frente de uma árvore, da menor chave para a maior.

O espaço liberado pela eliminação dos pares chave/dado da árvore nunca é reivindicado, apesar de ele normamente se tornar disponível para reuso. Isto significa que a estrutura de armazenagem 'btree' é somente-crescente. As únicas soluções são evitar eliminações excessivas, ou criar uma árvore fresca periodicamente a partir da busca de uma árvore existente.

Buscas, inserções e eliminações em uma 'btree' se completarão todas em O lg base N, onde 'base' é o fator médio de preenchimento. Frequentemente a inserção de dados ordenados em 'btrees' resultam em um fator de preenchimento baixo. Esta implementação foi modificada para fazer a inserção ordenada no melhor caso, resultando em um fator de preenchimento de página muito melhor que o normal.

ERROS
As rotinas de método de acesso a btree pode falhar e setar errno para qualquer um dos erros especificados para a rotina de biblioteca dbopen(3).

VEJA TAMBÉM
dbopen(3), hash(3), mpool(3), recno(3).

The Ubiquitous B-tree, Douglas Comer, ACM Comput. Surv. 11, 2 (June 1979), 121-138,

Prefix B-trees, Bayer and Unterauer, ACM Transactions on Database Systems, Vol. 2, 1 (March 1977), 11-26,

The Art of Computer Programming Vol. 3: Sorting and Searching, D.E. Knuth, 1968, pp 471-480.

PROBLEMAS
Somente é suportado ordem de bytes 'bige ndian' e 'littl endian'.

TRADUZIDO POR LDP-BR em 21/08/2000.

  Tradução:
Rubens de Jesus Nogueira <darkseid99@usa.net>

  Revisão.:
André Luiz Fassone <lonely_wolf@ig.com.br>