Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1 Prawdziwe „globalne” baz danych — kluczowa broń — są znane od dawna, ale do tej pory niewielu potrafi efektywnie z nich korzystać lub wręcz nie ma dostępu do tej superbroni.

Jeśli wykorzystasz globalne w rozwiązaniach, w których faktycznie są skuteczne, możesz osiągnąć znakomite wyniki. Czy to w wydajności, czy w uproszczeniu rozwiązania problemu (1, 2).

Globalne to specjalny sposób przechowywania i przetwarzania danych, zupełnie różny od tabel w SQL. Pojawiły się w 1966 roku w języku M(UMPS) (ewolucyjna kontynuacja — Caché ObjectScript, dalej COS) w bazach danych medycznych i do tej pory są tam aktywnie wykorzystywane, a także przeniknęły do niektórych innych dziedzin, gdzie wymagana jest niezawodność i wysoka wydajność: finanse, trading itd.

Globalne we współczesnych systemach baz danych obsługują transakcje, rejestrowanie, replikację, partycjonowanie. Można na nich budować nowoczesne, niezawodne, rozproszone i szybkie systemy.

Globalne nie ograniczają cię do ram modeli relacyjnych. Dają swobodę w rozwijaniu struktur danych dostosowanych do konkretnych zadań. Dla wielu aplikacji rozsądne wykorzystanie globalnych może być prawdziwą tajną bronią, zapewniając wydajność, o której twórcy aplikacji relacyjnych mogą tylko marzyć.

Globalne jako sposób przechowywania danych można wykorzystywać w wielu współczesnych językach programowania, zarówno wysokopoziomowych, jak i niskopoziomowych. Dlatego w tym artykule skoncentruję się na globalnych, a nie na języku, z którego one powstały.

2. Jak działają globalne

Zacznijmy od wyjaśnienia, jak działają globalne i jakie są ich mocne strony. Na globalne można spojrzeć z różnych perspektyw. W tej części artykułu będziemy je postrzegać jako drzewa. Lub jako hierarchiczne magazyny danych.

Mówiąc w uproszczeniu, globalne to trwała tablica. Tablica, która automatycznie zapisuje się na dysku.
Trudno wyobrazić sobie coś prostszego do przechowywania danych. W kodzie (w językach COS/M) różni się od zwykłej tablicy asocjacyjnej tylko symbolem ^ przed nazwą.

Aby zapisać dane w globalnym, nie trzeba uczyć się języka zapytań SQL, polecenia do pracy z nimi są bardzo proste. Można je opanować w ciągu godziny.

Zacznijmy od najprostszego przykładu. Jednopoziomowe drzewo z 2 gałęziami. Przykłady zostały napisane w COS.

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1

Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"



Podczas wstawiania informacji do globalnego (polecenie Set) automatycznie zachodzą 3 rzeczy:

  1. Zapis danych na dysk.
  2. Indeksowanie. To, co znajduje się w nawiasach, jest kluczem (w literaturze anglojęzycznej — „subscript”), a po prawej stronie od znaku równości — wartością („node value”).
  3. Sortowanie. Dane są sortowane według klucza. W dalszej kolejności podczas przeglądania tablicy pierwszym elementem będzie „Sergey Smith”, a drugim „John Sidorov”. Przy pobieraniu listy użytkowników z globala baza nie traci czasu na sortowanie. Można też zażądać zwrócenia posortowanej listy, zaczynając od dowolnego klucza, nawet nieistniejącego (wyjście rozpocznie się od pierwszego rzeczywistego klucza, który następuje po nieistniejącym).

Wszystkie te operacje odbywają się niezwykle szybko. Na domowym komputerze osiągałem wartości do 750 000 wstawek/s w jednym procesie. Na procesorach wielordzeniowych wartości mogą osiągnąć dziesiątki milionów wstawek/s.

Oczywiście sama prędkość wstawiania niewiele mówi. Można na przykład bardzo szybko zapisywać informacje do plików tekstowych — tak według plotek działa przetwarzanie Visa. Jednak w przypadku globali otrzymujemy zorganizowane, zaindeksowane repozytorium, z którym można później łatwo i szybko pracować.

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1

  • Najsilniejszą stroną globali jest prędkość wstawiania nowych węzłów.
  • Dane w globalu są zawsze zaindeksowane. Ich przeglądanie odbywa się zarówno na jednym poziomie, jak i w głębokości drzewa, zawsze szybko.

Dodajmy do globalu jeszcze kilka gałęzi drugiego i trzeciego poziomu.

Set ^a("+7926X", "city") = "Moskwa"
Set ^a("+7926X", "city", "street") = "Plac Req"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "Londyn"
Set ^a("+7916Y", "city", "street") = "Baker Street"
Set ^a("+7916Y", "age") = 36

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1

Jasne jest, że na podstawie globali można budować wielopoziomowe drzewa. Dostęp do każdego węzła jest prawie natychmiastowy dzięki automatycznemu indeksowaniu podczas wstawiania. Na każdym poziomie drzewa wszystkie gałęzie są posortowane według klucza.

