Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1 Истинските глобални бази данни от тип 'глобал' са добре познати, но до сега малцина умеят да ги използват ефективно или изобщо не владеят това супероръжие.

Ако се използват глобалите за решаване на задачи, в които наистина са добри, можете да постигнете изключителни резултати. Или в производителността, или в опростяването на решаването на задачата (1, 2).

Глобалите са специален начин за съхранение и обработка на данни, съвсем различен от таблиците в SQL. Те се появиха през 1966 година в езика M(UMPS) (еволюционно развитие — Caché ObjectScript, по-нататък COS) в медицинските бази данни и се използват активно там , както и навлязоха в някои други области, където се изисква надеждност и висока производителност: финанси, търговия и т.н.Глобалите в съвременните СУБД поддържат транзакции, регистриране, репликация, партициониране. Т.е. на тях може да се изградят съвременни, надеждни, разпределени и бързи системи.

Глобалите не ви ограничават в границите на релационния модел. Те предоставят свобода за разработка на структури от данни, оптимизирани за конкретни задачи. За много приложения разумното използване на глобалите може да бъде истинско тайно оръжие, осигурявайки производителност, за която разработчиците на релационни приложения могат само да мечтаят.

Глобалите като метод за съхранение на данни могат да се използват в много съвременни програмни езици, както високо-, така и ниско ниво. Затова в тази статия ще се фокусирам именно върху глобалите, а не на езика, от който те някога произлизат.

2. Как работят глобалите

Нека първо да разберем как работят глобалите и какви са техните силни страни. На глобалите може да се гледа от различни ъгли. В тази част от статията ще ги разгледаме като дървета. Или като йерархични хранилища на данни.

Определено глобалът е персистентен масив. Масив, който автоматично се съхранява на диск.

Трудно е да си представим нещо по-просто за съхранение на данни. В кода (на езиците COS/M) от обикновения асоциативен масив той се различава само с символа
преди името. ^ За да съхраните данни в глобал, не е нужно да учите SQL език за заявки, командите за работа с тях са много прости. Можете да ги научите за час.

За да запазите данни в глобал, не е необходимо да изучавате езика за заявки SQL, командите за работа с тях са изключително прости. Можете да ги научите за час.

Да започнем с най-простия пример. Едноуредно дърво с 2 клона. Примерите са написани на COS.

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1

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



При вмъкване на информация в глобал (команда Set) автоматично се случват 3 неща:

  1. Запазване на данни на диска.
  2. Индексиране. Това, което е в скобите, е ключът (в англоговорящата литература — „subscript“), а вдясно от равното — стойността („node value“).
  3. Сортиране. Данните се сортират по ключа. При последващо обхождане на масива, първият елемент ще бъде „Sergey Smith“, а вторият „John Sidorov“. При извеждане на списъка с потребители от глобала базата не губи време за сортиране. В допълнение, може да се поиска извеждане на сортирания списък, започвайки от произволен ключ, дори несъществуващ (извеждането ще започне от първия реален ключ, който идва след несъществуващия).

Всички тези операции се извършват невероятно бързо. На домашния компютър получавах стойности до 750 000 вмъквания/сек в един процес. На многоядрените процесори стойностите могат да достигнат десятки милиони вмъквания/сек.

Разбира се, самата скорост на вмъкване не говори много. Може например да записвате информация в текстови файлове много бързо — така се твърди, че работи процесингът на Visa. Но в случая на глобалите получаваме структурирано индексирано хранилище, с което може да се работи лесно и бързо впоследствие.

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1

  • Най-силната страна на глобалите е скоростта на вмъкване на нови възли.
  • Данните в глобала винаги са индексирани. Обхождането им, по един и същи ниво, както и в дълбочина на дървото, е винаги бързо.

Да добавим в глобала още няколко клона от второ и трето ниво.

Set ^a("+7926X", "city") = "Moscow"
Set ^a("+7926X", "city", "street") = "Req Square"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "London"
Set ^a("+7916Y", "city", "street") = "Baker Street"
Set ^a("+7916Y", "age") = 36

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1

Очевидно е, че на базата на глобалите може да се строят многоуредни дървета. Достъпът до всеки възел е практически мигновен благодарение на автоиндексирането при вмъкване. На всяко ниво на дървото всички клони са сортирани по ключ.

