全局变量是存储数据的宝剑。 树木。 第1部分

全局变量是存储数据的宝剑。 树木。 第1部分 真正的数据库利剑——全局变量——早已为人所知,但仍然很少有人知道如何有效地使用它们,或者根本不拥有这种超级武器。

如果你使用全局变量来解决那些他们真正擅长的问题,你可以取得出色的结果。无论是在生产力方面还是在简化问题的解决方案方面(1, 2).

全局变量是一种存储和处理数据的特殊方式,与 SQL 中的表完全不同。他们于 1966 年以语言出现 中号(UMPS) (进化发展- 缓存对象脚本,以下简称 COS)在医疗数据库中并且仍然存在 积极使用,并且还渗透到了其他一些需要可靠性和高性能的领域:金融、贸易等。

现代 DBMS 中的全局变量支持事务、日志记录、复制和分区。那些。它们可用于构建现代、可靠、分布式和快速的系统。

全局变量不会将您限制于关系模型。它们使您可以自由地开发针对特定任务优化的数据结构。对于许多应用程序来说,智能地使用全局变量确实可以成为一种秘密武器,提供关系应用程序开发人员梦寐以求的性能。

全局变量作为一种存储数据的方式可以在许多现代编程语言中使用,无论是高级还是低级。因此,在本文中,我将特别关注全局变量,而不是它们曾经来源的语言。

2. 全局变量如何工作

让我们首先了解全局人员如何工作以及他们的优势是什么。可以从不同的角度来看待全局变量。在本文的这一部分中,我们将把它们视为树。或者像分层数据仓库。

简单来说,全局就是一个持久数组。自动保存到磁盘的数组。
很难想象还有比这更简单的数据存储方法。在代码中(COS/M 语言),它与常规关联数组的区别仅在于符号 ^ 在名字之前。

要在全局中保存数据,您不需要学习 SQL 查询语言;使用它们的命令非常简单。他们可以在一小时内学会。

让我们从最简单的例子开始。有 2 个分支的单层树。示例是用 COS 编写的。

全局变量是存储数据的宝剑。 树木。 第1部分

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



当将信息插入全局(Set 命令)时,会自动发生 3 件事:

  1. 将数据保存到磁盘。
  2. 索引。 括号里的是键(在英文文献中是“下标”),等号右边是值(“节点值”)。
  3. 排序。 数据按键排序。将来,在遍历数组时,第一个元素将是“Sergey Smith”,第二个元素将是“John Sidorov”。当从全局接收到用户列表时,数据库不会浪费时间进行排序。此外,您可以请求输出排序列表,从任何键开始,甚至是不存在的键(输出将从第一个真正的键开始,该键位于不存在的键之后)。

所有这些操作都发生得非常快。在我的家用计算机上,我在单个进程中获得高达 750 次插入/秒的值。在多核处理器上该值可以达到 数千万 插入/秒。

当然,插入速度本身并不能说明什么。例如,您可以非常快速地将信息写入文本文件 - 像这样 据谣言说 签证处理工作。但在全局变量的情况下,我们得到了一个结构化的索引存储,将来可以轻松快速地使用它。

全局变量是存储数据的宝剑。 树木。 第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 对于缓存。树的层数(维度数)为 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. 外部节点: 全局必须在分支的末端有定义的值,而 FS 和花园树则没有。



就内部节点而言,我们可以说全局的结构是文件系统中的名称树和花园树结构的超集。那些。更灵活。

总体来说,全球是 有序树能够在每个节点中存储数据.

为了更好地理解全局变量的工作,让我们想象一下,如果文件系统的创建者使用类似于全局变量的方法来存储信息,会发生什么?

  1. 删除目录中的单个文件将自动删除该目录以及仅包含刚刚删除的一个目录的所有覆盖目录。
  2. 不需要目录。只会有带有子文件的文件和没有子文件的文件。如果比作一棵普通的树,那么每根树枝都会结出果实。

    全局变量是存储数据的宝剑。 树木。 第1部分

  3. 可能不需要 README.txt 文件之类的东西。关于目录内容需要说明的所有内容都可以写入目录文件本身。在路径空间中,文件名与目录名无法区分,因此可以仅使用文件。
  4. 删除带有嵌套子目录和文件的目录的速度将大大提高。 Habré 上多次出现过关于删除数百万个小文件需要多长时间和多困难的文章(1, 2)。但是,如果您在全局上创建伪文件系统,则需要几秒钟或几秒钟的时间。当我在家用计算机上测试删除子树时,它在 1 秒内从 HDD(而非 SSD)上的两层树中删除了 96-341 亿个节点。此外,我们正在讨论删除树的一部分,而不仅仅是带有全局变量的整个文件。

全局变量是存储数据的宝剑。 树木。 第1部分
删除子树是全局变量的另一个强项。为此,您不需要递归。 这发生得非常快。

在我们的树中,这可以通过命令来完成 .

Kill ^a("+7926X")

全局变量是存储数据的宝剑。 树木。 第1部分

为了更好地了解我们可以通过全局变量采取哪些操作,我将提供一个简短的表格。

在 COS 中使用全局变量的基本命令和函数


设置分支到节点(如果尚未定义)和节点值

合并
复制子树


删除子树

杀戮
删除特定节点的值。从该节点出现的子树未被触及

$查询
完全遍历树,深入树

$订单
遍历特定节点的分支

$数据
检查节点是否已定义

$增量
原子地递增节点值。为了避免进行读取和写入,以保证 ACID。最近建议改为 $序列

感谢您的关注,我们已准备好回答您的问题。

免责声明: 本文以及我对其的评论仅代表我的观点,与 InterSystems Corporation 的官方立场无关。

延期 全局变量是存储数据的宝剑。 树木。 第2部分。您将了解哪些类型的数据可以在全局变量上显示,以及它们对哪些任务提供最大的好处。

来源: habr.com

添加评论