用于索引编译以优化索引使用的系统、方法和设备与流程

文档序号:11530769阅读:164来源:国知局
本文中所描述的发明主题总体涉及关系数据库管理系统,更具体地,涉及通过索引编译增强任何查询执行期间中央处理单元的性能。
背景技术
::结构化查询语言(structuredquerylanguage,sql)是一种用于存储、检索和查询关系数据库系统中保存的数据的数据库查询和编程语言。连续查询语言(sequentialquerylanguage,sql)的开发始于1974年,由boyce和chamberlin提出,当时被称为sequel;1976年,ibm公司的sanjese研究所在开发rdbmssystemr时对sql作了更改;oracle公司于1979年首次发布了基于sql的商业化rdbms产品;美国国家标准化组织ansi于1986年宣布sql成为数据库工业标准。众所周知,sql语言包含四个部分:●数据定义语言(datadefinitionlanguage,ddl),包含create、drop、alter。●数据操纵语言(datamanipulationlanguage,dml),包含insert、update和delete。●数据查询语言(dataquerylanguage,dql),包含select。●数据管理语言(datamanagementlanguage,dcl),包含sql语句,如grant、revoke、commit和rollback。任何sql语句由rdbms通过以下步骤处理:1.解析(语法检查):解析sql语句的语法并确定其是否符合标准。2.分析:检查sql语句中使用的对象(表、列等)是否存在于数据库中。如果有任何绑定变量,这一阶段将提取任何绑定变量。3.优化:基于成本选择用于查询执行的最佳计划。4.执行:执行上一步骤中生成的最佳计划并返回结果。在查询执行期间,索引是以额外写入和存储空间为代价来维护索引数据结构,从而提高数据库表上数据检索操作速度的重要数据结构之一。index针对表的特定列创建,以保持元组组织良好,从而使对那些元组的访问变得更快。索引数据段仅存储作为索引的一部分的列的值,表的所有其它字段存储在堆数据段中。仅在索引的创建期间,就可以清楚地知道什么数据类型值将被存储在索引数据段中。由于索引列的数据类型在其创建期间是已知的,因此,对索引的各种操作的所有访问方法也保持不变。一些针对索引的最频繁操作可以包括但不限于,访问索引元组、发现空隙以插入特定的索引元组、搜索任何索引元组等。最近,为了提高数据库的性能,发现的方法是减少用于给定操作的cpu指令。在这一上下文中,现在技术中存在其中查询被编译成本地格式然后执行的可用示例。对这项技术的进一步完善是通过将访问方法编译为表来优化查询执行。在这种情况下,访问性能得以提高。memsql、dbms微专业化、sqlserver2014是此类专业化的几个示例。这些解决方案提供了用于在“表创建”时间期间将表主题编译为本地代码的机制。为了对index列进行像insert之类操作,根据现有技术中可用的技术,首先例如在b树中找到适当的位置,在该位置处可以存储新数据并且仍维持数据的排序顺序。与对任何索引进行search操作类似,进行节点的比较(例如,对btree索引的二进制搜索)。对于索引,比较和基础设施功能构成大部分索引成本。所有这些比较和基础设施功能都以非常通用的方式来实现以处理所有的列数据类型和各种index。技术实现要素:提供本
发明内容是为了引入与下文具体实施方式中进一步描述的用于索引编译以优化索引使用的系统、方法和设备有关的概念。本
发明内容并不意在标识所要求保护的主题的本质特征,也不意在用于确定或限制所要求保护的主题的范围。技术问题:由于用于比较和其它基础设施的代码/逻辑是非常通用的,需要消耗更多的cpu指令来确定哪一部分代码将被执行,这导致用于执行查询的cpu指令总数增加因此性能降低。相应地,cpu的时间和成本也增加并且整个系统的效率降低。技术解决方案:本发明提供了一种用于高效且经济地解决上述技术问题的机制,所述机制通过在定义期间在本地编译和生成对应于每个index的文件(例如,indexdll),所述文件将包含基于索引列的数据类型对index执行任何操作所需的所有结构和方法。为了通过减少查询的执行所需的cpu指令的数量来提高查询执行期间cpu的整体性能,本发明的实施例提供了本申请的多个方面。所述多个方面提供了一种用于索引编译以优化索引使用的方法、设备和系统。技术解决方案如下:在一个方面中,公开了一种用于编译使得可从数据库得到数据的index的系统,所述系统对包括用于编译所述index的至少一个命令的一个或多个查询进行响应。所述系统包括处理器,所述处理器用于:响应于所述命令,在本地编译所述查询,以生成对应于所述查询中的每个index的c-文件,并由此基于生成的所述c-文件生成共享对象文件,所述共享对象文件包括用于基于所述数据库中的索引列对index执行至少一种操作的至少一个结构和至少一种机制,其中所述共享对象文件是动态链接库文件。在另一方面中,公开了一种用于编译使得可从数据库得到数据的index的设备,所述设备对包括用于编译所述index的至少一个命令的一个或多个查询进行响应。所述设备包括用于接收用于查询所述数据库的所述查询的输入/输出硬件以及用于执行以下操作的处理器:响应于所述命令,在本地编译所述查询,以生成对应于所述查询中的每个index的c-文件,并由此基于生成的所述c-文件生成共享对象文件,所述共享对象文件包括用于基于所述数据库中的索引列对index执行至少一种操作的至少一个结构和至少一种机制,其中所述共享对象文件是动态链接库文件。在又一方面中,公开了一种用于编译使得可从数据库得到数据的index的方法,所述方法对包括用于编译所述index的至少一个命令的一个或多个查询进行响应。所述方法包括:接收用于查询所述数据库的所述查询;处理器识别所述查询,其中所述查询包括具有用于通过编译所述index创建文件的命令的“createindex”语句;响应于所述命令,在本地编译所述查询,以生成对应于所述查询中的每个index的c-文件,并由此基于生成的所述c-文件生成共享对象文件,所述共享对象文件包括用于基于所述数据库中的索引列对index执行至少一种操作的至少一个结构和至少一种机制,其中所述共享对象文件是动态链接库文件。在一种实施方式中,通过使用上述技术解决方案,本发明通过消除通用代码减少了指令的数量,从而提高了index操作的性能。在一种实施方式中,通过使用上述技术解决方案,本发明通过考虑index的微专业化性质改进了针对该index的计划。附图说明该详细描述是参考附图描述的。在附图中,参考编号最左边的数字表示所述参考编号在该附图中首次出现。相同编号在所有附图中用以指代类似的特殊和组件。图1示出根据本发明主题的实施例的用于编译使得可从数据库得到数据的index的系统10或设备20,系统10或设备20对包括用于编译index的至少一个命令的一个或多个查询进行响应。图2示出根据本发明主题的实施例的用于编译使得可从数据库得到数据的index的方法200,方法200对包括用于编译index的至少一个命令的一个或多个查询进行响应。图3示出根据本发明主题的实施例的用于生成dll的示例性方法300。图4示出根据本发明主题的实施例的将从中生成dll的生成的c-文件的示例性代码快照。图5示出根据本发明主题的实施例的用于在发起新查询时调用生成的专门函数的示例性方法。图6示出根据本发明主题的实施例的关于对b树索引的本地编译的pg9.4使用的实验结果。具体实施方式以下结合本发明实施例中的附图清楚地描述了本发明实施例中的技术解决方案。显然,所描述的实施例仅仅是本发明的部分实施例而不是全部。本领域普通技术人员基于本发明的实施例在未作出创造性劳动的情况下获得的所有其它实施例均应属于本发明的保护范围。本发明可以以多种方式实施,包括作为过程、设备、系统、物质组合物、计算机可读介质如计算机可读存储介质,或其中程序指令通过光或电子通信链路发送的计算机网络。在本说明书中,这些实施方式,或本发明可能采取的任何其它形式,可以被称为技术。一般情况下,所公开的过程的步骤的顺序可以在本发明的范围内进行变更。下面结合图解本发明的原理的附图提供了本发明的一个或多个实施例的详细描述。本发明是结合此类实施例进行描述的,但本发明并不限于任何实施例。本发明的范围仅由权利要求书限定,并且本发明涵盖多种可替代物、修改和等效物。为了提供对本发明的透彻理解,以下描述中阐述了各种具体细节。提供这些细节是为了示例的目的,并且本发明可以在没有这些具体细节中的一些或全部的情况下根据权利要求进行实践。出于清晰的目的,与本发明相关的
技术领域
:中已知的技术材料未进行详细描述,以免使本发明不必要地模糊不清。公开了用于在定义期间在本地编译和生成对应于每个index的indexdll的系统、方法和设备,indexdll将包含基于索引列的数据类型对index执行操作所需的所有结构和方法。本领域技术人员可以理解,sql服务器(来源:互联网)中的本地编译指向访问存储器优化表的本地编译存储的程序。sql服务器可能还能够在本地编译存储器优化表。本地编译允许比解释(传统的)的transact-sql更快的数据访问和更高效的查询执行。表和存储程序的本地编译产生dll。本地编译也可以指将编程构造转换为由处理器指令组成的本地代码的过程,而不需要进一步编译或解释。而在oracle(来源:互联网)中,当pl/sql被加载到服务器中,它在执行之前被编译成字节代码。本地编译的过程将pl/sql存储程序转换为链接到内核的本地代码共享库,这使得程序代码的性能提高。性能提高的程度取决于pl/sql的内容。编译过程不影响数据库调用的速度,仅影响它们周边的程序逻辑,如循环和计算。本领域技术人员可以理解,动态链接库(也写成不附加连字号的形式)(来源:互联网/维基百科),或dll,是微软在微软windows和os/2操作系统中对共享库概念的实现。这些库通常可能具有文件扩展名dll、ocx(对于包含activex控件的库而言),或drv(对于传统系统驱动器而言)。用于dll的文件格式与用于windowsexe文件的相同---即,对于32位和64位windows而言可移植可执行(portableexecutable,pe),对于16位windows而言新的可执行(newexecutable,ne)。与exe文件一样,dll可以包含代码、数据和资源的任意组合。具有与dll相同的文件格式但具有不同的文件扩展名并且可能仅包含资源部分的数据文件可以称为资源dll。此类dll的示例包括图标库,有时具有扩展名icl,以及字体文件,具有扩展名fon和fot。本领域技术人员还可以理解,主题是用于任何对象(例如,表或索引定义)的通用术语。因此,主题绑定意味着无论给出什么对象定义,根据该定义,对象列数据的访问均是绑定的,使得在运行期间当访问列数据时将使用数量更少的cpu指令,从而使列访问更快。例如,如果索引是针对tbl(inta,intb)的创建索引idx,根据当前技术,为了访问属性的值,必须利用通用码流来获得每种属性的长度、每种属性的偏移以及用于访问该值的许多其它参数。但根据主题绑定,因为已经知道索引只有两个整数列,因此可以直接类型转换为结构体,如结构体tbl(inta;intb;),并获取每种属性的值。因此,可以看到,在获取属性值时已经节省了很多的cpu指令。在一种实施方式中,本发明提供了用于“createindex”的新的改良语法,这将增强cpu的性能,并且最终系统的整体工作性能将得到增强。可以修改createindex语法来指定索引的额外性质,索引将基于该额外性质进行编译以便生成indexdll。例如,createindex现有语法的结束处的create[unique]index[concurrently][name]ontable_name….[wherepredicate][compile]会在它的末尾增加该可选的选项。在一个示例中,这种语法使用户能够提供用于创建索引的选项连同主题绑定。在一种实施方式中,随同用于编译新选项的createindex一起提供的新选项可以存储在对应的index的系统表中。在一个示例中,通过查询从用户接收的新选项存储在数据库中。在一种实施方式中,本发明生成对应于每个index定义的索引dll。在一种实施方式中,本发明利用机器语言翻译转换index定义和index定义中的访问方法。虽然关于索引编译以优化索引使用描述的各方面可以以任何数量的不同的计算系统、环境和/或配置来实现,但实施例在以下示例性系统的上下文中进行描述。现参照图1,图1示出根据本发明主题的实施例的用于编译使得可从数据库得到数据的index的系统10或设备20,系统10或设备20对包括用于编译index的至少一个命令的一个或多个查询进行响应。在一种实施方式中,系统10包括数据处理器102、存储的数据库和具有多种数据库关系的多个数据库表,其中数据由处理器通过用于对所述数据库关系执行多种操作的查询命令进行检索。在一种实施方式中,一种用于编译使得可从数据库得到数据的index的系统,该系统对包括用于编译index的至少一个命令的一个或多个查询进行响应,所述系统包括:处理器,用于:响应于命令,在本地编译查询,以生成对应于查询中的每个index的c-文件,并由此基于生成的c-文件生成共享对象文件,共享对象文件包括用于基于数据库中的索引列对index执行至少一种操作的至少一个结构和至少一种机制,其中共享对象文件是动态链接库文件。在一种实施方式中,公开了一种用于编译使得可从数据库得到数据的index的设备,该设备对包括用于编译index的至少一个命令的一个或多个查询进行响应。该设备包括:用于接收用于查询数据库的查询的输入/输出硬件;用于编译使得可从数据库得到数据的index的系统,所述系统包括处理器,该处理器用于:响应于命令,在本地编译查询,以生成对应于查询中的每个index的c-文件,并由此基于生成的c-文件生成共享对象文件,共享对象文件包括用于基于数据库中的索引列对index执行至少一种操作的至少一个结构和至少一种机制,其中共享对象文件是动态链接库文件。在一种实施方式中,本发明用于:基于接收到的查询,创建对应于所述索引的结构;基于接收到的查询,具体地,基于作为createindex命令的一部分给出的index定义,创建用于索引元组值的至少一个访问函数,以及用于为索引元组找到适当的空隙的至少一条指令,其中为每个index生成的访问函数的数量总是相同的;将创建的结构、生成的访问函数,以及生成的访问函数存储在缓冲区中,并基于存储的结构、访问函数和指令创建c-文件;使用至少一个预先存储的编译器编译创建的c-文件;由此从c-文件生成文件,其中文件是动态链接库文件;以及将文件连同至少一个可执行文件一起在系统中加载以用于查询的执行。在一种实施方式中,共享对象文件包括index中列的列表中的至少一个列、用于索引元组值的一个或多个访问函数、用于为索引元组找到适当的空隙的一条或多条指令,及其任意组合。在一种实施方式中,本发明还为index创建系统表,并由此根据index是否需要编译来存储选项,其中选项从以下中的至少一种选择:“真”,如果查询中存在用于创建文件的命令,或“假”,如果查询中不存在用于创建文件的命令。在一种实施方式中,共享对象文件包括为index生成的一个或多个函数指针,其中生成的函数指针存储在一个或多个关系描述符表中。在一种实施方式中,关系描述符存储在为所有关系创建的缓存存储器中,并使用对应关系(即表/索引)的系统表形成。在一种实施方式中,共享对象文件如下生成:当接收到查询时,如果查询具有用于编译index的命令,那么系统基于index和接收到的查询生成c-文件,然后通过编译生成的c-文件生成共享对象文件。在一种实施方式中,共享对象文件由应用、其它动态链接库,及其任意组合中的至少一种使用。在一种实施方式中,共享对象文件在创建index时基于以下条件命名:index的名称,其中索引的名称随同createindex查询一起获得;唯一编号,由系统生成,作为分配给每个索引的标识符;以及利用c-文件的名称创建共享对象文件,命名为名称和标识符的串联。在一种实施方式中,当接收到新查询时,该系统用于:检查随同查询一起接收到的index是否是主题绑定的,其中提供标志以指示元组是否属于主题绑定索引;如果索引是主题绑定的,利用存储到与index相关联的对应的关系描述符中的函数指针,以调用为新查询的执行生成的共享对象文件。在一种实施方式中,所述查询以包括createindex查询连同[compile]选项的格式接收。在一种实施方式中,系统10和/或设备20可以在各种计算系统中实施,如膝上型计算机、台式计算机、笔记本、工作站、大型计算机、服务器、网络服务器等。应理解,系统10和/或设备20可以由多个用户通过一个或多个智能设备(以下称为设备)或客户机(未示出),或驻留在用户设备(未示出)中的应用进行访问。用户设备20的示例可以包括,但不限于,便携式计算机、个人数字助理、手持式设备和工作站。系统10可以使用网络通信地耦合到一个或其它设备。在一种实施方式中,系统10通过发送或发起与存在于数据库中的数据相关的一个或多个查询与数据库进行通信。应理解,针对数据库发起的查询可以从传统方法中的现有查询中的任何查询中选择。具体地,查询以包括createindex查询连同[compile]选项的格式接收。数据库通过提供针对数据库所需的结果来对查询作出响应。还应理解,当系统10和/或设备20可以由多个用户通过一个或多个用户设备或客户机,或驻留在用户设备中的应用进行访问时,发起的的查询使用系统10或设备20转发给数据库。在一种实施方式中,网络可以是无线网络、有线网络或其组合。网络可以实施为不同类型的网络,如内联网、本地局域网(localareanetwork,lan)、广域网(wideareanetwork,wan)、互联网等中的一种。网络可以是专用网络或共享网络。共享网络代表使用不同协议的不同类型的网络的关联以相互通信,协议例如,超文本传输协议(hypertexttransferprotocol,http)、传输控制协议/网际协议(transmissioncontrolprotocol/internetprotocol,tcp/ip)、无线应用协议(wirelessapplicationprotocol,wap)等。另外,网络可以包括各种网络设备,包括路由器、桥接器、服务器、计算设备、存储设备等。在一种实施方式中,处理器或处理单元(102)可以实施为一个或多个微处理器、微型计算机、微控制器、数字信号处理器、中央处理单元、状态机、逻辑电路系统,和/或基于操作指令操纵信号的任何设备。除其它能力之外,处理器(102)用于获取和执行存储在存储器中的计算机可读指令。在一种实施方式中,存储器(106)可以包括本领域中已知的任何计算机可读介质,包括:例如易失性存储器,如静态随机存取存储器(staticrandomaccessmemory,sram)和动态随机存取存储器(dynamicrandomaccessmemory,dram),和/或非易失性存储器,如只读存储器(readonlymemory,rom)、可擦可编程rom、闪速存储器、硬盘、光盘和磁带。在一种实施方式中,存储在存储器(106)中的模块包括例程、程序、对象、组件、数据结构等,它们执行特定的任务或实现特定的抽象数据类型。在一种实施方式中,模块可以包括可以包括补充系统10和/或设备20的应用和函数的程序或编码指令。在一种实施方式中,系统10和或设备20可以包括输入/输出(i/o)接口或提供接口104的输入/输出硬件。使用接口104,用户可以发起查询,并且还可以看到由系统10和/或设备20生成的输出。i/o接口104可以包括各种软件和硬件接口,例如,网络接口、图形用户界面等。i/o接口104可以允许系统10或设备20直接地或通过系统客户端设备与用户交互。另外,i/o接口104可以使得系统10和/或设备20能够与其它计算设备,如网络服务器和外部数据服务器(未示出),进行通信。i/o接口104可以方便各种网络和协议类型内的多种通信,网络包括:有线网络,例如lan、电缆等,以及无线网络,例如wlan、蜂窝,或卫星。i/o接口104可以包括用于将多个设备彼此连接或连接到另一服务器的一个或多个端口。现参照图2,图2示出一种用于编译使得可从数据库得到数据的index的方法,该方法对包括用于编译index的至少一个命令的一个或多个查询进行响应。方法200可以在计算机可执行指令的一般上下文中描述。通常,计算机可执行指令可以包括执行特定功能或实施特定抽象数据类型的例程、程序、对象、组件、数据结构、过程、模块、函数等。方法600也可以在分布式计算环境中实施,在该环境中,功能由通过通信网络链接的远程处理设备执行。在分布式计算环境中,计算机可执行指令可以位于本地和远程计算机存储介质中,包括存储器存储设备。方法200被描述的顺序并不意在被解释为限制,并且任何数量的所描述的方法框可以按任何顺序进行组合以实施方法200或可替代方法。此外,在不脱离本文中描述的主题的范围的情况下,可以将单独块从方法600中删除。另外,该方法可以在任何合适的硬件、软件、固件或其组合中实施。然而,为了便于阐述,在下文描述的实施例中,可以认为该方法是在上文描述的系统10或设备20中实施的。在一种实施方式中,基于随同createindex一起给出的选项,index的定义可以根据图2中给出的以下流程来生成。在一种实施方式中,一旦下发createindex命令,首先该方法检查所请求的用户查询是否必须编译所提供的索引,如果是,则生成对应的c-文件,然后通过编译c-文件从c-文件生成dll,并利用服务器可执行文件加载dll以便进一步处理查询。本发明将编译选项作为真随同这一索引条目一起存储在系统表中。如果用户未请求索引编译,那么应按正常执行那样继续。在方框202处,从用户接收查询。接收到的查询用于查询数据库以对数据库表执行至少一种操作。操作可以包括但不限于:更新、删除、搜索、创建等。在方框204处,识别接收到查询以检查查询是否包括编译索引的选项。如果查询不包括编译索引的选项,那么查询以常规的方式/方法执行。在一个示例中,查询包括具有用于通过编译index创建文件的命令的“createindex”语句。当查询包括用于编译的命令时,该方法移动到下一方框。在方框206处,包括命令的查询由处理器响应于命令在本地编译,并生成对应于查询中的每个index的文件。在一种实施方式中,文件包括用于基于数据库中的索引列对index执行至少一种操作的至少一个结构和至少一种机制。在一种实施方式中,该方法包括:接收用于查询数据库的查询;处理器识别查询,其中查询包括具有用于通过编译index创建文件的命令的“createindex语句”;响应于命令,在本地编译查询,以生成对应于查询中的每个index的c-文件,并由此基于生成的c-文件生成共享对象文件,共享对象文件包括用于基于数据库中的索引列对index执行至少一种操作的至少一个结构和至少一种机制,其中共享对象文件是动态链接库文件。在一种实施方式中,该方法还包括:处理器基于接收到的查询,创建对应于所述索引的结构;处理器基于接收到的查询,具体地,基于作为createindex命令的一部分给出的index定义,创建用于索引元组值的至少一个访问函数,以及用于为索引元组找到适当的空隙的至少一条指令,其中为每个index生成的访问函数的数量总是相同的;处理器将创建的结构、生成的访问函数,以及生成的访问函数存储在缓冲区中,并基于存储的结构、访问函数和指令创建c-文件;处理器使用至少一个预先存储的编译器编译创建的c-文件;由此从c-文件生成文件,其中文件是动态链接库文件;以及处理器将文件连同至少一个可执行文件一起在系统中加载以用于查询的执行。在一种实施方式中,共享对象文件包括index中列的列表中的至少一个列、用于索引元组值的一个或多个访问函数、用于为索引元组找到适当的空隙的一条或多条指令,及其任意组合。在一种实施方式中,该方法为index创建系统表,并由此根据index是否需要编译来存储选项,其中选项从以下中的至少一种选择:“真”,如果查询中存在用于创建文件的命令,或“假”,如果查询中不存在用于创建文件的命令。在一种实施方式中,共享对象文件包括为index生成的一个或多个函数指针,其中生成的函数指针存储在一个或多个关系描述符表中。在一种实施方式中,关系描述符存储在为所有关系创建的缓存存储器中,并使用对应关系的系统表形成。关系描述符是使用对应关系的系统表形成的。在一个示例中,每当创建了用于索引的关系描述符,检查索引是否是主题绑定的,如果是,则形成dll文件名(通过串联索引名称和索引id),然后(通过使用函数dlopen或任何现有函数)将文件与服务器可执行文件进行链接。在一种实施方式中,该方法还包括如下生成共享对象文件:当接收到查询时,如果查询具有用于编译index的命令,那么系统基于index和接收到的查询生成c-文件,并由此通过编译生成的c-文件生成共享对象文件。在一种实施方式中,共享对象文件由应用、其它动态链接库,及其任意组合中的至少一种使用。在一种实施方式中,共享对象文件在创建index时基于以下条件命名:index的名称,其中索引的名称随同createindex查询一起获得;唯一编号,由系统生成,作为分配给每个索引的标识符;以及利用c-文件的名称创建共享对象文件,命名为名称和标识符的串联。在一种实施方式中,当接收到新查询时,该方法包括:处理器检查随同查询一起接收到的index是否是主题绑定的,其中提供标志以指示元组是否属于主题绑定索引;如果索引是主题绑定的,处理器利用存储到与index相关联的对应的关系描述符中的函数指针,以调用为新查询的执行生成的共享对象文件。在一种实施方式中,查询以包括createindex查询连同[compile]选项的格式接收。在一种实施方式中,生成的函数指针将从indexdll检索并且生成的函数指针可以存储在关系描述符中。现参照图3,图3示出根据本发明主题的实施例的用于生成dll的示例性方法300。在一种实施方式中,当接收到包括用于编译索引的命令的查询时,本发明生成dll,并将对应于主题的dll连同其它可用的可执行文件一起加载以用于查询的进一步处理,方式如下:●创建对应于index主题的c-结构,即,如果index是两个整数列,则如下生成结构:structidx_xxx{inta;intb};●然后生成所有访问方法函数以及对应于找到插入空隙的函数。持续将所有生成的结构和函数存储在缓冲区中。●最后将整个缓冲区写入c-文件。●然后使用适当的编译器,从c-文件生成dll,然后移除c-文件。●最后打开dll文件以加载dll文件连同服务器可执行文件。现参照图4,图4示出根据本发明主题的实施例的将从中生成dll的生成的c-文件的示例性代码快照。在一种实施方式中,将以下主题作为示例:createtabletbl(id1int,id2int,id3int);createindexidxontbl(id1)compile因此,基于以上主题,用户希望使用数据类型为int的列id1在表tbl上创建索引。用户也已经请求编译index定义并生成对应的dll。将从中生成dll的生成的c-代码的代码快照将在图4中示出。在一个示例中,生成的c-结构可以包括索引中列的列表、用于访问索引元组值的专门函数、用于为元组索引找到适当的空隙的专门代码。在一种实施方式中,如果索引中存在更多的列,本发明使得能够在该结构中增加对应于那些列的字段。另外,如果存在更多的字段,还获取其它索引的值。在一个示例中,对应于索引中的每一列,在结构中创建同一类型的成员变量。最后,结构定义将具有与索引中列的数量相同数量的变量。例如,如果在表(id1,id2)上createindexidx,其中id1和id2是int类型。因此,将创建如下结构:现参照图5,图5示出根据本发明主题的实施例的用于在发起新查询时调用生成的专门函数的示例性方法。在一种实施方式中,图5示出当发起新查询时,生成的专门函数的调用。在一种实施方式中,基于索引id,获得其关系描述符并检查它是否启用代码的专门化/汇编。如果是,则从描述符获得对应的函数指针并调用这一函数,而不采用正常广义函数调用。在一种实施方式中,当获得全部或部分属性时,首先检查索引是否是主题绑定的,如果不是,则继续正常访问方法函数的执行,否则获得对应索引的关系描述符,然后使用对应的访问方法函数地址(存储在关系描述符中)来调用访问方法的编译版本。工作示例:实验结果现参照图6,图6示出根据本发明主题的实施例的关于对b树索引的本地编译的pg9.4使用的实验结果。在一个示例中,本发明是利用以下主题针对b树索引的本地编译的postgresq(pg)9.4使用来实施的:createtabletbl(id1int,id2int,id3int)createindexidxontbl(id1);对于10万条记录插入,整体cpu指令减少了11%,而可比的函数减少了近75%。索引编译结果在图6中示出,。在另一示例中,如果在任何表上存在多个可能的索引,那么可以通过给予更高优先级来选择编译索引。例如,考虑如下两个索引:createindexidx1ontbl(id1);createindexidx2ontbl2(id1,id2)compile;查询为:selectid1,id3fromtblwhereid1<100;在传统数据库中,将始终选择idx1进行扫描,因为它比较小。但根据本发明,由于idx2是编译索引,使用这一索引来访问会成本更低,因此可以选择idx2而非idx1。为了验证已选择什么索引,将随同explain计划增加索引的compile性质。上文讨论的示例性实施例可以提供某些优势。虽然不要求实施本发明的各方面,但这些优势可以包括:1.本发明在系统中使用,通过消除通用代码来减少指令的数量,从而提高了index操作的性能。2.本发明用于通过考虑index的微专业化性质来改进对该index的计划。3.本发明明确地专注于主题的index,而较早的主题绑定没有关于index的任何内容。4.本发明用于在用户随同createindex一起提供选项时应用以生成indexdll。indexdll包含用于对索引以仅针对这一索引的非常特定的方式进行操作的所有结构和方法。5.本发明生和indexedll,无论表状态如何。例如,如果用户已给出以主题绑定的形式(即,随同dll一起)创建索引,那么无论表(针对其创建索引)是否是主题绑定的,索引都将以主题绑定的形式创建。表状态意味着表是主题绑定的还是普通的表。6.在本发明中,使用索引的主题绑定性质来选择用于在执行期间进行扫描的索引中的一个索引。计划是现有的数据库机制,这种机制生成对应于查询的执行计划。对于任何查询,可能存在多种执行查询的方式,因此数据库的优化器模块尝试生成最高效的“计划”,这反过来将使查询的执行更快。例如,计划确定将使用哪一种扫描(索引或序列)来扫描一张表。将索引作为生成的计划的一部分示出不属于本发明的范围。这已由所有rdbms完成。但根据本发明,虽然将索引作为计划的一部分示出,但本发明也随同计划中选择用于扫描的索引一起展示了索引的性质(即是否是主题绑定的)。7.本发明阐述了使用编译index的任何sql查询的计划,展示了这一操作在执行期间的情况。虽然已经以特定于结构特征和/或方法的语言对用于索引编译以优化索引使用的系统、方法和设备进行了描述,但应理解,所附权利要求不一定局限于所描述的具体特征或方法。而是,这些具体特征和方法是作为用于索引编译以优化索引使用的系统、方法和设备的实施示例公开。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1