专利名称:透明网络边缘数据高速缓存的制作方法
技术领域:
本公开涉及分布式网络之上的数据库高速缓存。
背景技术:
分布式web应用的增殖增加了对远程数据库服务器的应用查询的频率。为了改进这种查询的性能并增强数据可用性,这种应用可使用本地数据库高速缓存。例如,内容分布网络中的边缘服务器可使用邻近的数据库高速缓存来加速数据访问和在网络的边缘处更快地生成动态web内容。
在边缘服务器上高速缓存数据的典型技术依赖于(i)整个数据库的显性复制或其在本地机上的显性部分;或者(ii)对先前查询响应的高速缓存和新查询语句相对于先前已高速缓存的响应的精确匹配。在该复制方案中,由管理员显性指定高速缓存的内容,该管理员必须确定在该边缘节点上将复制数据库表的哪些部分。一旦指定了高速缓存内容,该数据或者作为表名或者作为“物化视图”定义从源服务器复制到边缘高速缓存。
在查询响应高速缓存方案中,动态向高速缓存填充应用查询的响应。高速缓存中的数据通过查询响应的列表来描述,每个响应标志一个查询语句,该查询语句是生成了该响应的查询语句。只有当后续查询通常通过字符串比较匹配于一个对应于已高速缓存的响应的查询字符串时,该响应才用于答复该后续查询。查询响应高速缓存通过对数据进行动态高速缓存而消除对管理员控制的需要,但在分离的区域中低效存储数据,即每个查询响应一个区域。这导致了高的空间开销,因为在许多查询响应中可能复制相同的基本数据。这是因为查询响应常常重叠,通常包括基础数据库的重要和普通部分。此外,因为已高速缓存的查询响应仅用于满足原样重新提交的相同查询,而不能用于可能包含在该响应中的其他查询,所以该方案导致了有限的性能收益。例如,假定一个查找年龄小于30的所有雇员的社会保险号的初始查询。则SQL语句应该是SELECT employee.ssn FROM employee WHEREemployee.age<30假设对于此查询的响应已被高速缓存,且高速缓存接收到一个查找年龄小于25的所有雇员的社会保险号的新查询,则SQL语句应该是SELECT employee.ssn FROM employee WHEREemployee.age<25尽管由于所有年龄小于25岁的雇员也小于30岁,而新查询的响应包括在第一个查询的响应中,但基于精确匹配的查询响应高速缓存不能从该高速缓存来服务于该查询。
总之,显性管理员定义的数据高速缓存需要人工参与,并假定管理员对于每个边缘服务器上的工作负荷和资源具有熟悉的了解。查询响应高速缓存消除了管理员开销,但却遇到了有限的有效性和高的空间开销。而且,一致性管理也由于已高速缓存数据的表示与源服务器中的基本数据之间的不匹配而变得复杂。一致性控制一般需要或者当任何基本表改变时使所有的查询响应无效,或者维护复杂的依赖图。
因此,期望具有一种高速缓存,其不需要管理员指定其内容,或适应根据工作负荷方面的变化或根据该高速缓存所存在的机器上的资源可用性方面的变化的指定的高速缓存。进一步期望该高速缓存在存储开销和一致性维持方面是高效的。
发明内容
用于支持根据本地应用执行的查询的数据动态高速缓存的计算机系统和相应方法解决了先有技术的这些和其他缺点及不利之处。
一种示例性系统包括具有完整数据库的远程服务器;边缘服务器上包括完整数据库子集的本地数据库,该边缘服务器与远程服务器通信;边缘服务器上的本地数据库内的共享表,用于高速缓存来自完整数据库的结果、接收本地生成的数据、并在确保本地数据库与远程数据库之间的数据一致性的同时根据可用存储需求调整高速缓存的内容。
一种示例性装置包括边缘数据高速缓存,该边缘数据高速缓存包括查询评估器、高速缓存索引、高速缓存资源库、资源管理器、包含检查器、查询解析器、及一致性管理器,所有这些部件与查询评估器信号通信。
一种示例性的用于本地服务器满足针对至少一个远程服务器的数据库查询的相应方法包括动态高速缓存该远程服务器的先前数据库查询的结果;将本地数据库与本地服务器相关联;将多个高速缓存结果存储在本地数据库的共享表中;以及将多个高速缓存结果用于满足对于本地服务器的新数据库查询中。
根据下面结合附图对示例性实施例的描述,本公开的这些和其他方面、特征和优点将变得显而易见。
本公开根据下列示例性附图教授一种透明网络边缘数据高速缓存,其中图1示出与源服务器连接的两个边缘服务器的示意图;图2示出图1的边缘服务器的数据高速缓存的方框图;图3示出图2的边缘服务器数据库高速缓存中的不同类查询的树状图;图4示出图1的边缘服务器的整个查询处理的流程图;图5示出图2的数据高速缓存所使用的普通模式共享存储技术的示意图;图6示出在图1源服务器中的同一表上的两个查询的数据表示例;图7示出一致性维护协议的示意图;图8示出考虑了一致性的查询处理算法的流程图;图9示出用于将结果插入高速缓存的算法的流程图;图10示出用于执行更新事务的算法的流程图;以及图11示出用于调整高速缓存占用空间的后台高速缓存清除算法的流程图。
具体实施例方式
本公开的实施例提供了一种要由本地机维护的允许对于远程服务器的数据库查询的动态数据库高速缓存。该高速缓存利用本地数据库引擎维护先前查询结果的部分的但语义一致的“物化视图”。其被基于应用查询流而动态填充。工作于查询谓词的包含检查器用于确定新查询的结果是否包含于已高速缓存的结果并集中。普通本地表用于在重叠查询结果之间共享可能的物理存储器。通过将插入、删除和更新从源数据库传播到它们的已高速缓存本地副本,来维护数据一致性。后台清除算法通过驱除过剩的由一致性协议传播的行以及属于已标记要从该高速缓存驱除的查询的行,来持续或周期性删除普通本地表的内容。术语“查询响应”和“查询结果”在本公开中交替使用。
在下面的描述中,下列定义可能有助于理解示例性实施例的原理和/或操作数据库表由关系数据库系统定义的关联表。
查询谓词查询中指定的约束条件(例如SQL语句中WHERE子句),其用作选择在查询结果中返回基本表中的哪些行的标准。
查询结果对数据库系统的SQL查询所返回的响应。查询结果看起来像具有行和列的表。
查询结果集合对应于多个查询的多个结果集合。
增量一致性数据库高速缓存中的数据在给定时间窗内相对于源数据库中的数据保持一致的需求。准确地,它意指已高速缓存数据在当前时刻Tc的状态与源数据库在时刻Tp的过去状态一致,其中Tp在预定的最大时间窗内。
查询/事务处理时戳服务器生成的单调递增且与在源服务器上执行的所有查询和事务相关的唯一数字。该时戳反映了事务或查询相对于并发操作的序列顺序。
刷新消息由源服务器发送到边缘高速缓存、反映最近对源数据库中表的改变(例如插入、更新、删除语句)的消息。对基本表的变化可在多个刷新消息中分批处理,但这些刷新消息以它们所报告的变化发生顺序进行传播。
立即更新可见性在应用成功完成更新后,该同一应用查询必须查看对数据库更新的结果的属性。
单调状态转换由应用提交给高速缓存的两个连续查询将查看及时前进的数据库状态的属性,其中第二个查询在接收到第一个查询的响应之后提交。也就是说,第二个查询将查看到比第一个查询查看到的状态在时间上是新近的或更近的数据库状态。
如图1中所示,具有“边缘数据高速缓存”的示例性网络实施例由参考标号100统一表示。网络100可以是较大规模应用系统的一部分。网络100包括连接到执行web请求的客户机的两个边缘服务器109和110,这两个边缘服务器还通过网络连接107连接到对主数据库和web站点提供宿主的源服务器108。源服务器108包括数据库101、应用服务器102和web服务器103。边缘服务器109、110每个都包括应用服务器105和web服务器106。然而,边缘服务器不具有源站点中存储的整个数据库的拷贝。而是,它使用新的边缘数据高速缓存104。边缘服务器接收到对动态内容的请求,且由边缘应用服务器105中存在的应用部件处理该请求。这些部件发出数据库查询,其被边缘数据高速缓存104截取并从本地数据库中对其进行处理,如果可能的话。如果该查询不能由本地数据库处理,则边缘数据高速缓存104向源数据库101转发该请求并从那里检索回结果。
转到图2,边缘数据高速缓存由参考标号200统一表示。边缘数据高速缓存200包括与主要部分202连接的Java小服务程序201。主要部分202包括JDBC接口203,其以信号通信与查询解析器205、包含检查器207、查询评估器204、高速缓存索引206、本地资源库208、一致性管理器210和资源管理器209连接。高速缓存功能实现于下列部件中查询解析器205将SQL串转换为“查询语句”数据结构,标识各列的列表的分析树、目标表以及该查询所访问的各种子句。具体地,将WHERE子句解析为以AND-OR规范形式存储的布尔判断。这允许包含检查器对查询谓词对执行等价和包含操作。
查询包含检查器207确定新查询的结果是否包括在先前已高速缓存的查询的结果中。包含可以被检查为对于较早查询、较早查询的真子集或多个较早查询的并集的真子集的精确匹配。
高速缓存索引206提供包含检查。当查询谓词复杂或已高速缓存查询的集合太长时,包含检查可能在计算上是高成本的。当接收到一个新的查询时,不是相对于所有先前已高速缓存的查询进行检查,而是仅集中于作用于相同表和列的查询。该高速缓存索引将已高速缓存的查询根据表名和列名组织在多级哈希表中。
查询评估器204是高速缓存的核心模块,其包括高速缓存逻辑。它确定访问是命中还是未命中,及在未命中时由后端返回的结果是否应当插入该高速缓存中。在将未命中的查询传递给后端以预取数据和改进高速缓存性能之前,它还可能重写这些在高速缓存中未命中的查询。
资源管理器209维护关于命中率和响应时间的统计数据,并维持高速缓存配置参数。它可改变配置参数以适应某些工作负荷,如果所收集到的统计数据指示这样一个需要的话。
高速缓存资源库208存储结果。在高速缓存未命中时,查询结果按照高速缓存评估器所确定的存储于本地数据库表中。本公开的实施例使用混合物理存储策略。一些查询使用每个查询结果一个表的模式,而其他查询则通过部分填充后端基本表的本地副本来共享物理存储器。
一致性管理器210响应从后端数据库接收到的刷新消息,对本地高速缓存的数据进行更新。
操作中,一个查询源自应用或应用部件,诸如Java小服务程序201。数据库高速缓存202接收到该查询。具体地,高速缓存203中的JDBC接口适配器负责与应用接口。该接口适配器是Java JDBC标准定义和所需的一组类的实现。然后,“查询语句”被传递给查询评估器204。该查询评估器是负责决定是本地还是远程执行该查询并负责控制高速缓存的操作的模块。在接收到查询语句时,查询评估器通过调用查询解析器205来解析所接收到的语句。该解析器将该语句分类到四类中的一类。该语句的处理依赖于其查询类别。
现在转到图3,参考标号300表示一个查询树。查询树300示出了不同的查询类别。高速缓存301接收的查询被组织为两类,可包含检查查询302和不可包含检查查询303。已高速缓存的可包含检查查询能满足任何其结果能被证明是已高速缓存的查询结果的子集的随后查询。作用于单个表或关联多个表、但不包括group-by子句且不包括合计运算符的查询作为可包含检查查询高速缓存。它们可进一步分为两类全部结果或简单查询304和部分结果或Top-N查询305。
可对不可包含检查查询进行高速缓存,但使用SOL串的精确匹配来执行匹配。它们进一步分为两类合计查询306或复合查询307。使用UDF、子查询或group-by子句的复合查询不由包含检查器处理,其作为精确匹配高速缓存。在其选择列表中使用诸如MIN、MAX、和AVG的合计运算符合计数据的查询也可作为精确查询高速缓存。但是,合计查询306可通过在其选择列表中插入合计运算符而转换为可包含检查查询302。当所估计的益处相当大时,高速缓存进行优化。
简单查询的处理如下。简单查询是那些其结果是基本表的行和列的子集的查询。因此,简单查询不具有任何“GROUP BY”子句、子查询、或用户定义的函数。它们是非Top-N查询,其根据使用基本比较原语的WHERE子句简单选择单个表或多个表的关联的一部分。下面给出简单查询的一个例子SELECT employee.id FROM employee WHEREemployee.age<25如图4中所示,参考标号400表示高级处理算法。高级处理算法400用于处理高速缓存命中或高速缓存未命中。在接收到一个查询时,高速缓存索引用于检索对于同一表列表和列列表的查询。然后,在判断块410,调用包含检查器,以确定此查询是否包括在这些先前已高速缓存的查询中。
在高速缓存命中的情况下,在功能块412,对本地高速缓存执行查询,并返回结果。功能块412还将该查询发送给高速缓存资源库414,功能块412从该高速缓存资源库414接收结果。在高速缓存未命中的情况下,在将该查询发送给后端服务器之前,在功能块416和418重写该查询。进行下面的优化。首先,扩充选择列表,以包括在WHERE子句、order-by子句和having子句中提及的列。这一扩充的目的在于最大化能够执行在该高速缓存中命中的其他查询的可能性。第二,还在选择列表中添加主键列。高速缓存主键列对于在多个具有重叠结果的查询检索同一基本表的相同行时防止重复行被该高速缓存是需要的。在高速缓存未命中时,由后端返回的结果通常不被插入到高速缓存中。在判断块420处,可使用成熟的基于历史的算法,以在功能块422决定那些查询值得高速缓存。结果作为输出被提供,并被发送到高速缓存资源库414。
Top-N查询的处理如下。Top-N查询从通常根据order-by子句存储的结果集合的开始处获取指定数量的行。查询包含和评估算法不同于简单全部结果查询的情况。通过取消Fetch子句,将Top-N查询转换为简单查询。如上面所解释的那样对这些简单查询执行包含。在最后的步骤中,考虑Fetch子句。应该注意,虽然基本查询(没有Fetch子句)是高速缓存命中,但Fetch子句可使它成为高速缓存未命中。例如,考虑下面的两个查询Q1和Q2Q1SELECT id FROM item WHERE cost<15 ORDER BY costFFNRO 20Q1SELECT id FROM item WHERE cost<5 ORDER BY costFFNRO 20如果这两个查询都不存在FETCH FIRST 20 ROWS ONLY算法(“FFNRO 20”)子句,则第二个查询的结果将包括在第一个查询的结果中,即高速缓存命中。但是,当存在该子句时,通过仅仅对查询语句的检查是不保证高速缓存命中的。这样,对Top-N查询的包含检查处理中的第二步是试图对已高速缓存数据进行本地执行。如果检索到了足够的行,则认为该查询是一个高速缓存命中,否则,认为它是一个高速缓存未命中。这种类型的高速缓存未命中称作“部分命中”,因为在本地高速缓存中仅发现了结果的一部分。
如果包含检查未发现任何匹配查询或结果集合不具有足够的行,则将原始查询QN转换为修改查询QN’,其中在Fetch子句中的N的值由较大N’的值(N’=N*扩充-倍数)。例如,在该试验中的默认倍数是2,请求取两倍数量的行。检索到多于应用所请求的行是一个试探,目的在于减少后一“部分命中”查询、即通过了包含检查步骤而未能发现所需数量的行的查询的情况。
合计查询的处理如下。合计查询在其选择列表中具有合计运算符(例如,MAX、MIN、AVG、SUM),或者是可包含检查的。考虑下面的查询,Q3Q3SELECT MAX(cost)FROM item WHERE id=10对于命中的匹配以两个步骤进行。首先,根据SQL串对Q3的精确匹配进行检查,并将整个结果集合返回给应用。接着,如果未发现精确匹配,则通过移除合计运算符将原始查询Q3修改为查询Q4Q4SELECT cost FROM item WHERE id=10如果对于修改后的查询Q4发现了包含匹配,则对本地高速缓存执行原始查询Q3。本地合计cost,并将结果返回给应用。在高速缓存未命中时,修改后的查询Q4在后端执行。如果结果集合大小在阈值内,则将这些结果存储在相应的本地表中,并本地执行原始查询。这使得该高速缓存能够服务于以后具有不同合计运算符的查询。如果结果集合大小出现太长,则原始查询Q3被发送给后端,并将结果存储在新的精确匹配表中。这允许该高速缓存能够服务于任何以后具有严格相同合计条件的查询。这一试探目的在于增加高速缓存命中率,而不会过度增加高速缓存的大小。
复合查询因为复合子句(例如,在WHERE子句中用户定义的函数或子查询)或因为group-by子句而是不可包含检查的。group-by子句生成可仅由具有严格相同的group-by子句和WHERE子句的查询使用的合计数据。同样地,包含检查是不充分的。而是,这种查询的结果存储于分离的结果表中,由查询的SQL串索引。对于这种查询的包含检查是基于SQL串的精确匹配的。这一查找过程是非常快速的,因为它是基于具有作为键的SQL串的哈希表之上的。如果该原样SQL串提交给高速缓存,则对相应的结果表执行本地查询,以检索整个表(即本地执行“SELECT*FROM LOCTAB”)。应该注意,这种查询是成本不高的,在边缘服务器上具有最少的处理时间。
转到图5,参考标号500表示本地资源库。本地资源库500示出查询结果怎样存储于本地高速缓存资源库501中。资源库501被分为两部分,一个用于存储复合或精确匹配查询502,而另一个用于存储可包含检查查询503。精确匹配查询存储于分离的表中,其仅用于响应其描述与已高速缓存查询的SQL串匹配的新查询。例如,查询Q5 504和Q6 505存储于分离的表中,而不管它们的结果是否重叠。
可包含检查查询存储于共享的表中。在同一基本表之上的查询存储于该表的同一本地副本中。例如,该图假定两个查询Q7和Q8从同一表中“SELECT”。由查询Q7 506检索到的元组被首先插入到高速缓存中。然后,由第二个查询Q8 507获取的行被插入到同一表中。当Q8的结果被插入时,已有行以新获取的值进行更新。因此,两个不同查询获取的相同行在该高速缓存中不重复。因为在将所有查询发送到后端服务器之前,要重写它们以获取主键,所以会发现相同的行。
现在转到图6,参考标号600表示高速缓存表结构。高速缓存表结构600示出在同一数据表(这里称作“employee”)之上的两个查询的特定示例,并示出它们的结果数据结构601、602怎样存储于边缘数据库高速缓存中的同一本地表603中。
如图7中所示,参考标号700表示一致性协议。一致性协议700包括边缘服务器部分701,其与后端服务器部分702信号通信。边缘服务器部分701包括DBProxy单元,其与高速缓存资源库704信号通信,以插入查询结果并执行查询。改变APPLY单元705与高速缓存资源库704信号通信,用于刷新表。
后端服务器部分702包括DBMS单元706,其与DB代理单元703信号通信,用于接收查询并提供结果。DBMS单元706还与另一高速缓存资源库707信号通信,用于对高速缓存资源库707进行写和读。高速缓存资源库707与变化捕获单元708信号通信,用于读取近来写入的数据。变化捕获单元708又以信号通信与变化施加单元705连接,用于刷新消息。
这样,通过订阅由源服务器传播的更新流,确保了数据一致性。传统物化视图方案通过对基本数据中的变化(“增量”)重新执行视图定义,来更新已高速缓存的视图。但是,因为边缘数据高速缓存高速缓存的潜在的大量查询(“视图”),所以其需要更有效的机制。由于对已高速缓存的数据作为后端表部分填充的副本进行维护,所以在源处对基本表所提交的改变可以简单“照原样”传播到已高速缓存的版本,而无需重新执行这些查询。将对基本表的更新、删除和插入(“UDI”)传播并施加到边缘高速缓存的部分填充的副本中。以后将在该高速缓存上执行的查询将从这些新传播的变化中检索出任何匹配的元组。这一方案假设大多数web环境特有的缓慢改变数据的特点,并丢弃潜在的不必要的数据传播,以降低判断已高速缓存的视图应怎样更新的处理开销。但是,当一个表正在经受繁重的更新工作负荷时,高速缓存资源管理器可以在指定时期内禁用本地副本。
每当可能时,由边缘应用发出的只读查询可从高速缓存中得到满足。更新事务通常被发送给后端数据库执行,而不是首先将它们施加本地高速缓存。因为边缘数据高速缓存是为大规模使用而设计的,所以一致性协议必须尽可能的松散地与源连接。因此,确保高速缓存一致性的责任尽可能多地落在了边缘高速缓存上,在该边缘高速缓存上资源更加自然地分布。后端服务器应该仅负责周期性的更新传播,它是一个可以卸载到分离过程或机器上的任务。尽管提供较强一致性保证可能引起会限制高速缓存有效性的高成本,现在描述一些诸如立即更新可见性和增量一致性的重要一致性保证怎样可以得到确保的问题。本公开依赖于数据传播器,其捕获所有对源处的表的UDI,并将它们打包在“刷新消息”中转发给边缘高速缓存。将数据变化传播给它们的事务标识符所标记的边缘处,并以事务提交顺序将它们施加到边缘高速缓存。将进入的反映在源站点处提交的事务结果的UDI流施加到本地已高速缓存的表中。
由于UDI以时戳顺序传播并施加到高速缓存中。在该部分中所使用的所有时戳指后端服务器侧提交时戳,所以高速缓存中各元组的值必须反映对应于来自源的上一个传播消息的时戳的数据库状态。更准确地,传播消息的时戳是包括在该消息中的任何更新事务中最大的时戳。因为本地表可以通过传播消息以及通过在未命中时的查询结果插入进行更新,所以在确保增量一致性时出现了挑战。
所保证的一致性属性。高速缓存为应用保证几个重要的一致性属性,即增量一致性、单调转换、和立即更新可见性。高速缓存对于应用来说呈现为真实后端数据库。但是,其内容通常不是与那些存储在后端数据库中的内容同步的。因为高速缓存向应用反映一个可能不同于当前状态的状态,所以其“输出”一个数据库的给定状态。增量一致性的属性要求高速缓存当前输出的数据库状态始终对应于数据库在以前时间点时的过去状态。输出状态与实际状态之间的延迟也是受限的。单调状态转换的属性意味着高速缓存所输出的数据库状态在时间上仅向前移动。立即更新可见性的属性要求如果应用提交一个更新,并随后发出一个查询,则该查询应该观察更新(和所有先前更新)的结果。
保证增量一致性和单调转换。假设高速缓存最初与一分钟前的数据库状态一致。如果一个在该高速缓存中未命中且在源处执行的最新查询的结果被插入,则该高速缓存将包括旧数据与新数据的混合。增量一致性要求已高速缓存的数据总是与数据库的单个过去版本一致。假定一个查询在源处原子地执行。当一个查询未命中且远程执行时,服务器返回其在该查询执行时的最后提交时戳及结果。
转到图8,参考标号800表示查询处理算法。查询处理算法800考虑一致性,并包括用于根据查询的包含检查记录高速缓存命中的功能块801。功能块801将控制传递给判断块802,以进行判断是否出现了高速缓存命中。如果确实出现了命中,则将控制传递给功能块803,以执行共享高速缓存的锁定、查询的本地执行、及共享高速缓存的解锁。但是,如果在块802未出现命中,则将控制传递给功能块804,以远程执行该查询、并将控制传递给判断块805。块805判断该远程执行的查询是否成功。如果成功,则将控制传递给返回块806,以返回已高速缓存的结果“rc”。如果未成功,则将控制传递给判断块807,以判断该结果是否仅是部分的。如果是,则将控制传递给功能块808,以独占地锁定该高速缓存、将结果插入到结果集合中、传播来自服务器的其他信息、并解锁该高速缓存。功能块808将控制传递给返回块809,以返回结果集合“rs”。如果块807的结果是假或否,则将控制直接传递给返回块809。
在操作上,在块807,通过将该查询的时戳与从源服务器接收到的上一个传播消息的时戳cache_ts进行比较,来开始结果插入。应该指出,在附图中,查询和高速缓存时戳分别由它们的长名query_ts(“tq”)和cache_ts(“tc”)来指示,而在别处,由它们的长或短名来指示。如果query_ts大于cache_ts,则该查询观察到了比高速缓存的状态更近的状态。在这一使用情况下,在块808,首先插入未命中的结果,并从源服务器中抽出任何未决的传播消息,以将整个高速缓存快进到更后的时间。最后,将该查询添加到索引中。但是,如果cache_ts大于query_ts,立即插入未命中的结果可能将已高速缓存的数据恢复到过去的值,撤销传播消息所施加的改变且不能满足单调性需求。由于这是一个罕见的竞态条件,所以在这种情况下结果的插入可能被跳过。这通常仅将对该查询的高速缓存延迟到一个后续未命中查询在插入结果时成功时,并且不会严重危及高速缓存有效性。应该指出,在块808中,作为propagate_from_server()的副作用,cache_ts可能会增加。
现在转到图9,参考标号900表示用于将结果插入到高速缓存中的算法。循环块901执行对于查询结果中的每个元组的循环。块901的循环包括判断块902,其用于判断该元组是否在该高速缓存中。如果该元组在该高速缓存中,则将控制传递给功能块903,以更新该元组。如果该元组不在该高速缓存中,则将控制传递给功能块904,以插入该元组。这样,在操作中,对高速缓存的结果集合插入如下进行当在高速缓存中插入一个结果集合时,在块903,以新值复写已有的行,而在块904,将非已有行插入到表中。
如图10所示,参考标号1000表示用于执行更新事务的算法。功能块1001执行对于结果“rc”的远程查询,并将控制传递给判断块1002。如果该查询成功,则块1002将控制传递给返回块1003,以返回结果“rc”。如果该查询未成功,则块1002将控制传递给功能块1004,以从服务器传播该数据。块1004将控制传递给返回块1005,以返回结果“rc”。
立即更新可见性是这样保证的。将边缘应用提交给高速缓存的更新事务传送到源数据库(块1001)。此外,在更新事务完成之后,可在将更新结果返回给应用(1004)之前,通过从源数据库中抽出它们而快速获取更新的结果。
高速缓存空间开销可通过高速缓存置换来调整。为了限制空间开销并优化通常是有限的边缘资源的使用,边缘数据高速缓存依赖于后台垃圾收集进程,其从高速缓存安全驱除不用的数据,同时保持数据一致性。具体地,高速缓存置换的目的在于最大化有限数量可用空间的高速缓存的益处。与传统文件和存储页的置换形成对比,可在多个查询之间共享基本行。
高速缓存置换在本地数据库的使用达到高水印(“HWM”)值时触发。然后,置换开始,直到空间足够空闲并达到低水印(“LWM”)值之下时为止。在没有空间在本地表中插入更多行或创建新表时,不会按照对于一个查询未命中的需要触发置换。置换是后台进程,其可期望与查询服务和更新操作并发进行。
转到图11,参考标号1100表示高速缓存清除算法。算法1100包括功能块1101,其用于扩充表,以添加新列“accessedFlag”。块1101将控制传递给功能块1102,用于为本地表中的所有行将“accessedFlag”重置为假。块1102将控制传递给功能块1103,用于确定将保留在高速缓存中的查询的集合“S”。功能块1103将控制传递给功能块1104,用于重新执行集合“S”中的所有查询,并将任何所选择行的“accessedFlag”设置为真。然后,块1104将控制传递给功能块1105,用于删除其“accessedFlag”为假的所有行。
用于高速缓存清除的算法1100称作组置换。此算法是实现简单的,不会增加命中、未命中、或更新传播的开销。在块1103,根据置换策略,标记一组“牺牲”查询,以便从高速缓存中删除。为了确保属于“牺牲”查询的非重叠行被正确标记,执行下面的步骤。首先,在块1102,将实现为在本地表创建期间定义的控制列的已访问标志与所有已高速缓存行关联,并被设为假。然后,在块1104,在后台执行非牺牲查询。这一后台执行可发生于扩充时期,以不会影响前台查询的性能。每当查询执行时,为任何所选择的行将控制列中相应的项设为真。在块1105,在这一执行周期结束时,任何其控制列(已访问标志)仍然为假的行可被安全删除。为了在垃圾收集周期已启动执行之后防止由高速缓存来命中或由一致性管理器插入或更新的行的删除,设置任何已更新或插入到本地表中的行的控制列。
在一种情况下,本公开的实施例获得了两个有利方面查询相应高速缓存的益处,具体地,简易管理和适于在工作负载或在资源可用性方面的变化的能力;以及基本表复制的益处,具体地,非冗余数据存储的空间效率,及支持有效的基于更新的一致性协议的能力。
因此,本公开的一方面在于本地机用于通过在先前查询的动态高速缓存结果中应用高速缓存策略,来满足对于至少一个远程服务器的数据库查询。本公开的实施例的另一方面在于本地数据库与本地机相关联,并用于在共享表中存储多个查询结果。本公开的实施例的又一方面在于通过应用作用于查询谓词的包含检查器,将本地存储的查询结果用于满足新查询。包含检查器确保查询谓词所定义的新查询请求的数据逻辑上包括在已高速缓存于多个已高速缓存查询结果中的数据集合中,其是由先前查询的谓词并集所描述的。
本公开的实施例的另一方面在于可能时将存储在边缘高速缓存中的数据组织为在源数据库中定义的表的“部分副本”。从源服务器接收到的查询结果被插入到本地数据库中。将构成同一基本表的查询结果插入到同一本地高速缓存版本的基本表中。本公开的实施例的又一方面在于诸如包含子查询、合计或用户定义的函数的复合查询的结果本地存储为多个表,一个结果一个表,其中复合查询的结果不是简单的基本表的行和列的子集。
本公开的实施例的又一方面在于它是透明的,不需要对应用进行改变。此外,由于高速缓存逻辑存在于数据库之外,所以它与任何后端或本地数据库是兼容的,且不需要对数据库服务器进行改变。本公开的实施例的另一方面在于通过将对源处的基本表所发生的改变传播到边缘高速缓存,并通过在处理进入的查询时应用明了一致性的算法,来维护本地高速缓存的数据的一致性。本公开的实施例的又一方面在于高速缓存可通过从本地数据库中牺牲无用查询结果,而不危及一致性或正确性,调整本地使用的空间数量。
根据这里的教授,本领域的普通技术人员可以容易地探知本公开的这些和其他特征和优点。应该理解,本公开的教授可以各种硬件、软件、固件、专用处理器或它们的组合的形式来实现。
本公开的教授可以实现为例如硬件和软件的组合。此外,优选地,软件以有形实现于程序存储单元上的固件来实现。该软件可以上载到包括任何适当体系结构的机器上并由其执行。优选地,该机器实现于具有诸如一个或多个中央处理单元(“CPU”)的、随机存储器(“RAM”)、及输入/输出(“I/O”)接口的计算机平台上。该计算机还可包括操作系统和微指令代码。这里所描述的各过程和功能可以是可由硬件执行的微指令代码的一部分、或软件的一部分、或任何它们的组合。此外,各种诸如附加数据存储部件的其他外围部件可以与该计算机平台相连。
应该进一步理解,因为附图中所示的某些组成系统部件和方法优选以软件来实现,所以这些系统部件或处理功能块之间的实际连接可依本公开被编程的方式而不同。给定这里的教授,本领域的普通技术人员将能够设想本公开的这些和类似的实现或设计。
尽管这里参照附图对示例性实施例进行了描述,但应该理解,本公开并不限于这些确切的实施例,本领域的普通技术人员可以在其中实现各种变换和修改,而不脱离本公开的范围和实质。所有这样的变换和修改都旨在包括在如所附权利要求中陈述的本公开的范围内。
权利要求
1.一种边缘数据高速缓存(202),包括查询评估器(204);高速缓存索引(206),其与查询评估器信号通信;高速缓存资源库(208),其与查询评估器信号通信;资源管理器(209),其与查询评估器信号通信;包含检查器(207),其与查询评估器信号通信;查询解析器(205),其与查询评估器信号通信;一致性管理器(210),其与查询评估器信号通信。
2.一种包括如权利要求1中定义的数据高速缓存的边缘服务器(200),还包括小服务程序(210),其与该边缘数据高速缓存信号通信。
3.一种包括如权利要求2中定义的边缘服务器(109、110)的用于根据本地应用执行的查询动态高速缓存数据的系统(100),该系统还包括远程服务器(108),其具有完整的数据库(101);边缘服务器上的本地数据库(104),其包括完整数据库的子集,该边缘服务器与远程服务器信号通信;边缘服务器上的本地数据库内的多个共享表(503、603),用于高速缓存来自完整数据库的结果、接收本地生成的数据、并在确保本地数据库与远程数据库之间的数据一致性的同时根据可用存储需求调整高速缓存的内容(208)。
4.一种包括用于根据本地应用执行的查询动态高速缓存数据的边缘服务器(109)的系统(100),该系统还包括用于动态高速缓存远程服务器的先前数据库查询的结果的装置;用于将本地数据库与本地服务器相关联的装置;用于将多个高速缓存结果存储在本地数据库的共享表中的装置;以及用于将上述多个高速缓存结果用于满足对本地服务器的新数据库查询的装置。
5.一种机器可读的程序存储装置,其有形地实现可由该机器执行以实现用于根据本地应用执行的查询动态高速缓存数据的方法步骤(400)的指令程序,该方法步骤包括动态高速缓存(414)该远程服务器的先前数据库查询的结果;将本地数据库与本地服务器相关联(420);将多个高速缓存结果存储(422)在本地数据库的共享表中;以及将上述多个高速缓存结果用于满足(412)对于本地服务器的新数据库查询中。
6.一种让本地服务器满足针对至少一个远程服务器的数据库查询的方法(400),该方法包括动态高速缓存(414)该远程服务器的先前数据库查询的结果;将本地数据库与本地服务器相关联(420);将多个高速缓存结果存储(422)在本地数据库的共享表中;以及将上述多个高速缓存结果用于满足(412)对于本地服务器的新数据库查询中。
7.权利要求6的方法,还包括由上述多个高速缓存结果和任何其他插入到本地数据库中的数据构成存储数据(705);以及确保高速缓存数据的一致性(708)。
8.权利要求6的方法,还包括根据至少一个调整标准调整(1103、1105)上述共享表的内容。
9.权利要求8的方法,其中上述至少一个调整标准包括选自以下的标准本地服务器中的可用空间;查询的存储需求;查询的执行成本;本地与远程服务器之间的网络性能;本地与远程服务器上的负荷;已高速缓存查询的访问率;及这些的任何组合。
10.权利要求6的方法,其中使用的步骤包括加速对上述至少一个远程服务器的查询。
11.权利要求6的方法,其中存储的步骤包括将在单个数据库表之上的简单(304)和Top-N(305)查询的结果插入到共享基本表中;将关联查询的结果保存在共享关联表中;构成包括所有共享基本表和共享关联表的共享表资源库;将复合查询的结果存储在分离表中,每个查询结果一个表;以及根据上述多个分离表构成精确匹配资源库。
12.权利要求11的方法,其中插入的步骤包括只要在首先接收到对于基本表的简单查询时,就在高速缓存中创建单个本地表,以对应于源服务器中的基本表;将上述简单查询的结果插入到上述本地表中;以及将所有后续简单查询的结果插入到该本地表的基本表中。
13.权利要求11的方法,其中保存的步骤包括在高速缓存中创建本地关联表,以对应于关联查询中的每个关联条件和表列表;以及将所有后续在同一表列表之上并且具有相同关联条件的关联查询的结果插入到本地关联表中。
14.权利要求6的方法,其中使用的步骤包括下面中的至少一个如果新查询为复合查询,则在精确匹配资源库中搜索对于新查询的响应;以及如果新查询不是复合查询,则从共享表资源库的数据中子选择对于新查询的响应。
15.权利要求14的方法,其中搜索的步骤包括如果在精确匹配资源库中发现上述新查询的SQL串,则将高速缓存中对应于该SQL串的查询结果返回给应用;如果在精确匹配资源库中未发现上述新查询的SQL串,则将新查询发送给源服务器;如果在精确匹配资源库中未发现上述新查询的SQL串,则将所接收到的查询结果插入到精确匹配资源库中;以及如果在精确匹配资源库中未发现上述新查询的SQL串,则将高速缓存中的查询结果与该新查询的SQL串相关联。
16.权利要求14的方法,其中子选择的步骤包括利用包含检查器试图证实上述新查询的结果集合的结果包含在已高速缓存查询结果的并集中;如果上述试图证实的步骤成功完成,则以本地表名替代该新查询中提及的表;如果上述试图证实的步骤成功完成,则在共享表资源库之上评估该新查询;以及如果该查询是Top-N查询,则计数从本地高速缓存中接收到的行数,如果该行数未超过应用所请求的行数,则通过重写该新查询并生成重写的查询、将重写的查询发送给源服务器并将从源服务器接收到的结果存储在共享表资源库中、将重写查询的谓词添加到共享表资源库的索引中、在该共享表资源库之上评估该新查询、及将评估步骤的结果返回给应用来进行处理。
17.权利要求12的方法,其中试图的步骤包括下面的至少一个发现满足这样的条件的匹配已高速缓存查询,其中的条件为新查询的选择列表中的列的列表包括在匹配查询的选择列表中的列的列表中、新查询的谓词逻辑上意味着匹配查询的谓词、及新查询的各子句中提及的所有列包括在匹配查询的选择列表中;以及发现满足这样的条件的匹配已高速缓存查询的集合,其中的条件为新查询的选择列表中的列的列表包括在每一个匹配查询的选择列表中的列的列表中、当所有的谓词由逻辑或运算符连接时新查询的谓词逻辑上意味着所有匹配查询谓词的逻辑和所构成的谓词、及新查询的各子句中提及的所有列包括在每一个匹配查询的选择列表中。
18.权利要求16的方法,其中重写的步骤包括步骤将已访问表的主键添加到上述查询的选择列表中;如果资源管理器估计所得到的结果集合不太长或不值得高速缓存,则从上述选择列表中去掉合计运算符;以及扩充该查询所请求的行数(N),以检索更多行。
19.权利要求7的方法,其中确保的步骤包括保证应用所指定的一组一致性需求中的至少一个,该组一致性需求包括增量一致性、立即更新可见性、及单调状态转换。
20.权利要求6的方法,进一步包括确保先前查询的结果的增量一致性,其包括步骤向数据高速缓存订阅由源服务器传播并且包括对后端表施加的更新、删除和插入的刷新消息;只要当接收到刷新消息时,就将该更新、删除和插入施加到共享表资源库中的本地高速缓存的表;使在改变过的刷新消息中提及的任何精确匹配资源库中的任何共享关联表无效;将等于其结果包括在刷新消息中的任何事务的最大时戳的刷新消息时戳与该刷新消息相关联;将等于最后施加到高速缓存的刷新消息的时戳的已高速缓存设置时戳与先前查询的结果相关联;将新查询时戳与新查询相关联;将新查询时戳与高速缓存的设置时戳相比较;以及如果新查询时戳超过了已高速缓存的设置时戳,则插入对该新查询的响应;以及如果该新查询时戳超过了已高速缓存的设置时戳,则从数据库服务器中检索未决的刷新消息。
21.权利要求6的方法,进一步包括确保立即更新可见性,其包括步骤将边缘数据高速缓存接收的更新事务路由到源服务器;在从源服务器接收到更新完成通知之后,在以完成状态响应应用之前,从源服务器抽出刷新消息;以及在上述路由和抽出步骤在处理中时,确保该应用未对已高速缓存的数据进行访问。
22.权利要求8的方法,其中调整的步骤包括根据存储空间管理策略发起共享表清除。
23.权利要求15的方法,其中上述共享表清除包括根据共享表在每一表中构成控制列;将控制列中的各项设为假;识别要在共享表中进行维护的良好查询;标记上述控制列中所有对应于属于对上述良好查询的响应的行的项;以及删除共享表中其控制列项仍然为假的任何行。
24.一种用于确保从数据库服务器检索到的一组查询结果的增量一致性的方法(800),该方法包括步骤向数据高速缓存订阅由源服务器传播并且包括施加到后端表(707)的更新、删除和插入的刷新消息(708、705);只要当接收到刷新消息时,就将该更新、删除和插入施加到本地高速缓存的表(704);将等于其结果包括在刷新消息中的任何事务的最大时戳的时戳与该刷新消息相关联;将等于最后施加到高速缓存的刷新消息的时戳的设置时戳与先前查询的结果相关联;将新查询时戳与新查询相关联;将该新查询时戳与上述设置时戳进行比较;以及如果该新查询时戳超过了该设置时戳,则插入对该新查询的响应;以及如果该新查询时戳超过了该设置时戳,则从数据库服务器中检索未决的刷新消息。
25.权利要求4的包括用于确保从数据库服务器检索到的一组查询结果的增量一致性的边缘服务器的系统,该系统还包括用于向数据高速缓存订阅由源服务器传播并且包括施加到后端表的更新、删除和插入的刷新消息的装置;用于只要当接收到刷新消息时,就将该更新、删除和插入施加到本地高速缓存的表的装置;用于将等于其结果包括在刷新消息中的任何事务的最大时戳的时戳与该刷新消息相关联的装置;用于将等于最后施加到高速缓存的刷新消息的时戳的设置时戳与先前查询的结果相关联的装置;用于将新查询时戳与新查询相关联的装置;用于将该新查询时戳与上述设置时戳进行比较的装置;以及用于如果该新查询时戳超过了该设置时戳,则插入对该新查询的响应的装置;以及用于如果该新查询时戳超过了该设置时戳,则从数据库服务器中检索未决的刷新消息的装置。
26.权利要求5的用于确保从数据库服务器检索到的一组查询结果的增量一致性的程序存储装置,该方法步骤包括向数据高速缓存订阅由源服务器传播并且包括施加到后端表的更新、删除和插入的刷新消息;只要当接收到刷新消息时,就将该更新、删除和插入施加到本地高速缓存的表;将等于其结果包括在刷新消息中的任何事务的最大时戳的时戳与刷新消息相关联;将等于最后施加到高速缓存的刷新消息的时戳的设置时戳与先前查询的结果相关联;将新查询时戳与新查询相关联;将该新查询时戳与上述设置时戳进行比较;以及如果该新查询时戳超过了该设置时戳,则插入对该新查询的响应;以及如果该新查询时戳超过了该设置时戳,则在数据库服务器中检索未决的刷新消息。
全文摘要
本发明提供了一种用于根据本地应用所执行的查询动态高速缓存数据的系统(100)、装置(200)和方法(300),其中该系统包括远程服务器(108)、边缘服务器(109)上的本地数据库(104);该装置包括边缘数据高速缓存(202),该边缘数据高速缓存包括查询评估器(204)、高速缓存索引(206)、高速缓存资源库(208)、资源管理器(209)、包含检查器(207)、查询解析器(205)、及一致性管理器(210),所有这些部件与查询评估器信号通信;该方法用于动态高速缓存该远程服务器的先前数据库查询的结果(412)、将本地数据库与本地服务器相关联、将多个高速缓存结果存储在本地数据库的共享表(503)中、以及将多个高速缓存结果用于满足对于本地服务器的新数据库查询(410)中。
文档编号G06F15/16GK1708757SQ200380102370
公开日2005年12月14日 申请日期2003年10月14日 优先权日2002年12月23日
发明者卡利尔·S.·阿米瑞, 斯瑞拉姆·派德马纳伯翰, 朴商贤, 莱纽·泰瓦瑞 申请人:国际商业机器公司