Jak widać, informacje można przechowywać zarówno w kluczu, jak i w wartości. Łączna długość klucza (suma długości wszystkich indeksów) może osiągać 511 bajtów, a wartości 3.6 MB dla Caché. Liczba poziomów w drzewie (liczba wymiarów) — 31.

Jeszcze ciekawy moment. Można skonstruować drzewo, nie określając wartości węzłów wyższych poziomów.

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1

Ustaw ^b("a", "b", "c", "d") = 1
Ustaw ^b("a", "b", "c", "e") = 2
Ustaw ^b("a", "b", "f", "g") = 3

Puste węzły to węzły, którym nie przypisano wartości.

Aby lepiej zrozumieć globalne, porównajmy je z innymi drzewami: z drzewami ogrodowymi i z drzewami nazw systemów plików.

Porównajmy drzewa w globalnych z najbardziej znanymi nam strukturami hierarchicznymi: z drzewami, które rosną w ogrodach i na polach, oraz z systemami plików.

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1

Jak widzimy, w drzewach ogrodowych liście i owoce znajdują się tylko na końcach gałęzi.
W systemach plików informacje są przechowywane tylko na końcach gałęzi, które są pełnymi nazwami plików.

A oto struktura danych globalnych.

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1Różnice:

  1. Wewnętrzne węzły: informacje w globalnych mogą być przechowywane w każdym węźle, a nie tylko na końcach gałęzi.
  2. Zewnętrzne węzły: globalne muszą mieć zdefiniowane wartości na końcach gałęzi, a w drzewach systemów plików i drzew ogrodowych - nie.



W przypadku niektórych wewnętrznych węzłów można powiedzieć, że struktura globalnych jest nadzbiorem struktury drzew nazw w systemach plików i drzew ogrodowych. Tzn. bardziej elastyczna.

Ogólnie rzecz biorąc, globalne reprezentują uporządkowane drzewo z możliwością przechowywania danych w każdym węźle.

Aby lepiej zrozumieć działanie globalnych, wyobraźmy sobie, co by było, gdyby twórcy systemów plików użyli do przechowywania informacji podejścia analogicznego do globalnych?

  1. Przy usunięciu jednego pliku w katalogu automatycznie usunięto by katalog, a także wszystkie katalogi nadrzędne, które zawierałyby tylko jeden właśnie usunięty katalog.
  2. Potrzeba katalogów by zniknęła. Po prostu byłyby pliki z podplikami i pliki bez podplików. Jeśli porównać to z zwykłym drzewem, każda gałąź stałaby się owocem.

    Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1

  3. Takie rzeczy jak pliki README.txt mogłyby zniknąć. Wszystko, co należało powiedzieć o zawartości katalogu, można by zapisać w samym pliku katalogu. W przestrzeni ścieżek nazwa pliku nie różni się od nazwy katalogu, dlatego można by obejść się jednymi plikami.
  4. Szybkość usuwania katalogów z podkatalogami i plikami znacznie by się zwiększyła. Wiele razy na Habrze można było natknąć się na artykuły o tym, jak długo i trudno jest usuwać miliony małych plików (1, 2). Jednak zbudowanie systemu pseudoplików na globalu zajmie sekundy lub ich części. Gdy testowałem usuwanie poddrzew na domowym komputerze, w ciągu 1 sekundy usuwałem od 96 do 341 milionów węzłów z dwupoziomowego drzewa na HDD (nie SSD). Mowa tu o usuwaniu części drzewa, a nie jedynie całego pliku z globalami.

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1
Usuwanie poddrzew to kolejna mocna strona globali. Do tego nie potrzeba rekurencji. Dzieje się to niesamowicie szybko.

W naszym drzewie można to zrobić poleceniem Kill.

Kill ^a("+7926X")

Globalne — miecze-klamki do przechowywania danych. Drzewa. Część 1

Aby lepiej zrozumieć, jakie działania możemy podjąć wobec globali, przedstawiam krótką tabelę.

Podstawowe polecenia i funkcje do pracy z globalami w COS

Set
Ustawienie gałęzi do węzła (jeśli jeszcze nie są określone) i wartości węzła

Merge
Kopiowanie poddrzewa

Kill
Usuwanie poddrzewa

ZKill
Usunięcie wartości konkretnego węzła. Poddrzewo wychodzące z węzła nie jest dotykane

$Query
Pełne przeszukiwanie drzewa z wnikaniem w głąb

$Order
Przeszukiwanie gałęzi konkretnego węzła

$Data
Sprawdzenie, czy węzeł jest zdefiniowany

$Increment
Atomowe inkrementowanie wartości węzła. Aby nie wykonywać odczytów i zapisów, dla ACID. Ostatnio zaleca się zmianę na $Sequence

Dziękuję za uwagę, jesteśmy gotowi odpowiedzieć na Twoje pytania.

Zrzeczenie się odpowiedzialności: Ten artykuł i moje komentarze do niego są moją opinią i nie mają związku z oficjalnym stanowiskiem korporacji InterSystems.

Kontynuacja Globaly — miecze-kladenice do przechowywania danych. Drzewa. Część 2. Dowiesz się, jakie typy danych można wyświetlić na globalach i w jakich zadaniach przynoszą one największe korzyści.

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster