Глобалы - мячы-кладзенцы для захоўвання дадзеных. Дрэвы. Частка 1

Глобалы - мячы-кладзенцы для захоўвання дадзеных. Дрэвы. Частка 1 Сапраўдныя мячы-кладзенцы баз дадзеных - глабал - даўно вядомыя, але да гэтага часу нямногія ўмеюць эфектыўна імі карыстацца або зусім не валодаюць гэтай суперзброяй.

Калі выкарыстоўваць глабалы ў рашэнні тых задач, у якіх яны сапраўды добрыя, то можна дамагчыся выбітных вынікаў. Або ў прадукцыйнасці, або ў спрашчэнні рашэння задачы (1, 2).

Глобалы - гэта спецыяльны спосаб захоўвання і апрацоўкі дадзеных, зусім іншы, чым табліцы ў SQL. Яны з'явіліся ў 1966 годзе ў мове. M(UMPS) (эвалюцыйнае развіццё - Caché ObjectScript, далей COS) у медыцынскіх БД і да гэтага часу там актыўна выкарыстоўваюцца, а таксама праніклі ў некаторыя іншыя вобласці, дзе патрабуецца надзейнасць і высокая прадукцыйнасць: фінансы, трэйдзінг і г.д.

Глобалы ў сучасных СКБД падтрымліваюць транзакцыі, часопісаванне, рэплікацыю, партыцыянаванне. Г.зн. на іх можна будаваць сучасныя, надзейныя, размеркаваныя і хуткія сістэмы.

Глобалы не абмяжоўваюць вас межамі рэляцыйнай мадэлі. Яны даюць свабоду для распрацоўкі структур даных, аптымізаваных пад канкрэтныя задачы. Для шматлікіх прыкладанняў разумнае выкарыстанне глабалаў можа быць сапраўды сакрэтнай зброяй, забяспечваючы прадукцыйнасць, пра якую распрацоўшчыкі рэляцыйных прыкладанняў могуць толькі марыць.

Глобалы як спосаб захоўвання дадзеных можна выкарыстоўваць у шматлікіх сучасных мовах праграмавання, як высокаўзроўневых, так і нізкаўзроўневых. Таму ў гэтым артыкуле я сфакусуюся менавіта на глабалах, а не на мове, з якой яны некалі выйшлі.

2. Як працуюць глабалы

Давайце спачатку разбярэмся, як працуюць глабалы, і ў чым іх моцныя бакі. На глабалы можна глядзець з розных пунктаў гледжання. У гэтай частцы артыкула мы будзем глядзець на іх як на дрэвы. Або як на іерархічныя сховішчы дадзеных.

Спрошчанага кажучы, глабал – гэта персістэнтны масіў. Масіў, які аўтаматычна захоўваецца на дыск.
Цяжка ўявіць нешта больш простае для захоўвання дадзеных. У кодзе (на мовах COS/M) ад звычайнага асацыятыўнага масіву ён адрозніваецца толькі сімвалам ^ перад імем.

Для захавання дадзеных у глабале не трэба вывучаць мову запытаў SQL, каманды для працы з імі вельмі простыя. Іх можна вывучыць за гадзіну.

Пачнём з самага простага прыкладу. Аднаўзроўневае дрэва з двума галінамі. Прыклады напісаны на 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 МБ для 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 ^a("+7926X")

Глобалы - мячы-кладзенцы для захоўвання дадзеных. Дрэвы. Частка 1

Для лепшага разумення таго, якія дзеянні нам даступныя над глабаламі, прывяду кароткую табліцу.

Асноўныя каманды і функцыі па працы з глабаламі ў COS

Усталёўка
Усталяванне галін да вузла (калі яшчэ нявызначаныя) і значэнні вузла

Зліццё
Капіраванне поддерева

забіць
Выдаленне поддерева

ZKill
Выдаленне значэння канкрэтнага вузла. Поддерево якое выходзіць з вузла не чапаецца

$Query
Поўны абыход дрэва з заходам углыб

$Order
Абыход галінак канкрэтнага вузла

$Data
Праверка ці вызначаны вузел

$Increment
Атамарнае інкрыментаванне значэння вузла. Каб не рабіць счытвання і запісы, для ACID. У апошні час рэкамендуецца мяняць на $Sequence

Дзякуй за ўвагу, гатовы адказаць на вашыя пытанні.

адмова: дадзены артыкул і мае каментары да яе з'яўляецца маім меркаваннем і не маюць дачынення да афіцыйнай пазіцыі карпарацыі InterSystems.

Працяг Глобалы - мячы-кладзенцы для захоўвання дадзеных. Дрэвы. Частка 2. Вы даведаецеся, якія тыпы дадзеных можна адлюстраваць на глабалах і на якіх задачах яны даюць максімальны выйгрыш.

Крыніца: habr.com

Дадаць каментар