著录项信息
专利名称 | 一种用于连接多个异构分布式数据库中的表的方法和系统 |
申请号 | CN200810166365.6 | 申请日期 | 2008-09-26 |
法律状态 | 权利终止 | 申报国家 | 中国 |
公开/公告日 | 2010-03-31 | 公开/公告号 | CN101685449 |
优先权 | 暂无 | 优先权号 | 暂无 |
主分类号 | G06F17/30 | IPC分类号 | G;0;6;F;1;7;/;3;0查看分类表>
|
申请人 | 国际商业机器公司 | 申请人地址 | 美国纽约
变更
专利地址、主体等相关变化,请及时变更,防止失效 |
权利人 | 国际商业机器公司 | 当前权利人 | 国际商业机器公司 |
发明人 | 李明;李海峰;孙云峰;赵胜 |
代理机构 | 北京市中咨律师事务所 | 代理人 | 于静;杨晓光 |
摘要
提供了一种用于连接多个异构分布式数据库中的表的方法和系统。所述方法包括:响应于接收到数据查询命令,其中所述数据查询命令涉及来自至少两个远程数据源的数据,根据所述数据查询命令生成针对第一数据源的子命令;根据所述子命令,以块读取的方式从所述第一数据源中检索匹配数据;将所检索的块数据中的至少相关列传送到第二数据源并插入一个临时表中,用于与第二数据源中的表进行连接操作,其中所述相关列指的是与所述连接操作相关的列;并且从所述第二数据源接收经过连接的结果集合。根据本发明的方法和系统,可以减少在远程数据源中的磁盘输入/输出(I/O)成本、以及联邦数据库服务器和远程数据源之间的通信成本。
1.一种用于连接多个异构分布式数据库中的表的方法,所述方法包括:
响应于接收到数据查询命令,其中所述数据查询命令涉及来自至少两个远程数据源的数据,根据所述数据查询命令生成针对第一数据源的子命令;
根据所述子命令,以块读取的方式从所述第一数据源中检索匹配数据;
将所检索的块数据中的至少相关列传送到第二数据源并插入一个临时表中,用于与第二数据源中的表进行连接操作,其中所述相关列指的是与所述连接操作相关的列;并且从所述第二数据源接收经过连接的结果集合。
2.根据权利要求1所述的方法,进一步包括:
在以块读取的方式从所述第一数据源中检索匹配数据之前,确定从所述第一数据源读取的块数据的大小。
3.根据权利要求2所述的方法,其中确定从所述第一数据源读取的块数据的大小的所述步骤进一步包括:
计算在所述第二数据源中可用于执行连接操作的最大存储器大小除以将在所述第二数据源中建立的临时表的最大行大小得到的最大行数,以及可用本地高速缓存的最大存储器大小除以所读取的块数据的最大行大小得到的最大行数;以及
将二者中较小的行数值作为可读取的块数据的行数。
4.根据权利要求1所述的方法,进一步包括:
响应于从所述第一数据源所读取的块数据中的无关列的大小大于行指针列,仅将所述块数据中的相关列以及所述行指针列传送到所述第二数据源并插入所述临时表中,其中所述无关列指的是与将在所述第二数据源中的表进行的连接操作不相关的列,所述行指针列唯一地标识了来自所述第一数据源的块数据中的各个行。
5.根据权利要求4所述的方法,进一步包括:
根据所述行指针列,将从所述第二数据源接收的经过连接的结果集合与从所述第一数据源所检索的块数据直接合并以形成合并表。
6.根据权利要求1所述的方法,进一步包括:
响应于从所述第一数据源所读取的块数据中的无关列的大小小于行指针列,将所述块数据中的全部列传送到所述第二数据源并插入所述临时表中,其中所述无关列指的是与将在所述第二数据源中的表进行的连接操作不相关的列,所述行指针列唯一地标识了来自所述第一数据源的块数据中的各个行。
7.根据权利要求6所述的方法,进一步包括:
将从所述第二数据源接收的经过连接的结果集合直接存储作为合并表。
8.根据权利要求1所述的方法,其中所述连接操作是哈希连接操作。
9.根据权利要求1所述的方法,其中所述连接操作是块嵌套循环连接操作。
10.一种用于连接多个异构分布式数据库中的表的系统,所述系统包括:
用于响应于接收到数据查询命令,其中所述数据查询命令涉及来自至少两个远程数据源的数据,根据所述数据查询命令生成针对第一数据源的子命令的装置;
用于根据所述子命令,以块读取的方式从所述第一数据源中检索匹配数据的装置;
用于所检索的块数据中的至少相关列传送到第二数据源并插入一个临时表中,用于与第二数据源中的表进行连接操作的装置,其中所述相关列指的是与所述连接操作相关的列;并且
用于从所述第二数据源接收经过连接的结果集合的装置。
11.根据权利要求10所述的系统,进一步包括:
用于在以块读取的方式从所述第一数据源中检索匹配数据之前,确定从所述第一数据源读取的块数据的大小的装置。
12.根据权利要求11所述的系统,其中所述确定从所述第一数据源读取的块数据的大小的装置进一步用于:
计算在所述第二数据源中可用于执行连接操作的最大存储器大小除以将在所述第二数据源中建立的临时表的最大行大小得到的最大行数,以及可用本地高速缓存的最大存储器大小除以所读取的块数据的最大行大小得到的最大行数;以及
将二者中较小的行数值作为可读取的块数据的行数。
13.根据权利要求10所述的系统,进一步包括:
用于响应于从所述第一数据源所读取的块数据中的无关列的大小大于行指针列,仅将所述块数据中的相关列以及所述行指针列传送到所述第二数据源并插入所述临时表中的装置,其中所述无关列指的是与将在所述第二数据源中的表进行的连接操作不相关的列,所述行指针列唯一地标识了来自所述第一数据源的块数据中的各个行。
14.根据权利要求13所述的系统,进一步包括:
用于根据所述行指针列,将从所述第二数据源接收的经过连接的结果集合与从所述第一数据源所检索的块数据直接合并以形成合并表的装置。
15.根据权利要求10所述的系统,进一步包括:
用于响应于从所述第一数据源所读取的块数据中的无关列的大小小于行指针列,将所述块数据中的全部列传送到所述第二数据源并插入所述临时表中的装置,其中所述无关列指的是与将在所述第二数据源中的表进行的连接操作不相关的列,所述行指针列唯一地标识了来自所述第一数据源的块数据中的各个行。
16.根据权利要求15所述的系统,进一步包括:
用于将从所述第二数据源接收的经过连接的结果集合直接存储作为合并表的装置。
17.根据权利要求10所述的系统,其中所述连接操作是哈希连接操作。
18.根据权利要求10所述的系统,其中所述连接操作是块嵌套循环连接操作。
一种用于连接多个异构分布式数据库中的表的方法和系统\n技术领域\n[0001] 本发明一般地涉及数据库信息管理系统,并且具体而言涉及一种用于连接(join)多个异构分布式数据库中的表的方法和系统。\n背景技术\n[0002] 在大型的现代企业中,以下情形将是不可避免的:即,一家机构的不同部门使用不同的数据库管理系统(DBMS)来存储和检索它们的关键数据。而只有通过将这些系统的信息结合起来,该机构才能够实现这些数据的完整价值。\n[0003] 例如,在金融领域,并购几乎是常常出现的。新创建的机构将会继承原始机构的数据库,而这些数据库中的许多都是关系数据库,但来自于不同的制造商。它们可能具有一个或多个数据库管理系统。每个数据库可以具有用于计算重要信息的不同应用。在并购之后,新机构需要能够访问所有数据库的所有客户信息,使用现有应用以及新的应用来分析新的数据,并且通过一个公用接口使用两家机构的合并资源。新机构需要能够识别两者的公共客户,并且合并其帐户,但是不同机构可能在不同数据库中使用完全不同的识别键(key)来引用其客户。\n[0004] 由此可见,存在一种持续需要,即,连接多个异构分布式数据库从而使能对存储于多个异构数据库中的数据的透明访问。在此,“透明”意味着在特定位置的应用程序能够访问所有相连的数据库中的数据,而不用知道数据的来源以及本地数据库与多个相连的远程数据库中的任一个是否兼容。即,如果一个数据库系统是透明的,则它使得底层数据源的不同之处、特质、以及实现方式对于用户是屏蔽的。\n[0005] 为了提供针对多个异构数据库的透明接口,在现有技术中,一般使用一个独立数据库作为统一的交互接口,并且使该接口能够在数据库管理系统的控制下,根据接口表中包含的数据项访问其它数据库的数据。这种系统的当前设计被称为联邦(federated)数据库服务器。联邦(federation)技术可以通过提供对各种数据的统一接口而极大地便利于对异构数据的集成。现今,联邦技术使能了对任意信息存储库中的任意格式(结构化的和非结构化的)的任意数字信息的统一访问。关于联邦数据库服务器的更多细节,请参见http://www.ibm.com/developerworks/db2/library/techarticle/0203haas/0203haas.html,在此通过将其整体引入作为参考。在现有技术中,在两个或多个异构数据库中的表之间进行连接操作常常是成本高昂的。本发明提供了一种优化技术。\n发明内容\n[0006] 本发明的目的是提供一种用于通过联邦数据库系统对于多个异构分布式数据库进行表连接的优化方法和系统,其中用于进行连接的基表都位于远程异构数据库中,所述方法和系统可以减少在远程数据库中的磁盘输入/输出(I/O)成本、以及联邦数据库服务器和远程数据库之间的通信成本。\n[0007] 在本发明的第一方面中,提出了一种用于连接多个异构分布式数据库中的表的方法,所述方法包括:\n[0008] 响应于接收到数据查询命令,其中所述数据查询命令涉及来自至少两个远程数据源的数据,根据所述数据查询命令生成针对第一数据源的子命令;\n[0009] 根据所述子命令,以块读取的方式从所述第一数据源中检索匹配数据;\n[0010] 将所检索的块数据中的至少相关列传送到第二数据源并插入一个临时表中,用于与第二数据源中的表进行连接操作,其中所述相关列指的是与所述连接操作相关的列;并且\n[0011] 从所述第二数据源接收经过连接的结果集合。\n[0012] 在本发明的第二方面中,提出了一种用于连接多个异构分布式数据库中的表的系统,所述系统包括:\n[0013] 用于响应于接收到数据查询命令,其中所述数据查询命令涉及来自至少两个远程数据源的数据,根据所述数据查询命令生成针对第一数据源的子命令的装置;\n[0014] 用于根据所述子命令,以块读取的方式从所述第一数据源中检索匹配数据的装置;\n[0015] 用于所检索的块数据中的至少相关列传送到第二数据源并插入一个临时表中,用于与第二数据源中的表进行连接操作的装置,其中所述相关列指的是与所述连接操作相关的列;并且\n[0016] 用于从所述第二数据源接收经过连接的结果集合的装置。\n[0017] 在本发明的第三方面中,提出了一种计算机程序产品,其可被加载到计算机上并包括程序代码工具,当所述计算机程序产品在计算机上运行时,所述程序代码工具适于执行所述的用于连接多个异构分布式数据库中的表的方法的所有步骤。\n[0018] 根据本发明的方法和系统,可以显著地提高跨多个远程异构数据库执行表的连接操作的性能。在上述第二远程数据源上,还可以通过哈希连接操作,能够在不用多次遍历第二数据源包含的表的情况下,查询到其中的匹配列并执行连接操作,从而可以极大地减少磁盘I/O成本。哈希连接操作特别适用于下述任一情形或几种情形的组合:第二数据源包含的表中不存在索引、该表非常大。同时,通过使用块操作以及在第二数据源中创建用于连接操作的临时表,减少了各组件之间的通信成本。\n附图说明\n[0019] 在附带的权利要求中阐明了被认为是本发明新颖特性的特征。然而,通过参考以下结合附图的说明性实施例的详细描述,将最好地理解本发明本身以及其优选使用模式、另外的目的和优点,在附图中:\n[0020] 图1描述了在现有技术中实现用于连接多个异构分布式数据库中的表的方法的交互过程的示意性框图;\n[0021] 图2描述了实现根据本发明一个实施例的用于连接多个异构分布式数据库中的表的方法和组件间交互过程的示意性框图;\n[0022] 图3说明了一种根据本发明一个实施例的用于连接多个异构分布式数据库中的表的方法的详细流程图;以及\n[0023] 图4说明了一种根据本发明一个实施例的用于连接多个异构分布式数据库中的表的系统的示意性框图。\n[0024] 需要注意,在全体附图中,相同或相似的标号指代的是相同或相似的单元或组件。\n具体实施方式\n[0025] 在下文中将结合附图对本发明的示范性实施例进行描述。为了清楚和简明起见,在说明书中并未描述实际实现方式的所有特征。然而,应该了解,在开发任何这种实际实施例的过程中必须做出很多实现方式所特定的决定,以便实现开发人员的具体目标,例如符合与系统及业务相关的那些限制条件,其中,这些限制条件会随着实施方式的不同而改变。\n此外,还应该了解,虽然开发工作有可能是非常复杂和费时的,但对得益于这个公开内容的本领域技术人员来说,这种开发工作仅仅是例行的任务。\n[0026] 此外,还需要说明的一点是,为了避免因不必要的细节而混淆了本发明,在附图中仅仅示出了与根据本发明的方案密切相关的装置结构和/或处理步骤,而省略了与本发明关系不大的其它细节。\n[0027] 参见图1,描述了在现有技术中实现用于连接多个异构分布式数据库中的表的方法的交互过程的示意性框图。如图1所示,联邦数据库服务器150通过网络与位于远程的客户端100、数据源1110、数据源2120分别进行通信,所述网络可以是局域网(LAN)、广域网(WAN)、虚拟专用网(VPN)、以及因特网等等。两个数据源就是两个远程数据库,其中数据源\n1110包含表T1112,数据源2120包含表T2122。注意,为了简明起见,在本示例以及本发明的上下文中,均仅使用两个数据源来进行说明。当然,本领域技术人员可以理解,根据本发明实施例的方案同样良好地适用于多个数据库以及其上存储的多个表。\n[0028] 首先,在步骤1,客户端100的用户通过其上运行的应用向联邦数据库服务器150提交数据检索命令。例如,所提交的命令可以是以下的SQL查询语句:\n[0029] select T1.C1,T1.C2,T2.C2from T1,T2where T1.C1=T2.C1该语句想要从表T1112中检索数据T1.C1、T1.C2以及从表T2122中检索数据T2.C2,并且所检索的数据还要满足条件T1.C1=T2.C1。用户期望得到的结果是一个经过连接的结果表,其中的每一行均包含来自表T1112和表T2122的匹配数据。\n[0030] 联邦数据库服务器150负责处理从客户端100接收的SQL查询语句,并通过查询优化器(未示出)确定用于访问所请求的数据的最优执行方法。在查询优化操作期间,通常会考虑多种类型的连接方法以及连接次序,所述连接方法例如可以包括:合并连接、嵌套循环连接等。当来自“外表(outertable)”的行将与一个或多个其它表(即“内表(inner table)”)的行相连接时,需要使用连接方法。在此,术语“表”包括数据的任意表格式的列表。术语“外表”指代这样的表:数据库应用从该表中直接检索搜索名称;而“内表”指代这样的表:基于从外表所检索的搜索名称,数据库应用从该表中进一步检索数据。图1所示的用于连接多个异构分布式数据库中的表的方法是通常由查询优化器所选择的一种方法。\n[0031] 当确定所接收的SQL查询语句是“连接SQL查询语句”时(“连接SQL查询语句”意味着:该SQL查询语句涉及来自至少两个数据源的数据),联邦数据库服务器150将需要对至少两个不同的远程异构数据库(数据源)中表的已检索数据执行连接操作。于是,在此示例中,查询优化器通常首先把所接收的SQL查询语句划分为两个SQL子语句,其中每个语句分别描述了需要在每个远程数据库上执行的操作。\n[0032] 例如,在本示例中,所划分的第一SQL子语句为:\n[0033] select T1.C1,T1.C2from T1\n[0034] 该语句用于从表T1 112中选择数据T1.C1、T1.C2;\n[0035] 以及,所划分的第二SQL子语句为:\n[0036] select T2.C2from T2where T2.C1=X\n[0037] 该语句用于从表T2122中选择数据T2.C2,其中所选择的数据需要满足条件T2.C1=X,其中X表示通过第一SQL子语句从表T1中获得的T1.C1。\n[0038] 由查询优化器来决定在查询中涉及的不同操作是应该由服务器150还是存储数据的数据源来执行。为了做出决定,优化器必须知道每个数据源能够做什么以及这样做的执行成本。例如,如果数据源仅是一个文件,那么服务器无法要求它执行排序或应用某种函数。另一方面,如果数据源是能够应用谓词并且执行连接操作的关系数据库系统,那么,如果该关系数据库系统能够在远程执行某些处理从而减少必须返回服务器150的数据量,则利用该数据库系统的能力将是更佳的。所述决定典型地将取决于各个查询的细节。在此假定数据源2 120是关系数据库系统,其能够执行必要的数据查询操作以及执行复杂的函数运算,则联邦数据库服务器150将使得数据源2 120能够执行某些特定处理,从而减少服务器150的计算成本以及二者之间的通信成本。\n[0039] 继续参见图1,在步骤2,联邦数据库服务器150将第一SQL子语句发送到数据源\n1 110,并从数据源1 110获得返回的匹配检索结果。数据源1 110根据所接收的第一SQL子语句查询表T1,并且每次将一行匹配数据152返回服务器150作为检索结果,例如一行特定的数据T1.C1、T1.C2。\n[0040] 在步骤3,对于所获得的匹配检索结果的每一行,联邦数据库服务器150通过该行中包含的数据来生成第二SQL子语句。所述生成是通过将第一SQL子语句所获得的行中的对应列作为绑定参数来生成第二SQL子语句。即,用检索到的T1.C1的数值来替换第二SQL子语句中的X参数。接着联邦数据库服务器150将所生成的第二SQL子语句发送到数据源\n2120。\n[0041] 在步骤4,数据源2 120根据所接收的第二SQL子语句遍历表T2 122,并且将满足该子语句的结果集合154返回联邦数据库服务器150作为检索结果,该结果集合154被称为中间结果行。服务器150读取从数据源2 120返回的中间结果行。\n[0042] 接着在步骤5,联邦数据库服务器150对所返回的中间结果行与通过第一SQL子语句从数据源1 110读取的一行数据进行合并,从而生成合并表156。然后联邦数据库服务器\n150将合并表156返回给客户端100。\n[0043] 步骤2-5将被重复执行,直到根据第一SQL子语句将表T1 112中的所有匹配的可用数据都检索完、并相应地执行对表T2 122的检索以及对两个检索结果的合并之后为止。\n[0044] 上述实现方式的问题在于,对于从数据源1 110的外表T1 112获得的每一行,联邦数据库服务器150需要与内表T2 122所在的数据源2 120进行通信,并在整个内表中扫描每一行,以获得相应的匹配数据。这被称为嵌套循环连接(Nested Loop Join)。在该过程中,由于内表将被重复地进行多次遍历,因此当该表数据无法全部装入数据源2 120的存储器时,这将带来数据源2 120上很高的磁盘输入/输出(I/O)成本。而且随着内表的不断增大,这种I/O成本会更明显地影响性能。并且,由于需要不断地在不同的物理机器(服务器150、数据源1 110、数据源2 120)之间传递SQL语句和返回结果,上述过程还将带来很高的通信成本。\n[0045] 如上所述,本发明的目的是提供一种用于优化对多个异构分布式数据库中的表的连接操作的方法和系统,其可以减少数据源的磁盘I/O成本和在不同物理机器之间的通信成本,从而能够对多个数据库中的表执行改进的连接操作。\n[0046] 本发明方案的主要改进在于:联邦数据库服务器在接收到用户的SQL命令并生成针对数据源1的子命令之后,以块读取的方式从数据源1中的外表读取数据;在数据源2上创建一个用于执行与内表的连接操作的临时表,其存储从服务器接收的数据源1的块数据(至少包含与所述连接操作相关的列);对临时表中的数据与数据源2的内表的本地数据执行哈希连接或者块嵌套循环连接,而不用对于来自外表的每一行都扫描一次整个内表;以及将连接结果返回服务器。通过该改进的方法,对于内表的物理访问次数可以显著减少,从而减少了数据源2的磁盘I/O成本。可选地,将来自数据源1的块数据中与执行连接操作无关的列保留在服务器而不传送到数据源2,同时用一个额外的行指针列来替代这些无关列,从而减少了联邦数据库服务器与远程数据源之间的通信成本。\n[0047] 具体而言,参见图2描述了实现根据本发明一个实施例的用于连接多个异构分布式数据库中表的方法和组件间交互过程的示意性框图。继续采用图1中的示例。如图2所示,联邦数据库服务器150与位于远程的客户端100、数据源1 110、数据源2 120分别进行通信。\n[0048] 首先,在步骤1,客户端100的用户通过其上运行的应用向联邦数据库服务器150提交数据检索命令。例如,所提交的命令可以是以下的SQL查询语句:\n[0049] select T1.C1,T1.C2,T2.C2from T1,T2where T1.C1=T2.C1该语句将从表T1 \n112中检索数据T1.C1、T1.C2以及从表T2 122中检索数据T2.C2,并且所检索的数据还要满足条件T1.C1=T2.C1。用户期望得到的结果是一个经过连接的结果表,其中的每一行均包含来自表T1 112和表T2 122的匹配数据。\n[0050] 当确定所接收的SQL查询语句是“连接SQL查询语句”时,查询优化器首先根据所接收的SQL查询语句生成针对外表(表T1)所在的远程数据源的操作的一个SQL子语句,其中该语句描述了需要在该远程数据源上执行的操作。\n[0051] 例如,在本示例中,所生成的SQL子语句为:\n[0052] select T1.C1,T1.C2from T1\n[0053] 该语句用于从表T1 112中选择数据T1.C1、T1.C2。\n[0054] 在步骤2,联邦数据库服务器150将该SQL子语句发送到数据源1 110,并从数据源1 110获得返回的匹配检索结果。数据源1 110根据所接收的SQL子语句查询表T1,并且以块读取的方式每次将块数据158(而不是一行数据)返回服务器150作为检索结果,例如每次返回100个特定的数据T1.C1、T1.C2。下文中将具体说明如何确定所读取的块的行数。\n[0055] 联邦数据库服务器150以块为单位从数据源1 110读取表T1 112的数据,并存储所读取的块数据158。每次读取的块数据的行数可以这样确定:由查询优化器计算在数据源2 120中可用于执行哈希连接操作或者块嵌套循环连接操作的最大存储器大小除以将在数据源2 120中建立的临时表的最大行大小得到的最大行数(如果数据源2 120支持哈希连接或者块嵌套循环连接的话)以及服务器150的可用本地高速缓存的最大存储器大小除以所读取的块数据的最大行大小得到的最大行数,以二者中较小的行数值作为可读取的块数据的行数,从而获得可读取的块的最大行数。数据源2120中可用于计算哈希连接或者块嵌套循环连接的最大存储器大小通常由该类数据源的选项(属性值)所标记;而服务器\n150的可用本地高速缓存的最大存储器大小通常是作为数据库管理系统参数而存在。二者均可以容易地获取到。\n[0056] 联邦数据库服务器150基于上述确定的最大行数,使用块读取从数据源1 110获取数据。当数据源1 110中的数据全部读取完成或者达到块读取的最大行数时,所述块读取结束。\n[0057] 在步骤3,联邦数据库服务器150将从数据源1 110所获得的作为检索结果的块数据传送到数据源2 120,并插入在数据源2 120中创建的临时表124中。\n[0058] 可选地,为了减少联邦数据库服务器150与数据源2120之间的通信成本,可以将来自数据源1的块数据中的无关列保留在服务器一端而不传送到数据源2,以及用一个额外的行指针列来替代这些无关列,所述无关列指的是将与所述第二数据源中的表进行的连接操作不相关的列,例如上述示例中的T1.C2。通过使用行指针列,可以只在所创建的临时表124中包含与所述连接操作有关的列,且无需在服务器150上再次执行对于从数据源1返回的块数据与从数据源2返回的中间结果列的连接操作(该操作是费时的)。行指针列是临时表中的一个额外列,其唯一地标识了来自数据源1的块数据中的各个行。查询优化器首先确定行指针的大小是否大于与执行连接操作无关的列的大小,因为在块数据158中可能不存在无关列或者仅存在很少的无关列,此时行指针就变得不必要了。在此示例中,与执行连接操作无关的列为T1.C2。如果T1.C2列大于行指针列,则将T1.C2列保留在服务器\n150,而将行指针列添加到临时表154中。这样,当在数据源2得到的中间结果列被返回服务器150时,不用再与来自数据源1的块数据进行连接,而是直接将具有相同行指针的中间结果列和块数据进行合并。这样将极大地节约服务器150的计算成本。\n[0059] 注意,对于是否使用行指针列的确定还可能影响之前确定的从数据源1进行读取的块的最大行数。具体地,如果确定使用行指针列,临时表中的列较少,于是经由数据源2 \n120中的可用最大存储器大小除以临时表的最大行大小而得到的最大行数较大。反之,则所确定的最大行数较小。从而在将所确定的最大行数与经由服务器150的可用本地高速缓存的最大存储器大小除以所读取的块数据的最大行大小得到的最大行数进行比较的过程中,可能得到不同的结果。由此可见,对于是否使用行指针列的确定应该在确定对于数据源1的块读取操作之前完成,即,在块读取之前,由联邦数据库系统从数据源1读取表T1的相关列的属性,以确定是否使用行指针列,从而进一步确定所读取的块的最大行数。\n[0060] 查询优化器还需要确定数据源2 120是否支持哈希连接或者块嵌套循环连接操作,这通常由该类数据源的属性值所标记。哈希连接操作包括以下步骤:对临时表124执行哈希算法形成哈希表,使得具有相同或相似哈希结果值的原始列将被看成是相同的哈希列;这样,首先比较哈希表与表T2 122,在结果值相匹配的情况下,再寻找临时表124中相应的匹配列;之后对临时表124与表2 122中的匹配列执行连接操作,得到结果集合。通过哈希连接操作,能够在不用多次遍历整个内表T2的情况下,查询到其中的匹配列并执行连接操作,从而可以极大地减少磁盘I/O成本。上述的哈希连接操作特别适用于下述任一情形或几种情形的组合:表T2中不存在索引、表T2极大。在上述情形中,哈希连接操作所节约的计算成本更为显著。\n[0061] 继续参见图2,在步骤4,如果数据源2 120支持哈希连接,则对临时表124中的数据与表T2 122执行哈希连接操作,以生成结果集合,也就是中间结果行。根据上述对于块数据大小的确定,由于临时表124的大小不大于数据源2 120中的可用于执行哈希连接的最大存储器大小,因此数据源2 120能够直接将临时表124中的数据用于哈希连接。在哈希连接操作期间,仅需要扫描原始的内表(表T2)一次。\n[0062] 如果数据源2 120不支持哈希连接,则对临时表124中的数据与表T2122执行块嵌套循环连接操作以生成结果集合。该操作的实现方式类似于常规的嵌套循环连接操作,在此不再描述。\n[0063] 在步骤5,联邦数据库服务器150读取从数据源2 120返回的中间结果行作为结果集合154。\n[0064] 之后,在步骤6,如果在临时表124中使用了行指针列,则服务器150把结果集合\n154与块数据158直接合并以形成合并表156。由于行指针列的唯一性,执行所述合并的开销极小。如果在临时表124中未使用行指针列,其表示块数据158的所有列都被存储到临时表124中并执行了连接操作,则所返回的结果集合154可以被直接作为合并表156。联邦数据库服务器150将合并表156返回给客户端100。\n[0065] 步骤2-6将被重复执行,直到根据上述SQL子语句将表T1112中的所有匹配的可用数据都检索完、并相应地执行对表T2122的检索和连接以及对两个检索结果的合并之后为止。\n[0066] 注意,本领域技术人员可以容易地理解,对于两个以上的远程数据源的情形,本发明方法同样可以适用。例如,当存在三个数据源时,联邦数据库服务器可以根据SQL查询命令生成针对第一数据源的SQL子命令。首先基于该SQL子命令,对于第一数据源和第二数据源完成与上述相同的连接操作(哈希连接操作或者块嵌套循环连接操作)的过程,然后将从第二数据源接收的结果集合看作为另一个块数据,并将该块数据的全部列(或者仅相关列和额外的行指针列)传送到第三数据源并插入一个临时表中,用于与第三数据源中的数据进行连接操作。其余过程与上述针对两个数据源的过程相类似,在此不再进行详细描述。\n[0067] 下面参考图3并结合一个简单的示例来说明一种根据本发明一个实施例的用于连接多个异构分布式数据库中表的方法的详细流程图。例如,从客户端100发送到联邦数据库服务器150的SQL查询命令为:\n[0068] select A.A1,A.A2,A.A3,B.B2from A,B where A.A3=B.B1该SQL语句将从表A中检索数据A.A1、A.A2、A.A3以及从表B中检索数据B.B2,并且要满足条件A.A3=B.B1。\n为了说明的简要起见,假定A.A3和B.B1列都是整数(INT)类型,且假定A.A3的值均匀分布在1..10之间。示例性的表A如以下表格1所示(共200行):\n[0069] \n列A1列A2列A3\nX1 Y1 1\nX2 Y2 2\n... ... ...\nX10 Y10 10\nX11 Y11 1\nX12 Y12 2\n... ...\nX20 Y20 10\n... ... ...\n... ... ...\nX198 Y198 8\nX199 Y199 9\nX200 Y200 10\n[0070] 表格1:表A\n[0071] 示例性的表B如以下表格2所示(共10000行,在此只针对表B中的随机两行的处理进行详细说明):\n[0072] \n列B1 列B2\n... ...\n... ...\n10 Z1000\n... ...\n2 Z5000\n... ...\n[0073] 表格2:表B\n[0074] 首先在步骤300,联邦数据库服务器从客户端接收数据查询命令,该命令可以是SQL形式的。接着在步骤305,在确定所接收的SQL查询语句是“连接SQL查询语句”之后,服务器根据该SQL查询语句生成针对表A的SQL子语句,其中该语句描述了需要在保存表A的远程数据库上执行的操作。\n[0075] 在步骤310,联邦数据库服务器决定使用本发明的方法来处理所述查询。如上所述,存在用于执行“连接SQL查询语句”(即连接来自多个数据源的表)的多种方法。联邦数据库服务器的优化器会选择其中性能最好的一种方法。而在某些场景下,根据本发明的方法将具有最好的性能。例如,当要连接的两个表的关联度很低的时候,优化器能够确定使连接操作在远程数据源上而不是在联邦数据库服务器上执行。在这样的场景中,根据本发明的改进方法将具有最好效果,从而优化器将决定使用该方法。\n[0076] 在步骤312,确定表连接的操作模式。对所述操作模式的确定基于行指针大小是否大于无关列的大小,所述无关列指的是与将在数据源2中的内表进行的连接操作不相关的列。如果否,则在临时表中将使用行指针列来代替无关列,该情形可以被标记为操作模式\n1。如果是,则临时表中将不使用行指针列,而是使用来自数据源1的块数据中的全部列,该情形可以被标记为操作模式2。\n[0077] 在步骤315,计算在远程数据源2中可用于计算哈希连接或者块嵌套循环连接的最大存储器大小除以将在数据源2中建立的临时表的最大行大小得到的最大行数以及服务器的可用本地高速缓存的最大存储器大小除以所读取的块数据的最大行大小得到的最大行数,将二者中较小的行数值确定为每次要读取的块数据的行数,从而获得可读取的块的最大行数。\n[0078] 在步骤320,基于以上确定的块数据的行数,根据所生成的SQL子语句,以块读取的方式从数据源1中检索匹配数据。假设数据源2的高速缓存中可存储数据的最大行数相对较小,其最多仅可以容纳100行数据,则针对表A进行检索所产生的块数据(也是100行)如以下表格3所示,表格3的块数据中第一列的Pn表示第n行数据在服务器的本地存储器中的地址指针:\n[0079] \n列A1 列A2\nP1→ X1 Y1\nP2→ X2 Y2\n...→ ... ...\nP10→ X10 Y10\nP11→ X11 Y11\nP12→ X12 Y12\n...→ ... ...\nP20→ X20 Y20\n...→ ... ...\n...→ ... ...\nP98→ X98 Y98\nP99→ X99 Y99\nP100→ X100 Y100\n[0080] 表格3:块数据\n[0081] 在步骤325,确定联邦数据库服务器采用的是操作模式1(使用行指针列)还是操作模式2(不使用行指针列)。如果是操作模式1,则联邦数据库服务器将在临时表中使用行指针列来替代无关列,所述方法进行到步骤330,将与所述连接操作相关的列以及行指针列传送到数据源2,以用于插入在数据源2中创建的临时表。如果是操作模式2,则联邦数据库服务器将不使用行指针列来替代无关列,所述方法进行到步骤335,将块数据中的所有列都传送到数据源2,以用于插入在数据源2中创建的临时表。\n[0082] 在步骤340,在远程数据源2中创建临时表并将数据插入到其中。在本示例中,假定行指针大小小于无关列(A.A1、A.A2),则所述临时表如以下表格4所示,其中临时表中的第一列“行指针”表示每一行对应于服务器中的块数据的行的地址:\n[0083] \n行指针 A3\nP1 1\nP2 2\n... ...\nP10 10\nP11 1\nP12 2\n... ...\nP20 10\n... ...\n... ...\nP98 8\nP99 9\nP100 10\n[0084] 表格4:临时表\n[0085] 在步骤345,对临时表和数据源2中的内表(表B)进行连接操作。取决于数据源\n2的处理功能,所述连接可以是哈希连接或者块嵌套循环连接。在步骤350,将连接后的结果集合返回联合数据库服务器150。在服务器150中返回的结果集合如以下表格5所示:\n[0086] \n行指针 A3(=B1)B2\n... ... ...\nP10 10 Z1000\nP20 10 Z1000\n... ... ...\nP100 10 Z1000\n... ... ...\nP2 2 Z5000\nP12 2 Z5000\n... ... ...\nP92 2 Z5000\n... ... ...\n[0087] 表格5:结果集合\n[0088] 表格5的结果集合只示出了对于表B中的特定两行数据进行连接之后所得的结果。之后,在步骤355确定是否需要在服务器上执行从数据源2返回的结果集合与从数据源1返回的块数据的合并。如果使用了行指针(操作模式1),则在步骤360需要通过行指针直接将具有相同行指针的中间结果列和块数据进行合并。如果未使用行指针(操作模式\n2),则无需进行合并,所返回的结果集合可以被直接看作是合并表。例如,在进行合并之后所得到的合并表如以下表格6所示:\n[0089] \nA1 A2 A3(=B1)B2\n... ... ... ...\nX10 Y10 10 Z1000\nX20 Y20 10 Z1000\n... ... ... ...\nX100 Y100 10 Z1000\n... ... ... ...\nX2 Y2 2 Z5000\nX12 Y12 2 Z5000\n... ... ... ...\nX92 Y92 2 Z5000\n... ... ...\n[0090] 表格6:合并表\n[0091] 接着在步骤365,服务器将合并表返回给客户端。在步骤370,服务器确定数据源1的外表(表A)是否已经检索完毕。如果否,则所述方法返回步骤320重复执行步骤\n320-365。如果是,则所述方法进行到步骤375并结束。\n[0092] 根据上述假定,远程数据源2中的表B一次最多只能读取100行数据。则读取全部表B需要100次(即读取100块,共10000行)。执行一次对表A与表B的哈希连接操作,表B只要进行2(表A分为2块读取,针对每一块,只需读取表B一次)*100次I/O操作。而根据现有技术的方法,对于表B需要进行200(针对表A的每一行,都需要遍历表B一次)*100次I/O操作。由此可见,根据本发明的方案,在数据源1和服务器上的性能指标基本保持不变的同时,使得数据源2上的磁盘I/O操作大幅减少,从而大幅提高连接操作的性能。并且,当表B越大,根据本发明的方法的优势越明显。\n[0093] 以上通过示例并参考附图说明了根据本发明一个实施例的用于连接多个异构分布式数据库中的表的方法。在同一发明构思下,还提出了一种根据本发明一个实施例的用于连接多个异构分布式数据库中的表的系统。\n[0094] 图4说明了一种根据本发明一个实施例的用于连接异构分布式数据库中的表的系统400的示意性框图。如图4所示,系统400通过网络与位于远程的客户端、第一数据源、第二数据源分别进行通信。在系统400中包括客户端交互组件410、命令处理组件420、查询优化器430、数据源交互组件440、以及存储装置450。系统400例如可以是图2所示的联邦数据库服务器150。\n[0095] 具体而言,客户端交互组件410被配置用于:从客户端接收数据查询命令,其中所述数据查询命令涉及来自至少两个远程数据源(第一数据源、第二数据源)的数据。\n[0096] 命令处理组件420被配置用于:响应于接收到数据查询命令,根据所述数据查询命令生成针对第一数据源的子命令。\n[0097] 数据源交互组件440被配置用于:根据所述子命令,以块读取的方式从所述第一数据源中检索匹配数据;将所检索的块数据中的至少相关列传送到第二数据源并插入一个临时表中,用于与第二数据源中的表进行连接操作,其中所述相关列指的是与所述连接操作相关的列;以及从所述第二数据源接收经过连接的结果集合。其中所述连接操作可以是哈希连接操作或者块嵌套循环连接操作。\n[0098] 查询优化器430被配置用于:优化和协调系统400中的各个组件的操作与交互。\n具体地,查询优化器430可以被配置用于:在以块读取的方式从所述第一数据源中检索匹配数据之前,确定从所述第一数据源读取的块数据的大小。所述确定被执行为:计算在所述第二数据源中可用于执行连接操作的最大存储器大小除以将在所述第二数据源中建立的临时表的最大行大小得到的最大行数,以及可用本地高速缓存的最大存储器大小除以所读取的块数据的最大行大小得到的最大行数;以及将二者中较小的行数值作为可读取的块数据的行数。查询优化器430还可以被配置用于:响应于从所述第一数据源所读取的块数据中的无关列的大小大于行指针列,仅将所述块数据中的相关列以及所述行指针列传送到所述第二数据源并插入所述临时表中,其中所述无关列指的是与将在所述第二数据源中的表进行的连接操作不相关的列,所述行指针列唯一地标识了来自所述第一数据源的块数据中的各个行;以及根据所述行指针列,将从所述第二数据源接收的经过连接的结果集合与从所述第一数据源所检索的块数据直接合并以形成合并表。\n[0099] 查询优化器430还可以被配置用于:响应于从所述第一数据源所读取的块数据中的无关列的大小小于行指针列,将所述块数据中的全部列传送到所述第二数据源并插入所述临时表中;以及将从所述第二数据源接收的经过连接的结果集合直接存储作为合并表。\n[0100] 存储装置450用于存储从第一数据源返回的块数据、从第二数据源返回的经过连接的结果集合、以及将二者合并而成的合并表。\n[0101] 以上详细描述了根据本发明一个实施例的用于连接多个异构分布式数据库中的表的方法和系统。如本领域普通技术人员可以了解的,本发明可以体现为方法、系统和/或计算机程序产品。因此,本发明可以呈现为完全硬件实施形式、完全软件实施形式或者软件和硬件组合实施形式。此外,本发明可以被呈现为在机器可读媒体上包括的计算机程序产品,机器可读媒体上存储了用于对计算机系统进行编程以执行根据本发明的过程的机器可执行程序指令。这里所使用的术语“机器可读媒体”包括向计算机系统提供用于执行的指令的任意媒体。这种媒体可以采用多种形式,包括但是不局限于:非易失性媒体、易失性媒体和传输媒体。非易失性媒体的常见形式例如包括软盘、软磁盘、硬盘、磁带或者任何其它磁媒体、光盘ROM(CD-ROM)或者任何其它光媒体、打孔卡或者任何其它带有孔图案的物理媒体、可编程ROM(PROM)、可擦写PROM(EPROM)、电EPROM(EEPROM)、闪速存储器、任何其它存储芯片或者盒式磁带(cartridge)、或者计算机系统可以读取并适合存储指令的任何其它媒体。\n[0102] 适于存储和/或执行程序代码的数据处理系统将包括:直接地或通过系统总线间接地耦合于存储器单元的至少一个处理器。存储器单元可以包括在程序代码的实际执行期间使用的局部存储器、海量存储装置、以及高速缓冲存储器,该高速缓冲存储器提供了至少某种程序代码的临时存储以便减少在执行期间必须从海量存储装置检索代码的次数。\n[0103] 此外,可以理解,方框图和/或流程图中的每个方框以及方框图和流程图中的一些方框的组合可以用一些计算机程序指令实现。这些计算机程序指令可以提供给一通用计算机、专用计算机或其它可编程数据处理设备的处理器以产生一机器,使得这些指令通过计算机或其它可编程数据处理设备的处理器的执行创建用于实现在方框图和/或流程图内或者方框内所指定的功能的装置。\n[0104] 尽管已经参考优选实施例具体地示出并描述了本发明,但其不是为了以公开的形式穷举或限制本发明。对于本领域的普通技术人员,可以在形式上和细节上进行各种改变而不会背离本发明的精神和范围。选择并描述了实施例是为了最好地解释本发明的原理和实际的应用,以及为了使本领域的其它普通技术人员能够理解对于各种实施例的本发明,所述实施例具有适合于预期的具体使用的各种修改。
法律信息
- 2021-09-03
未缴年费专利权终止
IPC(主分类): G06F 17/30
专利号: ZL 200810166365.6
申请日: 2008.09.26
授权公告日: 2012.07.11
- 2012-07-11
- 2010-05-12
实质审查的生效
IPC(主分类): G06F 17/30
专利申请号: 200810166365.6
申请日: 2008.09.26
- 2010-03-31
引用专利(该专利引用了哪些专利)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 |
1
| |
2005-07-27
|
2003-04-17
| | |
2
| | 暂无 |
1996-10-28
| | |
3
| | 暂无 |
1997-09-15
| | |
4
| |
2008-05-28
|
2007-11-13
| | |
被引用专利(该专利被哪些专利引用)
序号 | 公开(公告)号 | 公开(公告)日 | 申请日 | 专利名称 | 申请人 | 该专利没有被任何外部专利所引用! |