Истинските глобални бази данни от тип 'глобал' са добре познати, но до сега малцина умеят да ги използват ефективно или изобщо не владеят това супероръжие.
Ако се използват глобалите за решаване на задачи, в които наистина са добри, можете да постигнете изключителни резултати. Или в производителността, или в опростяването на решаването на задачата (, ).
Глобалите са специален начин за съхранение и обработка на данни, съвсем различен от таблиците в SQL. Те се появиха през 1966 година в езика (еволюционно развитие — , по-нататък COS) в медицинските бази данни и се използват активно там Глобалите в съвременните СУБД поддържат транзакции, регистриране, репликация, партициониране. Т.е. на тях може да се изградят съвременни, надеждни, разпределени и бързи системи.
Глобалите не ви ограничават в границите на релационния модел. Те предоставят свобода за разработка на структури от данни, оптимизирани за конкретни задачи. За много приложения разумното използване на глобалите може да бъде истинско тайно оръжие, осигурявайки производителност, за която разработчиците на релационни приложения могат само да мечтаят.
Глобалите като метод за съхранение на данни могат да се използват в много съвременни програмни езици, както високо-, така и ниско ниво. Затова в тази статия ще се фокусирам именно върху глобалите, а не на езика, от който те някога произлизат.
2. Как работят глобалите
Нека първо да разберем как работят глобалите и какви са техните силни страни. На глобалите може да се гледа от различни ъгли. В тази част от статията ще ги разгледаме като дървета. Или като йерархични хранилища на данни.
Определено глобалът е персистентен масив. Масив, който автоматично се съхранява на диск.
Трудно е да си представим нещо по-просто за съхранение на данни. В кода (на езиците COS/M) от обикновения асоциативен масив той се различава само с символа
преди името. ^ За да съхраните данни в глобал, не е нужно да учите SQL език за заявки, командите за работа с тях са много прости. Можете да ги научите за час.
За да запазите данни в глобал, не е необходимо да изучавате езика за заявки SQL, командите за работа с тях са изключително прости. Можете да ги научите за час.
Да започнем с най-простия пример. Едноуредно дърво с 2 клона. Примерите са написани на COS.

Set ^a("+7926X") = "John Sidorov"
Set ^a("+7916Y") = "Sergey Smith"
При вмъкване на информация в глобал (команда Set) автоматично се случват 3 неща:
- Запазване на данни на диска.
- Индексиране. Това, което е в скобите, е ключът (в англоговорящата литература — „subscript“), а вдясно от равното — стойността („node value“).
- Сортиране. Данните се сортират по ключа. При последващо обхождане на масива, първият елемент ще бъде „Sergey Smith“, а вторият „John Sidorov“. При извеждане на списъка с потребители от глобала базата не губи време за сортиране. В допълнение, може да се поиска извеждане на сортирания списък, започвайки от произволен ключ, дори несъществуващ (извеждането ще започне от първия реален ключ, който идва след несъществуващия).
Всички тези операции се извършват невероятно бързо. На домашния компютър получавах стойности до 750 000 вмъквания/сек в един процес. На многоядрените процесори стойностите могат да достигнат вмъквания/сек.
Разбира се, самата скорост на вмъкване не говори много. Може например да записвате информация в текстови файлове много бързо — така че работи процесингът на Visa. Но в случая на глобалите получаваме структурирано индексирано хранилище, с което може да се работи лесно и бързо впоследствие.

- Най-силната страна на глобалите е скоростта на вмъкване на нови възли.
- Данните в глобала винаги са индексирани. Обхождането им, по един и същи ниво, както и в дълбочина на дървото, е винаги бързо.
Да добавим в глобала още няколко клона от второ и трето ниво.
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 
Очевидно е, че на базата на глобалите може да се строят многоуредни дървета. Достъпът до всеки възел е практически мигновен благодарение на автоиндексирането при вмъкване. На всяко ниво на дървото всички клони са сортирани по ключ.
Както се вижда, информацията може да се съхранява както в ключа, така и в стойността. Общата дължина на ключа (сумата от дължините на всички индекси) може да достигне , а стойностите за Caché. Броят на нивата в дървото (броят измерения) е 31.
Още един интересен момент. Може да се построи дърво, без да се задават стойности на възлите от горните нива.

Set ^b("a", "b", "c", "d") = 1
Set ^b("a", "b", "c", "e") = 2
Set ^b("a", "b", "f", "g") = 3 Празните кръгове са възли, на които не е присвоена стойност.
За да разберем по-добре глобалите, ще ги сравним с други дървета: с градински и с дърветата на файловите системи.
Сравняваме дърветата на глобалите с най-запознатите ни йерархични структури: с обикновените дървета, които растат в градини и полета, както и с файловите системи.

Както виждаме, при градинските дървета листата и плодовете се намират само на краищата на клоните.
При файловите системи информацията се съхранява само на краищата на клоните, които са пълните имена на файловете.
А ето структурата на данните на глобалите.
Разлики:
- Вътрешни възли: информацията в глобала може да се съхранява във всеки възел, а не само на краищата на клоните.
- Външни възли: глобалът задължително трябва да има определени стойности на краищата на клоните, а дърветата на файловите системи и градинските не.
В част от вътрешните възли, може да кажем, че структурата на глобала е надмножество на структурата на дърветата на имената във файловите системи и градинските дървета. Т.е. по-гъвкава.
В общия случай глобалът представлява подредено дърво с възможност за съхранение на данни във всеки възел.
За да разберем по-добре работата на глобалите, си представете какво би станало, ако създателите на файловите системи бяха използвали подобен подход за съхранение на информацията, подобен на глобалите?
- При изтриването на единствен файл в директорията автоматично да се изтрива директорията, както и всички надлежащи директории, съдържащи само наскоро изтритата директория.
- Необходимостта от директории би отпаднала. Просто щяха да бъдат файлове с подфайлове и файлове без подфайлове. Ако сравним с обикновено дърво, всяка клонка би станала плод.

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

Изтриването на поддървесия е още една силна страна на глобалите. За това не е необходима рекурсия. Това се случва невероятно бързо.
В нашето дърво това би могло да се направи с командата Kill.
Kill ^a("+7926X") 
За по-добро разбиране на действията, които можем да предприемем с глобалите, ще приведя кратка таблица.
Основни команди и функции за работа с глобали в COS
Настройка на клонове до възел (ако още не са определени) и стойността на възела
Копиране на поддървесие
Изтриване на поддървесие
Изтриване на стойността на конкретен възел. Поддървесие, излизащо от възела, не се засяга
Пълен обход на дървото с дълбочинно навлизане
Обход на клоните на конкретен възел
Проверка за определеност на възела
Атомарно увеличаване на стойността на възела. За да не се правят четения и записи, за ACID. В последно време се препоръчва да се заменя с
Благодаря за вниманието, готови сме да отговорим на вашите въпроси.
Отказ от отговорност: Тази статия и моите коментари към нея представляват моето мнение и нямат отношение към официалната позиция на корпорацията InterSystems.
Продължение . Ще разберете кои типове данни могат да се визуализират на глобалите и при какви задачи те дават максимална полза.
Източник: habr.com

