BTREE(3) Podręcznik programisty Linuksa BTREE(3)

btree - metoda dostępu do bazy btree

#include <sys/types.h>
#include <db.h>

Ważna uwaga: Ta strona podręcznika ekranowego opisuje interfejsy dostarczane przez bibliotekę glibc aż do wersji 2.1. Od wersji 2.2 glibc już nie zawiera tych interfejsów. Najprawdopodobniej to, czego szukasz, to API dostarczane przez bibliotekę libdb.

Funkcja dbopen() stanowi interfejs biblioteczny do plików baz danych. Jednym z obsługiwanych formatów są pliki btree. Ogólny opis metod dostępu do baz danych znajduje się w dbopen(3), a ta strona podręcznika opisuje jedynie informacje specyficzne dla btree.

Struktura danych btree stanowi uporządkowaną, zrównoważoną strukturę drzewiastą, przechowującą powiązane pary klucz/dane.

Specyficzna dla metody dostępu btree struktura danych używana przez dbopen(3) jest zdefiniowana w pliku nagłówkowym <db.h> następująco:


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

Struktura ta zawiera następujące elementy:

flags
Wartość znacznika jest określona przez alternatywę bitową (OR) dowolnych z następujących wartości:
R_DUP
Zezwala na powtarzające się w drzewie klucze, tzn. pozwala dodawać klucze, które już w drzewie istnieją. Domyślnym zachowaniem, jak opisano w dbopen(3), jest nadpisywanie istniejącego pasującego klucza podczas wprowadzania nowego klucza lub niepomyślne zakończenie, gdy podany jest znacznik R_NOOVERWRITE. Znacznik R_DUP jest nadpisywany przez znacznik R_NOOVERWRITE; gdy znacznik R_NOOVERWRITE jest podany, próba dodania do drzewa klucza, który już istnieje, zakończy się niepowodzeniem.
Jeśli baza danych zawiera powtarzające się klucze, kolejność pobierania kluczy/danych za pomocą funkcji get jest niezdefiniowana, jednakże, wywołania funkcji seq z ustawionym znacznikiem R_CURSOR zawsze zwrócą logicznie "pierwszy" z dowolnej grupy powtarzających się kluczy.
cachesize
Sugerowany maksymalny rozmiar (w bajtach) bufora w pamięci. Wartość ta stanowi jedynie zalecenie, więc metoda dostępu raczej przydzieli więcej pamięci niż zawiedzie. Ze względu na to, że każde poszukiwanie bada stronę korzenia drzewa, buforowanie najczęściej używanych stron istotnie skróci czas dostępu. Dodatkowo, fizyczne zapisy będą opóźnione na tyle, na ile będzie to możliwe, więc umiarkowany bufor może istotnie zmniejszyć liczbę operacji wejścia/wyjścia. Oczywiście, korzystanie z bufora zwiększa (ale jedynie zwiększa) prawdopodobieństwo uszkodzenia lub utraty danych, jeśli system ulegnie awarii podczas gdy drzewo jest modyfikowane. Jeśli cachesize wynosi 0 (nie podano rozmiaru) używany jest bufor domyślny.
maxkeypage
Maksymalna liczba kluczy, które będą przechowywane w ramach pojedynczej strony. Aktualnie nie zaimplementowane.
minkeypage
Minimalna liczba kluczy przechowywanych w ramach pojedynczej strony. Wartość ta służy do określania, które klucze będą przechowywane w stronach nadmiarowych, to jest jeśli klucz lub element danych jest większy niż rozmiar strony podzielony przez wartość minkeypage, będzie on przechowywany w stronie nadmiarowej, zamiast w stronie właściwej. Jeśli minkeypage wynosi 0 (nie podano minimalnej liczby kluczy), użyta zostanie wartość 2.
psize
Rozmiar strony jest rozmiarem (w bajtach) stron używanych przez węzły drzewa. Minimalny rozmiar strony wynosi 512 bajtów, a maksymalnym rozmiarem jest 64KiB. Jeśli psize wynosi 0 (nie podano rozmiaru strony), rozmiar strony jest wybierany w oparciu o rozmiar bloku używanego systemu plików.
compare
Compare jest funkcją porównywania kluczy. Musi ona zwracać liczbę całkowitą mniejszą, równą lub większą od zera, gdy klucz będący pierwszym argumentem jest, odpowiednio, mniejszy, równy, większy niż klucz będący drugim argumentem. Dla danego drzewa przy każdym jego otwarciu musi być używana ta sama funcja porównawcza. Jeśli compare ma wartość NULL (nie podano funkcji porównawczej), klucze będą porównywane leksykalnie, przy czym krótsze klucze będą uważane za mniejsze niż klucze dłuższe.
prefix
Prefix jest funkcją porównywania przedrostków. Jeśli zostanie podana, musi ona zwracać liczbę bajtów argumentu będącego drugim kluczem, które są niezbędne dla określenia czy jest on większy niż klucz będący pierwszym argumentem. Gdy klucze będą równe, powinna zostać zwrócona długość klucza. Uwaga, przydatność tej funkcji silnie zależy od danych, jednak dla pewnych zbiorów danych jej używanie może prowadzić do istotnie zmniejszonych rozmiarów drzewa i krótszych czasów poszukiwania. Jeśli prefix ma wartość NULL (nie podano funkcji prefix) oraz nie podano funkcji porównawczej, użyta zostanie domyślna funkcja porównywania leksykalnego. Jeśli prefix ma wartość NULL i podano funkcję porównawczą, nie będzie wykonywane porównywanie przedrostków.
lorder
Kolejność bajtów dla liczb całkowitych w przechowywanych metadanych bazy. Liczba powinna reprezentować kolejność jako liczbę całkowitą; na przykład, porządek grubokońcy byłby liczbą 4,321. Jeśli lorder wynosi 0 (nie podano kolejności) użyta zostanie aktualna, systemowa kolejność.

If the file already exists (and the O_TRUNC flag is not specified), the values specified for the arguments flags, lorder, and psize are ignored in favor of the values used when the tree was created.

Liniowe przeglądanie drzewa "do przodu" odbywa się od najmniejszego klucza do największego.

Przestrzeń zwolniona przez usunięcie par klucz/dane z drzewa nie jest nigdy odzyskiwana, jednakże, jest ona normalnie dostępna dla ponownego użycia. Oznacza to, że struktura przechowująca drzewo btree może jedynie rosnąć. Jedynym rozwiązaniem jest unikanie nadmiernego usuwania lub okresowe tworzenie świeżego drzewa na podstawie przeglądania istniejcego drzewa.

Przeszukiwania, wstawiania i usunięcia w btree odbywają się w czasie O lg base N, gdzie base jest czynnikiem średniego wypełnienia. Często, wprowadzanie do drzew btree danych uporządkowanych prowadzi do niskiego czynnika wypełnienia. Ta implementacja została zmodyfikowana, aby uczynić uporządkowane wprowadzanie najkorzystniejszym przypadkiem, uzyskując w wyniku tego dużo lepszy niż normalnie czynnik wypełnienia stron.

Funkcje metod dostępu btree mogą zawieść i ustawić errno dla dowolnego z błędów podanych w podręczniku funkcji bibliotecznej dbopen(3).

Obsługuje jedynie ostrokońcy i grubokońcy porządek bajtów.

dbopen(3), hash(3), mpool(3), recno(3)

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

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

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

Angielska wersja tej strony pochodzi z wydania 5.11 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.

Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>, Robert Luberda <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres manpages-pl-list@lists.sourceforge.net.

21 grudnia 2020 r.