高效支持JSON文档的分段更新的制作方法

文档序号:30233612发布日期:2022-06-01 07:08阅读:157来源:国知局
高效支持json文档的分段更新
技术领域
:1.本公开涉及对以压缩格式存储在永久性存储装置中的javascript对象标记(json)文档的修改。本文的技术通过避免完全重写永久性存储装置中的json文档的压缩格式来加速对永久性存储装置中的json文档的压缩格式的修改。
背景技术
::2.作为一种精简的半结构化数据格式,javascript对象标记(json)因支持基于结构化查询语言(sql)的关系数据库管理系统(rdbms)和/或非sql风格的文档对象储存库(dcoumentobjectstore)中存储的json文档的无模式敏捷风格的应用程序开发而广受欢迎。在这样的数据应用模型中,json对象成为文档检索、查询和更新的单元,以支持微服务的在线事务处理(oltp)。然而,与关系模型中的更新(其中单个更新粒度可以是每列级别)相比,即使在功能上只需要更新json文档的单个字段,键-值非sql风格的储存库可能也必须整体更新json文档。3.当json文档被存储为json文本时,除了执行完全文档替换之外,在存储级别上可以执行的优化不多,除非所需的更改非常小,以至于更新引擎可以将json文本解析器字符位置与所需的更改精确匹配。通常不会尝试对json文本存储进行这种更新优化,因为这样的交错json文本解析器和更新引擎需要大量的设计工作,却只提供很小的改进,因为精确的文本更新大小匹配并不经常发生。4.一种业界流行的二进制格式是来自mongodb的bson。当新内容完全适应于原始内容时,它可以支持有限的部分更新(基本上与适用于json文本的限制相同)。例如,由于新旧内容完全适应,因此可以通过部分更新将标量字符串值从‘zhen’替换为‘chen’;但是,不能通过部分更新将‘zhen’更新为‘zheng’。mysql的二进制json设计也有类似的限制。5.文件系统实现可能足够复杂,以支持在存储json文档的文件的中间删除和插入,那么二进制部分更新在某种程度上对于诸如bson的json编码可能是可行的。然而,这种复杂的文件系统实现必须在内部支持额外的簿记层(bookkeepinglayer),该簿记层将文件中的逻辑字节偏移映射到其物理偏移。这不可避免地会给文件系统的设计带来额外的性能成本负担。6.用户别无选择,只能使用json文档对象模型(dom)应用编程接口(api)来程序化地遍历和更新json文档。虽然这种分段更新在功能上起作用,但在存储级别上有效地支持它们并没有得到充分的解决。典型供应商的实现最终会完全替换json文档,即使在逻辑上更新只需要对json文档执行很小的更改。当json文档的大小勉强达到兆字节或数十千字节时,这会成为一个性能问题。从事务日志的角度来看,完全json文档更新特别昂贵,因为它需要与更新后的完全json文档的大小成比例的变更日志大小。变更日志不仅会影响数据操作语言(dml)的性能,还会影响依赖于变更日志的复制性能和其他功能。7.本节所述的办法是可以采取的办法,但不一定是以前设想或采取的办法。因此,除非另有说明,否则不应假定本节中描述的任何方法仅因其包含在本节中而有资格成为现有技术。附图说明8.在附图中:9.图1是描绘通过避免完全重写永久性json文档来加速对永久性json文档的修改的示例计算机的框图;10.图2是描绘通过避免完全重写永久性json文档来加速对永久性json文档的修改的示例计算机过程的流程图;11.图3是描绘将变更日志应用于json文档的压缩格式并避免完全重写压缩格式的示例计算机过程的流程图;12.图4是描绘管理json文档的压缩格式的变更日志的生命周期的示例计算机过程的流程图;13.图5是描绘将json文档的压缩格式存储在数据库的关系表中的示例计算机过程的流程图;14.图6是示出可在其上实现本发明实施例的计算机系统的框图;15.图7是示出可用于控制计算系统的操作的基本软件系统的框图。具体实施方式16.在下面的描述中,出于解释的目的,为了提供对本公开的(多个)示例实施例的透彻理解,提出了许多具体细节。然而,将明白,可以在没有这些具体细节的情况下实施(多个)示例实施例。在其他情况下,公知的结构和设备以框图的形式示出,以避免不必要地模糊(多个)示例实施例。17.一般概述18.本文是一种文档对象储存库,其经由声明性语言应用编程接口(api)提供对多个(多个)javascript对象标记(json)文档片段的细粒度更新。这里,保存json文档的关系数据库管理系统(rdbms)还通过结构化查询语言(sql)功能提供对json文档的分段更新。这类sql函数通常可以通过sql/json表达式和路径语言以声明性方式更新、删除和插入json文档的一部分。可以有多个这样的sql函数,每个sql函数执行一种json更新功能。例如,json_mergepatch()和json_transform()是能够通过一个函数调用以声明方式执行一系列更改的sql可调用函数。19.与要求用户使用json文档对象模型(dom)api对json文档进行程序化遍历和更新相比,使用sql函数进行分段json更新更加用户友好,也更符合人体工程学。这里实现的理想目标是变更日志大小与json文档的实际分段更改成比例。这里对变更日志的加速访问提高了以下性能:a)数据操纵语言(dml)操作,b)复制,以及c)依赖于变更日志的其他特征。20.当json文档以二进制格式保存时,通过设计可修改的二进制格式来平衡提供快速查询和在二进制格式中启用部分更新的需求,就有很好的机会高效地执行分段更新。oracle的oson二进制格式在新内容不完全适应于oson文档的原始字节内容的许多情况下执行部分更新。本文提出的方法是为像oson这样的二进制格式设计的,以便在物理级别支持许多分段更新,使得变更日志大小与json文档的实际所需分段更改成比例。这些方法可以检测在oson上需要大量更改(来自过去的累积更改和执行当前更新操作的更改)的情况,使得oson文档通过在适当时生成新的更紧凑的文档来自主地重新组织自身。oson设计遵循json是树模型的逻辑概念,并因此提供基于本机树偏移的跳转导航,使得其能够自然地支持物理oson字节级别的部分更新,如相关美国专利10,262,012中所提出的。此外,在实施例中,这里的oson部分更新设计仅需要能够在文件内寻找特定偏移以进行字节长度的保留内容替换或将字节追加到文件末尾以便生长的标准文件系统,例如unix/posix文件系统api。底层文件系统不需要具有在文件中间进行字节删除以造成孔洞或在文件中间插入额外字节以导致文件在中间生长的能力。21.与其他解决方案的显著技术差异在于,这里的分段oson更新在不执行完全文档更新的情况下尽可能多地被执行,以减小事务变更日志大小并极大地提高更新和复制性能。在典型情况下,正在更新的oson字节数与要在功能上更新的内容成正比,而不是与整个文档大小成正比。然而,如果更新非常复杂,以至于它使oson字节扭曲得太多,那么oson文档会在适当的时候自主地执行完全文档覆写。rdbms的oson事务子系统在运行时基于过去发生的累积的相应更改以及执行当前更新操作所需的更改来为每个文档做出这样的决定。因此,oson文档生命周期可以包括立即自动压缩或使用智能调度。22.当文档小到足以内联到关系数据库中的表的行内的二进制大型对象(blob)中时,执行物理部分更新可能没有什么好处。在这种情况下,rdbms可能会进行完全文档替换。23.当文档较大时,使用的两个blobapi与标准的unix/posix文件系统api有些类似:长度保留的字节内容替换,或将字节追加到末尾。如果就地(inplace)更新适合,则rdbms进行blob长度保留的替换。如果就地更新不再适合,重定向墓碑将用追加在blob末尾的新插入片段的新转发地址覆写当前位置。24.诸如json数组插入之类的一些操作使用指数增长策略动态调整更新行为,指数增长策略用于预留空间以容纳未来的就地更新请求。当累积的追加新片段超过oson文档总大小的阈值百分比时,rdbms压缩并完全替换oson文档。25.由于各种json构造(json对象./数组成员插入、删除、成员值更新、json标量更新)上所需的部分更新语义已经包含在rdbms/oson集成中,因此可以适当地设计oson字节来适应这些分段更新操作,并控制查询和更新的性能,而无需请求底层存储api进行额外的簿记。26.在实施例中,计算机接收指定以压缩格式存储在永久性存储装置中的javascript对象标记(json)文档的修改的请求。修改向json文档添加附加内容,和/或用大小与旧值不同的新值替换json文档中的旧值。修改被记录在变更日志中。变更日志最终被应用于永久性存储装置中的json文档的压缩格式,而不完全重写永久性存储装置中的json文档的压缩格式。27.1.0示例计算机28.图1是在实施例中描绘示例计算机100的框图。计算机100通过避免完全重写永久性存储装置130中的压缩格式120来加速对以压缩格式120存储在永久性存储装置110中的javascript对象标记(json)文档130的修改。计算机100可以是机架式服务器(例如刀片)、个人计算机、大型机、虚拟机或智能手机中的一个或多个。29.永久性存储装置110是诸如磁盘、闪存或网络附连存储装置(nas)的非易失性存储装置。json文档130包含诸如标量的半结构化数据和诸如数组的聚合、包含名称/值对的对象和/或诸如数组或对象内的数组或对象的嵌套。例如,json文档130包含旧值140,旧值140可以是标量或聚合值,例如数组或对象。在这里,聚合是json数组或json对象。30.压缩格式120是不同于json文档130的原始文本编码的二进制格式。压缩格式120是json文档130的自含式编码,其:a)不或不完全被编码为文本字符,b)包含基于json文档130的文本内容但不是json文档130的文本内容的一部分的元数据,以及c)包含用于导航和/或解压缩json文档130的内容的元数据。在实施例中,元数据(b)和(c)是相同的元数据。在实施例中,字段和元素名称和值可以用令牌来替换,每个令牌由字典诸如使用字典编码映射到值。词典可以以json文档130的压缩格式120存储,或者存储在其他地方,例如存储在数据库或文件中,从而相同的词典可以用于对多个json文档进行编码。在实施例中,压缩格式120是用于json的oracle的oson二进制格式。用于实现压缩格式120的技术在相关的美国专利10,262,012中提出。31.json文档130的压缩格式120的生命周期可以包括内容突变。例如,计算机100可以接收或生成诸如151-152的请求,这些请求指定相应的修改161-162以变更存储在json文档130内的内容。根据实施例,请求151被表示为数据操纵语言(dml),诸如创建读取更新删除(crud)语句或按示例查询(qbe)。本文稍后将呈现json文档130的压缩格式120的自主生命周期。32.例如,请求151可以是诸如update的结构化查询语言(sql)dml语句。在实施例中,通过开放数据库连接(odbc)接收请求151。例如,计算机100可以托管将json文档130存储在持久数据库中的数据库管理系统(dbms),如本文稍后讨论的。在实施例中,请求151是超文本传输协议(http)请求,例如:get、post、通用网关接口(cgi)和/或表述性状态传输(rest)。33.修改162指定应该将附加内容190添加到json文档130。附加内容190是诸如标量或聚合的json值。修改162可以暗示或明确指定应该将附加内容190追加或插入到json文档130中。例如,修改162可以指定:a)json文档130内应该将附加内容190追加到其上的数组,b)在该数组中插入附加数组元素的偏移,或c)用于将附加内容190作为json对象中的值添加的键(即字段名称)。34.计算机100不需要直接和立即地将修改161-162应用于永久性存储装置110中的json文档130的压缩格式120。相反,可以将诸如新值180和附加内容190的修改161-162的细节追加到变更日志170上,以推迟应用到永久性存储装置110中的json文档130的压缩格式120。根据实施例,变更日志170可以被存储在易失性存储器和/或永久性存储装置110中。变更日志170的格式和操作将在本文稍后讨论。35.在任何情况下,变更日志170最终被应用于永久性存储装置110中的json文档130的压缩格式120,包括修改161-162。在实施例中,请求151和/或152可以发生在诸如原子一致隔离持久(acid)事务的数据库事务内。在实施例中,当修改161和/或162的细节被记录在变更日志170中时,事务完成。在实施例中,相反,当变更日志170被应用于永久性存储装置110中的json文档130的压缩格式120时,事务完成。36.因此,根据实施例,提交事务的请求可以或可以不引起变更日志170被立即应用于永久性存储装置110中的json文档130的压缩格式120。在请求151没有发生并且变更日志length)或空终止符表示的字符串可能会影响值大小。47.在另一示例中,修改162指定向json文档130添加附加内容190。例如,修改162可以导致插入或附加新的数组元素或新的json对象字段,如本文前面所讨论的。在任何情况下,步骤204在变更日志170中记录修改161和/或162的细节,诸如新值180和/或附加内容190。用于变更日志170的记录技术将在本文稍后讨论。48.最终,步骤206将变更日志170应用于永久性存储装置110中的json文档130的压缩格式120,而不完全重写永久性存储装置110中的json文档130的压缩格式120。本文稍后将讨论基于变更日志170将压缩格式120写入永久性存储装置110中的技术。49.3.0应用变更日志50.图3是描绘可由计算机100执行以将变更日志170应用于以压缩格式120存储在永久性存储装置110中的json文档130从而避免完全重写永久性存储装置130中的压缩格式120的示例过程的流程图。参考图1讨论图3。51.如本文前面所解释的,修改161-162可以由相同的请求来指定,而不是如先前所示的单独的请求151-152。为了演示,图3需要处理指定修改161-162和其他修改的复杂请求。尽管该请求进行了许多修改,但是可以针对该请求的一个、一些或全部修改分别执行图3的各种步骤。因此,指定较少修改的请求可以执行图3的较少步骤。是否执行特定步骤可以取决于示例。52.根据场景,可能存在各种原因来实际推迟将修改写入到永久性存储装置110中的json文档130的压缩格式120。例如,acid事务需要隔离,在此隔离中,一个客户端的(多个)修改在事务提交之前不应对其他客户端可见。在其他示例中,对永久性存储装置110的推迟写入增加了吞吐量。53.例如,推迟写入可便于将多个修改合并(即组合)为单个修改。同样地,推迟写入可通过减少轨道寻找或旋转延迟来减少存储延迟,例如通过将修改排序成增加许多磁盘块的顺序写入的大小的顺序。在实施例中,减少轨道寻找节省了能量。当诸如oltp之类的请求处理发生在前台时,推迟写入可在诸如较低优先级和/或易被抢占的后台发生。54.这些是步骤301推迟将json文档130的一些或全部压缩格式120写入永久性存储装置110的原因。例如,步骤301可以将修改161-162记录到变更日志170中,以便稍后应用于永久性存储装置110中的json文档130的压缩格式120。取决于实施例,例如当json文档130与文档对象模型(dom)一起封装时,并且不管持久写入是否被推迟,修改161-162可以立即:a)以与压缩格式120相同的格式或以诸如文本之类的不同格式应用于易失性存储器中的json文档130的副本,和/或b)被记录在易失性或非易失性存储装置中的变更日志170中。55.最终,变更日志170应被应用于永久性存储装置110中的json文档130的压缩格式120,此时变更日志170可能已经累积了来自同一事务中的相同或不同请求的对json文档130的许多未应用的修改。步骤302-306示出了可分别发生以将各种修改应用于永久性存储装置110中的json文档130的压缩格式120的活动。例如,可以针对许多修改中的每个修改重复步骤302,并且这些修改中的每个修改可以或可以不由图2中的其他步骤处理。56.根据场景或实施例,诸如当新值180不具有比旧值140更大的大小时,履行修改161可能需要在步骤302期间在永久性存储装置110中的json文档130的压缩格式120中用新值180物理地覆写旧值140。例如,字符串截断可能需要缩短表示长度或将字符设置为空。57.类似地,数组截断可能需要减少表示长度或将数组元素设置为空或存储指示删除的墓碑值。同样,json对象截断可能需要将字段设置为空或墓碑值。墓碑将在本文稍后讨论。58.步骤303演示了将各种对象追加到永久性存储装置110中的json文档130的压缩格式120上,并且追加哪个对象可以取决于场景如下。可以追加附加内容190、新值180或用于未来使用的未使用空间中的任何一个。59.在实施例中,并且无论是附加内容190将元素添加到现有聚合还是新值180替换诸如旧值140的现有聚合元素,修改可能需要对整个聚合进行写入时复制。例如,步骤303可以通过将反映该修改的聚合的副本追加到永久性存储装置110中的json文档130的压缩格式120上,来将该聚合的修改应用于永久性存储装置110中的json文档130的压缩格式120。在此稍后将进一步讨论先前内容的这种重新定位。在实施例中,永久性存储装置110是仅追加的(即,写入一次)。60.在各种触发之后,步骤303可以将未使用空间追加到json文档130上,该未使用空间是为生长而保留的并且是或不是为特定聚合而保留的。在实施例中,聚合具有段的链表,使得:a)每个段具有指向下一段的指针或偏移,并且b)聚合可以例如根据如本文稍后讨论的永久性存储装置110中的json文档130的压缩格式120的自主生命周期来反应性和/或主动性地增长新的空段。在实施例中,相同聚合的段具有相同的大小,例如存储相同数量的元素的字节或容量。61.存在可能永远不需要永久性存储装置110中的json文档130的压缩格式120内的未使用空间的风险,在这种情况下,未使用空间就浪费了。可以通过追加小的未使用空间来避免空间浪费。然而,有时json文档130的生长实际上需要许多空间。62.如果需要许多未使用空间,但未使用空间是以小段的形式提供的,则需要许多段,这可能会引起许多分配延迟,例如由于重复的i/o和/或系统调用,这两者都具有高延迟。因此,在以下两者之间可能存在性能紧张:a)添加许多小段的延迟,以及b)改为添加大段而浪费的空间。步骤304通过为相同的聚合追加大小增加的段来平衡这些设计力。在实施例中,大小呈指数增长。63.墓碑是原地覆写陈旧的值的标记。因此,墓碑不应比陈旧的值具有更大的大小。在实施例中,存在两种墓碑:删除墓碑和重定向墓碑。64.如果该值由于删除而陈旧,则删除墓碑只需要是可识别的。否则,该值由于重新赋值而变得陈旧,例如当陈旧的值是由新值180替换的旧值140时,特别是当旧值140和新值180具有不同的大小时,使得新值180不可能完全重写代替旧值140。在这种情况下,在步骤305a期间,旧值140可改为用包含指向新值180的指针或偏移的重定向墓碑来原地重写。65.因此,在步骤305b期间在永久性存储装置110中的json文档130的压缩格式120内追加的新值180是什么地址或偏移应该可用于写入指针的步骤305a。可以在步骤305a-b之前计算作为地址或偏移的指针的值。因此,在一个实施例中,步骤305a-b如图所示并行发生。在一个实施例中,步骤305a-b改为顺序发生,例如当步骤305a-b将不同扇区写入相同磁盘轨道中的相同扇区簇中以减少轨道寻找时。换句话说,至少步骤305a-b可以合并成相同的单个i/o写入。66.如上所述,步骤305a用重定向墓碑来原地重写旧值140。在实施例中,变更日志170在被完全应用之后被完全截断,并且对json文档130的后续修改可以随后被追加到变更日志170上。因此,变更日志170可能经历需要应用并然后截断变更日志170的重复冲刷。67.任何这样的冲刷提供了一种障碍,写入前的修改的合并不会跨越该障碍发生。例如,在冲刷之前,可以合并集合体的各个相邻元素的修改。冲刷后产生的修改不与已经冲刷的修改合并。68.在实施例中,重定向墓碑可以为链表提供指针,该链表以菊花链形式链接相同数据项(诸如标量或聚合)的值的渐进修订/重新赋值,使得读取链表以找到该相同数据项的当前值可能需要线性地读取重定向墓碑以遍历整个链表。在实施例中,相反,通过既非菊花链接也不保留相同数据项的多个重定向墓碑来提供恒定时间内的当前值检索,因为步骤305c用新的重定向墓碑原地覆写先前的重定向墓碑。69.在实施例中,重定向墓碑的大小不大于删除墓碑,使得删除墓碑可以原地覆写重定向墓碑。在实施例中,删除墓碑的大小不大于重定向墓碑,使得重定向墓碑可以原地覆写删除墓碑。在实施例中,两种类型的墓碑具有相同的大小,使得两种类型的墓碑可以原地覆写另一种墓碑。70.在实施例中,两种类型的墓碑中的单个比特指示该墓碑是墓碑。在实施例中,另一个单个比特指示墓碑是删除墓碑或重定向墓碑。71.永久性存储装置110中的json文档130的压缩格式120可以有些稀疏,在各个位置具有未使用字节的(多个)孔洞。例如,聚合(例如,数组)可以存储一些元素,但具有用于更多元素的未使用的内部空间。代替增加json文档130的大小,步骤306可以将附加内容190或新值180填充到已经存储的集合的未使用空间中。72.例如,如上所述的步骤303-304可以将未使用空间追加到永久性存储装置110中为特定聚合保留的json文档130的压缩格式120上。当稍后将不相关的值追加到永久性存储装置110中的json文档130的压缩格式120上时,先前附加的未使用空间可以成为可能位于永久性存储装置110中的json文档130的压缩格式120内的两个不相关的值之间的孔洞。73.步骤306可以用聚合的元素填充孔洞,例如当孔洞具有为聚合预留的未使用空间时。因此,聚合的生长不需要导致永久性存储装置110中的json文档130的压缩格式120的生长。例如,写入现有孔洞可能比分配和写入新空间更快。74.4.0组件的自主生命周期75.图4是描绘可由计算机100执行以管理json文档130的压缩格式120的变更日志170的生命周期的示例过程的流程图。参考图1讨论图4。76.修改161-162可以在范围上受到限制,使得json文档130的大部分不受修改161-162的影响。在实施例中,根据命令软件设计模式,将修改161或162作为命令追加到变更日志170上。例如,变更日志170可以存储变更命令,每个变更命令指定json文档130的一部分,诸如要为该部分添加、重新分配或删除的字段和/或(多个)新的标量或聚合值。77.例如,变更日志170可以驻留在易失性缓冲器和/或易失性或非易失性队列(诸如文件)中,使得最新的变更被追加到队列的一端,并且当变更到达队列的另一端时,变更最终以先进先出(fifo)的顺序被物理地应用于永久性存储装置110中的json文档130的压缩格式120并从队列中移除。步骤401不是将修订后的json文档130或json文档130的压缩格式120全部追加到变更日志170上,而是仅将更改命令或其他更改表示追加到变更日志170上。因此,变更日志170是累积的未决变更的密集规范,累积的未决变更被表示为变更命令,变更命令在出队时被应用于永久性存储装置110中的json文档130的压缩格式120。78.变更日志170可以具有其自己的生命周期,该生命周期包括诸如累积修改以及通过将修改应用于永久性存储装置110中的json文档130的压缩格式120而冲刷之类的转变。累积和冲刷可能是解耦的。例如,冲刷可以在自主触发时在后台发生,并需要自主决定的活动。换言之,变更日志170可以具有其自己的自主生命周期,该自主生命周期有时可以或多或少独立于修改json文档130的客户端请求。79.例如,两个值可以是连续的,诸如永久性存储装置110中的json文档130的压缩格式120的聚合元素。如本文前面所解释的,诸如在步骤402期间,可以将连续存储的值的修改合并成单个修改。例如,当修改被追加到变更日志170时,该修改可以立即与变更日志170已经包含的另一修改合并。80.因为变更日志170具有自主生命周期,所以可能不需要这种急切的合并。例如,变更日志170可以具有其自己的计算线程,该计算线程在后台的任何时间或者在变更日志170被应用于永久性存储装置110中的json文档130的压缩格式120之前的任何时间合并变更日志170中的变更。81.在实施例中,变更日志170通过复制可用于备用数据库以实现高可用性(ha),例如用于从主数据库到备用数据库的故障转移。例如,使更改从变更日志中出列可能需要将更改应用到主数据库,并将相同的更改发送到另一台计算机以最终应用于备用数据库。82.对连续存储的元素的修改的后台合并是通过变更日志170的自主活动的示例。即使当元素不连续时,也可以将那些元素的修改写入相同磁盘轨道中的相同扇区簇中的不同扇区,以减少轨道寻找,这可能需要针对连续或非连续存储的元素的步骤403a-403c。83.步骤403a将一个或两个偏移与每个修改相关联,例如当每个修改被追加到变更日志170时,这可以促进如下合并和聚类。修改的偏移可以被包括在变更日志170中的修改中,例如旧值140的偏移和/或新值180的偏移。84.步骤403b-c可以在不需要与步骤403a相关的稍后时间自动发生,例如在后台。步骤403b基于其新值的存储偏移对修改进行排序。修改排序后,聚类和/或识别用于合并的修改变得容易。85.这样的排序可以:a)在日志记录每个修改时,例如根据排序的插入递增地发生,使得变更日志170总是被排序,例如当变更日志170是优先级队列时,b)在后台发生,例如不在需求高峰期间,使得变更日志170可以自动地从未排序变为已排序,或者c)恰好在变更日志170最终被应用于永久性存储装置110中的json文档130的压缩格式120时发生。不管如何以及何时对变更日志170进行排序,步骤403c基于该排序将变更日志170应用于永久性存储装置110中的json文档130的压缩格式120。86.如本文前面所解释的,dom可以封装json文档130以向客户端提供方便的应用编程接口(api)。根据实施例,dom可以与以下内容集成:变更日志170、永久性存储装置110中的json文档130的压缩格式120、和/或易失性存储器中的json文档130的表示(其可以与压缩格式120相同,也可以不同)。例如,dom可以检测json文档130是否被高速缓存在易失性存储器中。87.根据实施例,dom本身可以是有状态的和/或具有其自己的自主生命周期,例如具有后台线程和/或异步触发器。步骤404-405展示dom可以自主决定执行或不执行的活动。88.dom可以同时执行如图所示的步骤404a-b,例如实现相同的修改。步骤404a在变更日志170中记录该修改。步骤404b将相同的修改应用于易失性存储器中的json文档130的表示,该表示可以与压缩格式120相同,也可以不相同。89.步骤405a-b是互斥的。对于步骤405a期间的加速,dom可以在变更日志170中记录修改,而不将该修改应用于易失性存储器中的json文档130的表示。例如,dom可以使易失性存储器中的json文档130的表示无效。90.在诸如当数据库连接被配置为在其自己的事务中自动地且单独地提交诸如sql的每个数据操纵语言(dml)语句时,dom可以绕过变更日志170或以其他方式在没有变更日志170的情况下操作。步骤405b将修改应用于永久性存储装置110中的json文档130的压缩格式120,而不将该修改记录在变更日志170中。91.永久性存储装置110中的json文档130的压缩格式120也可以具有其自己的自主生命周期,该自主生命周期有时可以或多或少独立于变更日志170、dom和客户端请求。例如,当空闲磁盘空间低于阈值时,计算机100可以自主地压缩永久性存储装置110中的json文档130的压缩格式120,以减小永久性存储装置110中的json文档130的压缩格式120的大小。例如,可以移除具有未使用空间的孔洞,和/或可以用实际值替换墓碑。这种压缩可能需要在永久性存储装置110中完全重写json文档130的压缩格式120。92.5.0数据库配置93.在呈现图5之前,下面的数据库讨论展示了数据库集成可能需要或可能不需要的数据库可配置性。如本文前面所讨论的,永久性存储装置110可以包含关系数据库,该关系数据库包含json文档130的压缩格式120。下面的表1列举了计算机100可以实现的一些或全部示例数据库配置801-804。94.数据库配置含义801修改永久性json文档的请求是sql语句802永久性json文档存储在关系表中803永久性json文档存储在关系表的lob列中804永久性json文档以外联(outofline)方式存储在关系表的行外95.json文档130的压缩格式120可以存储在永久性存储装置110和/或易失性存储器中的数据库中。例如,计算机100可以托管包含数据库的数据库管理系统(dbms),数据库包含json文档130的压缩格式120。在数据库配置801中,请求151-152是诸如update的sql语句。在谓词和/或赋值中,sql语句可以包括诸如json的表达式语言、javascript的子集、可扩展标记语言(xml)路径(xpath)或正则表达式。表达式语言可以导航、选择、过滤和/或赋值一个或多个永久性json文档内的内容,诸如json文档130的压缩格式120。96.这里的dbms可以通晓嵌入到诸如sql之类的本机dml语言中的json表达式语言。在相关的美国专利申请16/703,499中提出了嵌入在sql中用于查找、导航、读取和写入存储在关系表中的json文档的集合和部分的图灵完全示例json表达语言。sql:2016标准和相关非专利文献(npl)“技术报告iso/iectr19075-6”提供了json到sql的充分集成,这两个都定义和标准化了将json转换为关系数据或以其他方式从sql访问json数据的内置函数,包括其中解释的诸如json_table和json_exists的函数。97.在数据库配置802中,json文档130的压缩格式120存储在数据库中的关系表中。在实施例中,诸如在相应的列中,关系表可以在每个表行中包含零个或多个永久性json文档。98.在数据库配置803中,json文档130的压缩格式120作为大对象(lob)存储在关系表的列中。lob的编码可能或可能不取决于列的数据类型。lob可以是二进制lob(blob)或字符lob(clob)。lob将在后面讨论。99.在数据库配置804中,对于关系表的行,json文档130以外联方式存储,其在该行本身之外。例如,关系表可以包含与同一关系表的其他列分开存储的列。在实施例中,无论关系表具有以行为主还是以列为主的存储:a)所有列都存储在数据库块中,b)对于相同或不同的表行,相同关系表的许多列存储在相同的数据库块中,除了c)json文档130的json列和/或压缩格式120存储在单独的(多个)数据库块中。在实施例中,json文档130的json列和/或压缩格式120存储在单独的文件中。100.6.0数据库集成101.图5是描绘可由计算机100执行以将json文档130的压缩格式120存储在数据库的关系表中的示例过程的流程图。参考图1讨论图5。102.如本文前面所讨论的,json文档130的压缩格式120可以与其他列一起以内联方式存储在关系表的行内,例如通过易失性和/或非易失性存储装置中的以行为主的格式。json文档130的压缩格式120可以改为以外联方式存储在表行之外。内联存储器可通过提高数据局部性来加速访问并提高效率。103.然而,内联存储可能是容量有限的,并考虑如下。步骤502检测json文档130的压缩格式120是否已经以内联方式存储在关系表的行内。例如,关系模式可以指示某些json列始终以内联方式存储或不以内联方式存储。在实施例中,一些行以内联方式存储相同的json列,而相同json列的其他行不这样。104.在实施例中,每一行包含其自己的元数据,该元数据指示json列是否以内联方式存储。在各实施例中,指示元数据存储在行的标题元数据中或与内联永久性json文档相邻。在实施例中,指示元数据是以内联方式存储或存储在针对多个行的比特图中的单个比特。105.步骤504计算如果履行修改json文档130的当前请求,json文档130的压缩格式120将具有的大小。换言之,在修改请求的执行期间,计算json文档130的压缩格式120的新增加或减少的大小。106.根据步骤506,步骤508a-b是互斥的。当步骤506检测到json文档130的压缩格式120的新大小小到足以内联json文档130的压缩格式120时,表行本身为写请求提供存储。如果json文档130的压缩格式120已经内联,则在一些场景中可能发生就地部分更新。在其他场景中,无论json文档130的压缩格式120是否已经内联,步骤508a都完全内联重写json文档130的压缩格式120。107.不管是原地重写还是追加,内联不需要总是导致完全重写,例如为了压实(compaction)。例如,可能会发生指向表行空间内的其他位置的重定向墓碑。但是,由于溢出,内联更有可能导致压缩。108.当json文档130的压缩格式120已经内联但表行容量不足以容纳当前写请求时,就会发生溢出。在某些情况下,内联压缩可以解决溢出问题。在某些情况下,通过仅将json文档130的压缩格式120的一部分移到表行之外来解决溢出。例如,json文档130的压缩格式120的重定向墓碑可以驻留在行内,但在溢出被解决之后以外联方式指向表行外。在实施例中,当json文档130太大而不能内联时,即使最初插入的表行也包含重定向墓碑。否则,步骤508b在表行之外完全重写json文档130。109.如前所述,json文档130的压缩格式120及其dom可以具有自主生命周期。例如,无论是否自主地,计算机100可以检测已经存储在表行外部的json文档130的压缩格式120的压实将节省足够的空间以使json文档130的压缩格式120以内联方式适应表行。在这种情况下,发生步骤508a,并且json文档130或其dom的压缩格式120自主地解除分配由于内联而不再需要的外联存储。110.在实施例中,dom与lobapi集成,lobapi管理lob在表行之外的的存储。在实施例中,变更日志170包含变更命令,这些变更命令是诸如在此稍后描述的lobapi的相应调用。111.7.0重写阈值112.如本文前面所讨论的,json文档130可以由dom包装,dom可以在json文档130的压缩格式120的替代存储之间切换,诸如利用诸如存储器高速缓存的分层存储。在实施例中,dom通过按以下顺序访问存储层来履行读请求:1)变更日志170,2)高速缓存,以及3)永久性存储装置110。例如,读取两个字段的请求可以通过从变更日志170读取一个字段并通过以下方式读取另一个字段来履行:a)检测到json文档130没有被高速缓存,例如在高速缓存未命中的情况下,以及b)读取永久性存储装置110中的json文档130的一些或全部压缩格式120。113.对json文档130的压缩格式120的部分更新可能使先前的值无效和/或在json文档130的压缩格式120内过度分配不需要的空间。在任何情况下,json文档130压缩格式120可能累积浪费空间的孔洞,这可能降低效率。114.不管空间是否被浪费,对相同或不同json字段的多个部分更新通过重定向墓碑和/或变更日志170将(多个)间接化级别添加到字段访问,这降低了效率,因为遍历指针增加了计算和延迟,尤其是在操作的关键路径读取变更日志170时。诸如间接化或读取变更日志等复杂情况是数据存储碎片化的示例,在某些情况下可能会降低效率。115.在实施例中,通过在易失性和/或非易失性存储中应用变更日志170和/或压实json文档130来减少或消除碎片。压实需要部分或全部重写json文档130的压缩格式120,就好像以压缩格式120写入新json文档的原始版本一样。通过覆写,可以就地进行部分或全部重写。压缩可以或可以不根据诸如json文档130的压缩格式120、其dom或变更日志170之类的组件的自主生命周期来进行。116.相反,整个重写可以通过逻辑复制json文档130的压缩格式120来进行,对于压缩格式120的某些部分,不需要进行精确的物理复制。例如,json文档130的压缩格式120内未连续存储的多个值可以通过逻辑复制变为连续存储。在实施例中,json对象内的字段可以在复制期间被重新排序。117.在一些实施例中,压实无条件地发生在json文档130的压缩格式120的某些生命周期转变处,无论是自主的还是非自主的。例如,某些存档或联机分析处理(olap)方案的前面应该有压实。提交事务时,在线事务处理(oltp)可能会压实。例如在高速缓存写回期间,将json文档130的压缩格式120从较快的存储层复制或移动到较慢的存储层可能会导致压实。118.当超过各种重写阈值中的任何一个时,可能发生json文档130的压缩格式120的压实。例如,根据实施例或场景,有时对json文档130的压缩格式120的读、写或两者之一可能导致在后台或前台立即或延迟压实。在实施例中,数字阈值是可手动调节的、可自动优化的和/或可由机器学习(ml)训练的。在任何情况下,阈值设置都应避免过于频繁或不频繁地压实的极端情况。在实施例中,压实是基于成本的决定。压缩的性能成本可以在json文档130的压缩格式120的许多未来访问中分摊,并且可以或多或少地取决于对未来访问的预测。119.下面的表2列枚举了触发压缩的示例重写阈值811-815,计算机100可以实现其中的一些或全部。[0120][0121]在实施例中,json文档130的压缩格式120具有最后压缩大小,该最后压缩大小是json文档130的压缩格式120在最后压缩或最初填充时具有的字节或数据块的量。同样,累积的附加大小是自从上次出现紧凑大小以来追加到json文档130的压缩格式120上的内容的量。重写阈值811可以是最后紧凑大小和累积的附加大小之间的比率或差。[0122]在实施例中,无论最后的紧凑大小或比率或差异如何,累积的附加大小本身都与重写阈值812相比较。实施例可以具有多个重写阈值,诸如811-815中的一些或全部。在实施例中,当超过任何一个重写阈值时发生压实。在实施例中,附加阈值指定必须同时超过多少个不同的重写阈值才能导致压实。[0123]将重写阈值813与自从最后压实大小发生以来json文档130的压缩格式120的写请求的量进行比较,而不管每个写请求有多少字节,也不管写是原地发生还是通过追加发生。重写阈值814仅对这样的写请求进行计数:a)增加了json文档130的大小,或者b)需要追加。在一些实施例或场景中,(a)和(b)是同时发生的等同条件。[0124]重写阈值815检查自从json文档130的压缩格式120的大小在最后压实大小出现之后第一次增加或最后一次增加以来经过的持续时间。根据实施例,可以在访问json文档130的压缩格式120时或通过后台定时器来检查时间持续时间。[0125]当json文档130的压缩格式120被压实时,对许多、大多数或所有重写阈值发生的簿记被重置。每个永久化json文档分别用于每个重写阈值,因此每个永久化json文档被单独触发进行压实。[0126]8.0示例性实施例[0127]以下示例性实施例可以基于本文前面提出的实施例。该示例性实施例展示了示例实现选择。该示例性实施例的要求不一定是本文前面提出的实施例的要求。[0128]在该示例性实施例中包括oson,这是在相关美国专利10,262,012中提出的用于json文档的高效和优化的二进制格式。oson可以出现在易失性和/或非易失性存储和/或传输中,例如在通信网络中。oson可以由这里前面讨论的domapi包装。[0129]在该示例性实施例中包括诸如oracle的关系型dbms(rdbms)。rdbms可以提供:a)易失性和/或非易失性存储装置中关系表的以行为主和/或以列为主的存储,b)诸如在存储器压缩单元(imcu)中的易失性高速缓存和/或缓冲器管理,c)原子一致隔离持久(acid)事务,d)包括json或javascript表达式的sql,e)表格行的内联或外联lob存储,和/或f)表格和/或json内容的索引。例如,关系联接可能会将一个表中的标量列与另一个表的json列中的json文档中的标量字段相关联。在相关的美国专利申请xx/xxx,xxx中介绍了json、sql和imcu在rdbms中的集成。[0130]8.1sql/json查询编译器支持[0131]包含的rdbms包含支持json_transform()和lobassignment运算符的查询编译器,如下所示。下面是示例dml更新查询,表json_collection有json类型列jcol。更新查询更新json_collection表以为jcol列赋值。[0132]updatejson_collectionsetjcol=json_transform(jcol,set‘$.person.friends[3]’=‘johnsmith’)[0133]update语句通常可以根据特定条件更改一个或多个列中的数据值。以下是json列(诸如jcol)的示例谓词。[0134]‘$.person.friends[3]’=‘johnsmith’[0135]在sql编译阶段,创建一个lobassigment运算符,以将快捷方式($)复制到具有‘friend’属性的‘person’对象,并且数组属性的第三个元素将其识别的frient属性设置为‘johnsmith’。[0136]在sql编译阶段,创建lobassigment操作符以将赋值的右手侧(rhs)(在本例中它计算json_transform()的结果)复制到赋值的左手侧(lhs),这是要进行完全json文档替换的一个永久性json列。sql编译器检测到这种情况,并可能在运行时导致部分oson更新,因为json_transform()的json类型输入与要在lhs端更新的json列相同,因此编译器在lobassignment运算符的元数据结构中添加了额外的标志和偏移,以指示rhs结果应在运行时针对部分oson更新情况进行特殊处理。json_transform()运算符元数据结构使用相应的标志和相同的偏移进行注释,以便它可以在运行时基于每个文档将其更新状态传达给其父lobassignment运算符。[0137]8.2使用lobassignment运算符的sql/jsonjson_transform()运行时评估[0138]在运行时,当计算json_transform()时,如果设置了部分更新标志,则json_transform()检查json类型列的输入。如果输入json列oson文档大小足够小,例如blob内联的情况,则函数求值从oson字节加载存储器中的可变dom,以便于使用dom查询的json转换引擎,并直接在存储器中的dom上更新api。然后,将存储器中的突变的dom编码为oson字节,作为json_transform()的返回值。[0139]之后,lobassignment直接复制oson字节,在左侧json列上进行完全替换。将oson字节加载到存储器中的可变dom是很快的,因为它将oson字段名字典直接映射到存储器中的dom字段名哈希表,而不需要深入复制oson叶标量值。因此,json存储器中的dom叶标量内容直接指向oson字节。叶标量值的存储器中dom更新可以在oson中就地执行或通过写入时复制来执行。[0140]当oson字节溢出json列的内联容量时,则对json文档使用外联,在这种情况下,json转换引擎仍然调用相同的domapi来进行查询和更新,然而,这一次domapi将委托给底层osondom而不是存储器中的jsondom。对oson执行更新操作的domapi可以对oson字节执行部分更新。转换完成后,不会从json_transform()返回新的oson字节,相反,json_tranfrom()使用与lobassignment运算符共享的偏移来指向记录部分更新完成状态的存储器位置,以及指向捕获更新日志中的部分oson更新条目的数据结构的指针。[0141]当对lobassignment运算符求值时,它会根据偏移(与json_transform()共享)取消引用,以获取内容来检测是否发生了部分oson更新,而不是完全重写。如果发生部分更新,则基于部分oson更新日志结构调用blob长度保留的更新或追加api。否则,将使用json_transform()的结果进行完全替换。[0142]8.3部分oson更新日志[0143]osondom部分更新api实现对复制到可修改缓冲区中的输入oson字节执行实际更新,同时生成作为部分更新日志条目序列的oson部分更新日志。有两种更新日志条目:[0144]a.长度保留替换:指定要进行保留长度更新的起始偏移和新替换字节的长度。实际的新oson字节已经被写入可修改的缓冲区中,以及[0145]b.追加字节:将当前oson文档末尾需要追加的所有新字节复制到一个追加缓冲区中。[0146]当json_transform()完成时,它调用osondom来完成oson更新日志。oson长度保留替换更新日志条目通过对它们的偏移进行排序并融合所有连续片段来合并。这减少了用于替换oson中的字节的实际调用数量。理想情况下,使用这种合并时,只需一个组合的追加字节调用。[0147]8.4如果用于追加的累积更新太大,则自动切换到完全oson更新[0148]如果在osondom部分更新操作期间,追加字节总数将超过原始oson文档大小的25%,则停止跟踪oson更新日志条目。相反,当请求执行完成时,将生成反映最终更新文档的新oson字节,并将新oson字节作为json_transform()的返回值返回,使得调用lobassignment运算符可以执行完全文档替换。[0149]8.5oson字节码变更以支持部分oson更新[0150]用新的操作码(opcode)来扩展oson,以指示json节点内容不在原地,而是位于到新偏移(在此处例如使用重定向墓碑存储更新的内容)的转发地址。[0151]对于对象和数组新元素插入,oson部分更新可以预先分配对象或数组中的子项,其量是2的幂。这需要添加另一个新操作码upd_xsz_res,该操作码指示节点有为生长预留的额外空间。如果json树节点标头是upd_xsz_res,则其下一个字节编码为该节点保留的额外空间的大小。大小被编码为2的幂,因此一个字节就足够了。在空间大小字节之后可以是通常的操作码。[0152]8.6客户端oson解码器[0153]客户端侧oson解码器被增强以处理已经经历部分更新的oson。二进制映像的客户端接口暴露逻辑文档(当前状态),并且终端用户不直接知道可能已经发生的任何部分更新。oson的其他客户端技术在相关的美国专利申请xx/xxx,xxx中提出。[0154]这些技术可能会被取证地检测到,因为json_transform()的解释计划将显示部分oson更新优化,并且有运行时统计信息跟踪在运行时期间完成了多少部分更新。[0155]硬件概述[0156]根据一个实施例,这里描述的技术由一个或多个专用计算设备实现。专用计算设备可以被硬连线以执行所述技术,或者可以包括数字电子设备,诸如被永久编程以执行所述技术的一个或多个专用集成电路(asic)或现场可编程门阵列(fpga),或者可以包括一个或多个被编程为根据固件、存储器、其他存储装置或其组合中的程序指令来执行所述技术的通用硬件处理器。这种专用计算设备还可以将定制的硬连线逻辑、asic或fpga与定制编程相结合,以实现这些技术。专用计算设备可以是台式计算机系统、便携式计算机系统、手持设备、联网设备或结合了硬连线和/或程序逻辑以实现所述技术的任何其他设备。[0157]例如,图6是示出可在其上实现本发明实施例的计算机系统600的框图。计算机系统600包括用于传送信息的总线602或其他通信机制,以及与总线602耦合用于处理信息的硬件处理器604。硬件处理器604可以是例如通用微处理器。[0158]计算机系统600还包括耦合到总线602的主存储器606,诸如随机存取存储器(ram)或其他动态存储设备,用于存储信息和要由处理器604执行的指令。主存储器606还可用于在要由处理器604执行的指令的执行期间存储临时变量或其他中间信息。当存储在处理器604可访问的非瞬态存储介质中时,这些指令将计算机系统600呈现为专用机器,该专用机器被定制以执行指令中指定的操作。[0159]计算机系统600还包括耦合到总线602的只读存储器(rom)608或其他静态存储设备,用于存储处理器604的静态信息和指令。诸如磁盘、光盘或固态驱动器的存储设备610被提供并耦合到总线602以用于存储信息和指令。[0160]计算机系统600可以经由总线602耦合到显示器612,例如阴极射线管(crt),用于向计算机用户显示信息。包括字母数字键和其他键的输入设备614耦合到总线602,用于将信息和命令选择传送到处理器604。另一种类型的用户输入设备是光标控件616,诸如鼠标、轨迹球或光标方向键,用于向处理器604传送方向信息和命令选择并用于控制显示器612上的光标移动。该输入设备通常在第一轴(例如,x)和第二轴(例如,y)这两个轴上具有两个自由度,这允许该设备指定平面中的位置。[0161]计算机系统600可以使用定制的硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑来实现在此描述的技术,所述定制的硬连线逻辑、一个或多个asic或fpga、固件和/或程序逻辑与计算机系统相结合使得或编程计算机系统600成为专用机器。根据一个实施例,这里的技术由计算机系统600响应于处理器604执行主存储器606中包含的一个或多个指令的一个或多个序列而执行。这样的指令可以从诸如存储设备610的另一存储介质读入到主存储器606中。主存储器606中包含的指令序列的执行使处理器604执行在此描述的处理步骤。在替代实施例中,可以使用硬连线电路来代替软件指令或与软件指令结合使用。[0162]在此使用的术语“存储介质”指的是存储使机器以特定方式操作的数据和/或指令的任何非瞬态介质。这种存储介质可以包括非易失性介质和/或易失性介质。非易失性介质包括例如光盘、磁盘或固态驱动器,例如存储设备610。易失性介质包括动态存储器,例如主存储器606。常见形式的存储介质包括例如软盘、软盘、硬盘、固态驱动器、磁带或任何其他磁性数据存储介质、cd-rom、任何其他光学数据存储介质、任何具有孔图案的物理介质、ram、prom和eprom、闪存-eprom、nvram、任何其他存储芯片或盒式磁带。[0163]存储介质与传输介质不同,但可以与传输介质结合使用。传输介质参与存储介质之间的信息传输。例如,传输介质包括同轴电缆、铜线和光纤,包括构成总线602的线。传输介质还可以采用声波或光波的形式,例如在无线电波和红外线数据通信期间产生的那些。[0164]在将一个或多个指令的一个或多个序列传送到处理器604以供执行时,可以涉及各种形式的介质。例如,指令最初可以被承载在远程计算机的磁盘或固态驱动器上。远程计算机可以将指令加载到其动态存储器中,并使用调制解调器通过电话线发送指令。计算机系统600本地的调制解调器可以接收电话线上的数据,并使用红外发送器将数据转换成红外信号。红外检测器可以接收红外信号中携带的数据,并且适当的电路可以将数据放置在总线602上。总线602将数据传送到主存储器606,处理器604从主存储器606检索并执行指令。由主存储器606接收的指令可以可选地在处理器604执行之前或之后存储在存储设备610上。[0165]计算机系统600还包括耦合到总线602的通信接口618。通信接口618提供与连接到本地网络622的网络链路620的双向数据通信耦合。例如,通信接口618可以是综合业务数字网(isdn)卡、电缆调制解调器、卫星调制解调器或调制解调器,以提供到相应类型的电话线的数据通信连接。作为另一示例,通信接口618可以是局域网(lan卡)卡,以提供到兼容的局域网的数据通信连接。还可以实现无线链路。在任何这样的实现中,通信接口618发送和接收携带表示各种类型信息的数字数据流的电、电磁或光信号。[0166]网络链路620通常通过一个或多个网络向其他数据设备提供数据通信。例如,网络链路620可以通过本地网络622提供到主计算机624或到由互联网服务提供商(isp)626操作的数据设备的连接。isp626进而通过现在通常被称为“互联网”628的万维网分组数据通信网络提供数据通信服务。本地网络622和因特网628都使用携带数字数据流的电、电磁或光信号。通过各种网络的信号以及网络链路620上和通过通信接口618的信号是传输介质的示例形式,其携带去往和来自计算机系统600的数字数据。[0167]计算机系统600可以通过(多个)网络、网络链路620和通信接口618发送消息和接收数据,包括程序代码。在互联网示例中,服务器630可以通过互联网628、isp626、本地网络622和通信接口618发送应用程序的请求代码。[0168]所接收的代码可以在其被接收时由处理器604执行,和/或存储在存储设备610或其他非易失性存储器中以供稍后执行。[0169]软件概述[0170]图7是可用于控制计算系统600的操作的基本软件系统700的框图。软件系统700及其组件,包括它们的连接、关系和功能,意在仅是示例的,而不是用于限制示例实施例的实现。适合于实现示例实施例的其他软件系统可以具有不同的组件,包括具有不同连接、关系和功能的组件。[0171]软件系统700被提供用于指导计算系统600的操作。可以存储在系统存储器(ram)606和固定存储(例如,硬盘或闪存)610上的软件系统700包括内核或操作系统(os)710。[0172]os710管理计算机操作的低级方面,包括管理进程的执行、存储器分配、文件输入和输出(i/o)以及设备i/o。被表示为702a、702b、702c…702n的一个或多个应用程序可以被“加载”(例如,从固定存储设备610转移到存储器606中)以供系统700执行。打算在计算机系统600上使用的应用或其他软件也可以存储为一组可下载的计算机可执行指令,例如,用于从互联网位置(例如,web服务器、应用商店或其他在线服务)下载和安装。[0173]软件系统700包括图形用户界面(gui)715,用于以图形(例如,“点击”或“触摸手势”)方式接收用户命令和数据。这些输入又可以由系统700根据来自操作系统710和/或(多个)应用702的指令来操作。gui715还用于显示来自os710和(多个)应用702的操作结果,于是用户可以提供附加输入或终止会话(例如,注销)。[0174]os710可以直接在计算机系统600的裸硬件720(例如,处理器604)上执行。或者,可以在裸硬件720和os710之间插入管理程序或虚拟机监视器(vmm)730。在该配置中,vmm730充当os710和计算机系统600的裸硬件720之间的软件“缓冲”或虚拟化层。[0175]vmm730实例化并运行一个或多个虚拟机实例(访客机器)。每个访客机器包括诸如os710的“访客”操作系统,以及被设计为在访客操作系统上执行的一个或多个应用,诸如(多个)应用702。vmm730向访客操作系统呈现虚拟操作平台并管理访客操作系统的执行。[0176]在一些情况下,vmm730可以允许访客操作系统运行,就好像它直接在计算机系统700的裸硬件720上运行一样。在这些情况下,被配置为直接在裸硬件720上执行的相同版本的访客操作系统也可以在vmm730上执行,而无需修改或重新配置。换言之,在某些情况下,vmm730可以向访客操作系统提供完全的硬件和cpu虚拟化。[0177]在其他情况下,访客操作系统可以被专门设计或配置为在vmm730上执行以提高效率。在这些情况下,访客操作系统“知道”它在虚拟机监视器上执行。换言之,在某些情况下,vmm730可以向访客操作系统提供半虚拟化。[0178]计算机系统进程包括硬件处理器时间的分配和(物理的和/或虚拟的)存储器的配额,存储器的配额用于存储由硬件处理器执行的指令,用于存储由执行指令的硬件处理器生成的数据,和/或用于在计算机系统进程不运行时在硬件处理器时间的配额之间存储硬件处理器状态(例如寄存器的内容)。计算机系统进程在操作系统的控制下运行,并且可以在计算机系统上执行的其他程序的控制下运行。[0179]云计算[0180]这里通常使用术语“云计算”来描述一种计算模型,其使得能够按需访问诸如计算机网络、服务器、软件应用和服务的计算资源的共享池,并且允许以最少的管理努力或服务提供商交互来快速提供和释放资源。[0181]云计算环境(有时称为云环境或云)可以以各种不同的方式实现,以最好地满足不同的需求。例如,在公共云环境中,底层计算基础设施由向其他组织或公众提供云服务的组织拥有。相比之下,私有云环境通常仅供单个组织使用或在其内部使用。社区云旨在由社区内的多个组织共享;而混合云包括通过数据和应用可移植性绑定在一起的两种或更多种类型的云(例如,私有云、社区云或公共云)。[0182]通常,云计算模型使以前可能由组织自己的信息技术部门提供的一些职责能够作为云环境中的服务层交付,供消费者(根据云的公共/私有性质,在组织内部或外部)使用。根据具体实施情况,每个云服务层提供的组件或功能的准确定义可能会有所不同,但常见的示例包括:软件即服务(saas),其中消费者使用在云基础设施上运行的软件应用,而saas提供商管理或控制底层云基础设施和应用。平台即服务(paas),其中消费者可以使用paas提供商支持的软件编程语言和开发工具来开发、部署或控制他们自己的应用,而paas提供商管理或控制云环境的其他方面(即,运行时执行环境下的所有内容)。基础架构即服务(iaas),其中消费者可以部署和运行任意软件应用,和/或调配处理、存储、网络和其他基本计算资源,而iaas提供商管理或控制底层物理云基础架构(即操作系统层以下的所有内容)。数据库即服务(dbaas),其中消费者使用在云基础架构上运行的数据库服务器或数据库管理系统,而dbaas提供商管理或控制底层云基础架构和应用。[0183]上述基本计算机硬件和软件以及云计算环境是为了说明可用于实现(多个)示例实施例的基本底层计算机组件而呈现的。然而,(多个)示例实施例不一定限于任何特定计算环境或计算设备配置。相反,(多个)示例实施例可以在本领域技术人员根据本公开将理解为能够支持在此呈现的(多个)示例实施例的特征和功能的任何类型的系统体系结构或处理环境中实现。[0184]数据库概述[0185]本发明的实施例在数据库管理系统(dbms)的上下文中使用。因此,提供了示例dbms的描述。[0186]通常,诸如数据库服务器之类的服务器是集成软件组件和计算资源的分配的组合,所述计算资源例如是用于执行集成软件组件的节点上的存储器、节点和进程,其中软件和计算资源的组合专用于代表服务器的客户端提供特定类型的功能。数据库服务器管理并促进对特定数据库的访问,处理客户端访问数据库的请求。[0187]用户通过向数据库服务器提交使数据库服务器对存储在数据库中的数据执行操作的命令来与dbms的数据库服务器交互。用户可以是在客户端计算机上运行的与数据库服务器交互的一个或多个应用。多个用户在这里也可以统称为用户。[0188]数据库词典[0189]数据库包括数据和存储在诸如一组硬盘的永久性存储装置机制上的数据库词典。数据库由其自己单独的数据库词典定义。数据库词典可以包括存储数据库元数据的多个数据结构。例如,数据库词典可以包括多个文件和表。数据结构的部分可以被高速缓存在数据库服务器的主存储器中。[0190]数据库词典包括定义包含在数据库中的数据库对象的元数据。实际上,数据库词典定义了数据库的大部分内容。当数据库对象被认为是由数据库词典定义时,数据库词典包含定义数据库对象的属性的元数据。例如,定义数据库表的数据库词典中的元数据可以指定列的列名和数据类型,以及存储该表的数据的一个或多个文件或其部分。定义过程的数据库词典中的元数据可以指定过程的名称、过程的参数和返回数据类型以及参数的数据类型,并且可以包括源代码及其编译版本。[0191]数据库对象包括表、表列和表空间。表空间是一组一个或多个文件,用于存储各种类型的数据库对象(如表)的数据。如果数据库对象的数据存储在表空间中,则数据库字典会将数据库对象映射到保存该数据库对象的数据的一个或多个表空间。[0192]数据库对象可以由数据库词典定义,但是数据库词典本身中的元数据可以仅部分地指定数据库对象的属性。其他属性可以由可能不被认为是数据库词典一部分的数据结构来定义。例如,在java类中实现的用户定义函数可以通过指定用户定义函数的名称并通过指定对包含java类的源代码的文件(即,java文件)和类的编译版本(即,类文件)的引用来部分地由数据库词典定义。[0193]数据库操作[0194]dbms参考数据库词典来确定如何执行提交给dbms的数据库命令。数据库命令可以访问由词典定义的数据库对象。数据库命令可以是数据库语句的形式。要使数据库服务器处理数据库语句,数据库语句必须符合数据库服务器支持的数据库语言。许多数据库服务器支持的数据库语言的一个非限制性示例是sql,包括由诸如oracle的数据库服务器(例如,oracle数据库11g)支持的专有形式的sql。向数据库服务器发出sql数据定义语言(“ddl”)指令,以创建或配置数据库对象,例如表、视图或复杂类型。向dbms发布数据操纵语言(“dml”)指令以管理存储在数据库结构内的数据。例如,select、insert、update和delete是某些sql实现中常见的dml指令示例。sql/xml是在对象关系数据库中操作xml数据时使用的sql的常见扩展。[0195]多节点数据库管理系统由相互连接的节点组成,这些节点共享对同一数据库的访问。通常,节点经由网络互连,并且在不同程度上共享对共享存储的访问,例如对存储在其上的一组盘驱动器和数据块的共享访问。多节点数据库系统中的节点可以是经由网络互连的一组计算机(例如,工作站、个人计算机)的形式。或者,节点可以是网格的节点,该网格由与机架上的其他服务器刀片互连的服务器刀片形式的节点组成。[0196]多节点数据库系统中的每个节点托管一个数据库服务器。诸如数据库服务器的服务器是集成软件组件和计算资源分配的组合,所述计算资源例如是用于在处理器上执行集成软件组件的节点上的存储器、节点和进程,所述软件和计算资源的组合专用于代表一个或多个客户端执行特定功能。[0197]可以将来自多节点数据库系统中多个节点的资源分配给运行特定数据库服务器的软件。软件和来自节点的资源分配的每个组合是在本文中被称为“服务器实例”或“实例”的服务器。数据库服务器可以包括多个数据库实例,其中一些或全部运行在单独的计算机上,包括单独的服务器刀片。[0198]查询处理[0199]查询是一个表达式、命令或一组命令,在执行时会导致服务器对一组数据执行一个或多个操作。查询可以指定要从其确定(多个)结果集的(多个)源数据对象,例如(多个)表、(多个)列、(多个)视图或(多个)快照。例如,(多个)源数据对象可以出现在结构化查询语言(“sql”)查询的from子句中。sql是用于查询数据库对象的众所周知的示例语言。如本文所使用的,术语“查询”用于指表示查询的任何形式,包括数据库语句形式的查询和用于内部查询表示的任何数据结构。术语“表”是指由查询引用或定义并表示一组行的任何源对象,诸如数据库表、视图或内联查询块(如内联视图或子查询)。[0200]查询可以在加载(多个)对象时逐行地对(多个)源数据对象中的数据执行操作,或者在已经加载(多个)对象之后对(多个)整个源数据对象执行操作。由(多个)某些操作生成的结果集可以对(多个)其他操作可用,并且以这种方式,可以基于某些标准过滤或缩小结果集,和/或与(多个)其他结果集和/或(多个)其他源数据对象联接或组合。[0201]子查询是与查询的(多个)其他部分或(多个)组件不同的查询的部分或组件,并且可以与查询的(多个)其他部分或(多个)组件分开(即,作为单独的查询)进行评估。查询的(多个)其他部分或(多个)组件可以形成外部查询,该外部查询可以包括也可以不包括其他子查询。当为外部查询计算结果时,嵌套在外部查询中的子查询可以被单独求值一次或多次。[0202]通常,查询解析器接收查询语句并生成该查询语句的内部查询表示。通常,内部查询表示是一组相互链接的数据结构,它们表示查询语句的各种组件和结构。[0203]内部查询表示可以是节点图的形式,每个相互链接的数据结构对应于节点和所表示的查询语句的组件。内部表示通常在存储器中生成,用于求值、操作和转换。[0204]在前述说明书中,本发明的实施例已经参考了许多具体细节来描述,这些具体细节可以根据实施方式而不同。因此,说明书和附图应视为说明性的,而不是限制性的。本发明范围的唯一和排他性指示符以及申请人希望成为本发明范围的是从本技术发出的权利要求集合的字面和等同范围,其形式为这种权利要求发出的特定形式,包括任何后续更正。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1