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

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

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

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

Глобалите в съвременните СУБД поддържат транзакции, журнализиране, репликация, партициониране. Т.е. на тях могат да се изграждат съвременни, надеждни, разпределени и бързи системи.

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

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

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

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

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

За съхраняване на данни в глобал не е необходимо да учите езика за заявки 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") = "Москва"
Set ^a("+7926X", "city", "street") = "Площад Рек"
Set ^a("+7926X", "age") = 25
Set ^a("+7916Y", "city") = "Лондон"
Set ^a("+7916Y", "city", "street") = "Улица Бейкър"
Set ^a("+7916Y", "age") = 36

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

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

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

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

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

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

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

$Query
Цялостно обикаляне на дървото с дълбочинно навлизане

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

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

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

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

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

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

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

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