Както се вижда, информацията може да се съхранява както в ключа, така и в стойността. Общата дължина на ключа (сумата от дължините на всички индекси) може да достигне 511 байта, а стойностите 3.6 MB за Caché. Броят на нивата в дървото (броят измерения) е 31.

Още един интересен момент. Може да се построи дърво, без да се задават стойности на възлите от горните нива.

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1

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

Празните кръгове са възли, на които не е присвоена стойност.

За да разберем по-добре глобалите, ще ги сравним с други дървета: с градински и с дърветата на файловите системи.

Сравняваме дърветата на глобалите с най-запознатите ни йерархични структури: с обикновените дървета, които растат в градини и полета, както и с файловите системи.

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1

Както виждаме, при градинските дървета листата и плодовете се намират само на краищата на клоните.
При файловите системи информацията се съхранява само на краищата на клоните, които са пълните имена на файловете.

А ето структурата на данните на глобалите.

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1Разлики:

  1. Вътрешни възли: информацията в глобала може да се съхранява във всеки възел, а не само на краищата на клоните.
  2. Външни възли: глобалът задължително трябва да има определени стойности на краищата на клоните, а дърветата на файловите системи и градинските не.



В част от вътрешните възли, може да кажем, че структурата на глобала е надмножество на структурата на дърветата на имената във файловите системи и градинските дървета. Т.е. по-гъвкава.

В общия случай глобалът представлява подредено дърво с възможност за съхранение на данни във всеки възел.

За да разберем по-добре работата на глобалите, си представете какво би станало, ако създателите на файловите системи бяха използвали подобен подход за съхранение на информацията, подобен на глобалите?

  1. При изтриването на единствен файл в директорията автоматично да се изтрива директорията, както и всички надлежащи директории, съдържащи само наскоро изтритата директория.
  2. Необходимостта от директории би отпаднала. Просто щяха да бъдат файлове с подфайлове и файлове без подфайлове. Ако сравним с обикновено дърво, всяка клонка би станала плод.

    Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1

  3. Неща като файловете README.txt, вероятно, щяха да отпаднат. Всичко, което трябваше да се каже за съдържанието на директорията, можеше да бъде записано в самия файл на директорията. В пространството на пътищата името на файла не е различимо от името на директорията, така че можеше да се мине само с файлове.
  4. Скоростта на изтриване на директории с вложени поддиректории и файлове би се увеличила драстично. Много пъти на Хабр са излизали статии за това колко дълго и трудно е да се изтрият милиони малки файлове (1, 2). Въпреки това, ако създадете псевдофайлова система на глобалите, това ще отнеме секунди или част от тях. Когато тестах изтриването на поддървесия на домашния компютър, за 1 секунда се изтриваха 96-341 милиона възли от двуслойно дърво на HDD (не SSD). Става дума за изтриване на част от дървото, а не просто на целия файл с глобалите.

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1
Изтриването на поддървесия е още една силна страна на глобалите. За това не е необходима рекурсия. Това се случва невероятно бързо.

В нашето дърво това би могло да се направи с командата Kill.

Kill ^a("+7926X")

Глобали — мечи-кладенци за съхранение на данни. Дървета. Част 1

За по-добро разбиране на действията, които можем да предприемем с глобалите, ще приведя кратка таблица.

Основни команди и функции за работа с глобали в COS

Set
Настройка на клонове до възел (ако още не са определени) и стойността на възела

Merge
Копиране на поддървесие

Kill
Изтриване на поддървесие

ZKill
Изтриване на стойността на конкретен възел. Поддървесие, излизащо от възела, не се засяга

$Query
Пълен обход на дървото с дълбочинно навлизане

$Order
Обход на клоните на конкретен възел

$Data
Проверка за определеност на възела

$Increment
Атомарно увеличаване на стойността на възела. За да не се правят четения и записи, за ACID. В последно време се препоръчва да се заменя с $Sequence

Благодаря за вниманието, готови сме да отговорим на вашите въпроси.

Отказ от отговорност: Тази статия и моите коментари към нея представляват моето мнение и нямат отношение към официалната позиция на корпорацията InterSystems.

Продължение Глобалите — мечи-кладенци за съхранение на данни. Дървета. Част 2. Ще разберете кои типове данни могат да се визуализират на глобалите и при какви задачи те дават максимална полза.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster