一种代价估计的方法及设备与流程

文档序号:11216462阅读:467来源:国知局
本申请涉及计算机领域,尤其涉及一种代价估计的方法及设备。
背景技术
::基于代价的优化(cbo)是数据库系统中一种常见的结构化查询语句(sql)优化方法,其中,sql操作代价的估计是cbo的核心,精确的代价估计需要精良的估计算法和完备的统计信息,若单纯依靠现有的估计算法和统计信息模型,代价往往估计不准确,优化效果欠佳。现有的数据库系统不能解决代价估算的准确性和统计信息的完备性之间的矛盾,统计信息本身存在误差,当数据集异常庞大时,收集统计信息需要耗费巨大的资源,对于部分统计信息往往采用粗略估算的方式,为后续估算引入误差。另一方面,对于过滤、聚合等操作的代价估算,现有cbo方案中是假设目标数据均匀分布,对于数据倾斜的场景,估算误差大。现有技术中采用的静态方式,收集的统计信息不足,对部分无法估算的操作,实现中往往采用经验值,误差大。连接算法代价估计的精确度依赖维度表过滤率的估算,若该结果集再次参与其他连接,则会进一步放大误差。技术实现要素:本申请的一个目的是提供一种代价估计的方法及设备,解决现有数据库系统不能解决代价估算的准确性和统计信息的完备性之间的矛盾及现有数据库系统不能得到全局最优的执行计划的问题。根据本申请的一个方面,提供了一种代价估计的方法,所述方法包括:根据操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及获取到的原始统计信息确定所述操作类型的代价估计;确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计。进一步地,所述方法还包括:根据所述累积代价估计优化结构化查询语言语句对应的执行计划。进一步地,上述方法中,所述方法包括:通过hints、配置文件及新增语法中任一种或任几种组合方式对获取到的原始统计信息进行矫正,得到矫正后的统计信息。进一步地,所述操作树的操作类型包括以下至少任一项:扫表操作、过滤操作、连接操作及聚合操作。进一步地,当所述操作树的操作类型为过滤操作时,确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计,包括:确定待调整的代价估计为所述过滤操作的代价估计,基于所述过滤操作的指定选择确定调整因子,根据所述调整因子调整所述过滤操作的代价估计。进一步地,基于所述过滤操作的指定选择确定调整因子,根据所述调整因子调整所述过滤操作的代价估计,包括以下任一项:若所述过滤操作的指定选择为异值数,则确定调整因子,并根据所述调整因子更新所述异值数的值,根据更新后的异值数的值调整所述过滤操作的代价估计;若所述过滤操作的指定选择为选择率,则从大于0且小于等于1的范围中确定调整因子,并根据确定的调整因子更新所述选择率的值,根据更新后的选择率的值调整所述过滤操作的代价估计;若所述过滤操作的指定选择为数据倾斜度,则从大于0且小于等于10的范围中确定调整因子,并根据确定的调整因子更新所述数据倾斜度的值,根据更新后的数据倾斜度的值调整所述过滤操作的代价估计。进一步地,当所述操作树的操作类型为连接操作时,确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计,包括:确定待调整的代价估计为所述连接操作的代价估计,基于所述连接操作的指定选择确定调整因子,根据确定的调整因子计算代价因子,并根据所述代价因子调整所述连接操作的代价估计。进一步地,基于所述连接操作的指定选择确定调整因子,根据确定的调整因子计算代价因子,包括以下任一项:若所述连接操作的指定选择为连接优先级,则确定调整因子为所述连接优先级,根据预设的代价因子及所述优先级确定所述连接操作的代价因子;若所述连接操作的指定选择为连接类型,则确定调整因子为所述连接类型,计算所述连接类型的代价因子,并根据预设的代价因子及所述连接类型的代价因子确定所述连接操作的代价因子;若所述连接操作的指定选择为数据倾斜度,则确定调整因子为所述数据倾斜度,根据所述预设的代价因子及所述数据倾斜度确定所述连接操作的代价因子;若所述连接操作的指定选择为其他优化,则确定其他优化对应的调整因子,计算其他优化对应的代价因子,根据预设的代价因子及所述其他优化对应的代价因子确定所述连接操作的代价因子。进一步地,根据所述代价因子调整所述连接操作的代价估计,包括:根据所述代价因子与所述连接操作的代价估计的乘积更新所述连接操作的代价估计。进一步地,当所述操作树的操作类型为聚合操作时,确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计,包括:确定待调整的代价估计为所述聚合操作的代价估计,基于所述聚合操作的指定选择确定调整因子,根据所述调整因子调整所述聚合操作的代价估计。进一步地,基于所述聚合操作的指定选择确定调整因子,根据所述调整因子调整所述聚合操作的代价估计,包括以下任一项:若所述聚合操作的指定选择为聚合率,则确定调整因子为所述聚合率,更新所述聚合率的值,根据更新后的聚合率的值计算代价因子,并根据所述代价因子调整所述聚合操作的代价估计;若所述聚合操作的指定选择为倾斜率,则确定调整因子为所述倾斜率,根据所述倾斜率及所述聚合操作的聚合率更新所述聚合率的值,根据更新后的聚合率的值计算代价因子,并根据所述代价因子调整所述聚合操作的代价估计。进一步地,根据所述调整因子调整所述聚合操作的代价估计,包括:根据所述代价因子与所述聚合操作的代价估计的乘积更新所述聚合操作的代价估计。进一步地,所述方法还包括:通过hints、配置文件及新增语法中任一种或任几种组合方式将所述统计信息的数据表存在其他优化方式的信息进行发送至所述操作树。根据本申请另一个方面,还提供了一种代价估计的设备,所述设备包括:估算装置,用于根据操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及获取到的原始统计信息确定所述操作类型的代价估计;优化装置,用于确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;累积装置,用于根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计。进一步地,所述设备还包括:执行装置,用于根据所述累积代价估计优化结构化查询语言语句对应的执行计划。进一步地,所述设备包括:统计信息矫正装置,用于通过hints、配置文件及新增语法中任一种或任几种组合方式对获取到的原始统计信息进行矫正,得到矫正后的统计信息。进一步地,所述操作树的操作类型包括以下至少任一项:扫表操作、过滤操作、连接操作及聚合操作。进一步地,当所述操作树的操作类型为过滤操作时,所述优化装置用于:确定待调整的代价估计为所述过滤操作的代价估计,基于所述过滤操作的指定选择确定调整因子,根据所述调整因子调整所述过滤操作的代价估计。进一步地,所述优化装置用于以下任一项:若所述过滤操作的指定选择为异值数,则确定调整因子,并根据所述调整因子更新所述异值数的值,根据更新后的异值数的值调整所述过滤操作的代价估计;若所述过滤操作的指定选择为选择率,则从大于0且小于等于1的范围中确定调整因子,并根据确定的调整因子更新所述选择率的值,根据更新后的选择率的值调整所述过滤操作的代价估计;若所述过滤操作的指定选择为数据倾斜度,则从大于0且小于等于10的范围中确定调整因子,并根据确定的调整因子更新所述数据倾斜度的值,根据更新后的数据倾斜度的值调整所述过滤操作的代价估计。进一步地,当所述操作树的操作类型为连接操作时,所述优化装置用于:确定待调整的代价估计为所述连接操作的代价估计,基于所述连接操作的指定选择确定调整因子,根据确定的调整因子计算代价因子,根据所述代价因子调整所述连接操作的代价估计。进一步地,所述优化装置用于以下任一项:若所述连接操作的指定选择为连接优先级,则确定调整因子为所述连接优先级,根据预设的代价因子及所述优先级确定所述连接操作的代价因子;若所述连接操作的指定选择为连接类型,则确定调整因子为所述连接类型,计算所述连接类型的代价因子,并根据预设的代价因子及所述连接类型的代价因子确定所述连接操作的代价因子;若所述连接操作的指定选择为数据倾斜度,则确定调整因子为所述数据倾斜度,根据所述预设的代价因子及所述数据倾斜度确定所述连接操作的代价因子;若所述连接操作的指定选择为其他优化,则确定其他优化对应的调整因子,计算其他优化对应的代价因子,根据预设的代价因子及所述其他优化对应的代价因子确定所述连接操作的代价因子。进一步地,所述优化装置用于:根据所述代价因子与所述连接操作的代价估计的乘积更新所述连接操作的代价估计。进一步地,当所述操作树的操作类型为聚合操作时,所述优化装置用于:确定待调整的代价估计为所述聚合操作的代价估计,基于所述聚合操作的指定选择确定调整因子,根据所述调整因子调整所述聚合操作的代价估计。进一步地,所述优化装置用于以下任一项:若所述聚合操作的指定选择为聚合率,则确定调整因子为所述聚合率,更新所述聚合率的值,并根据更新后的聚合率的值计算代价因子,并根据所述代价因子调整所述聚合操作的代价估计;若所述聚合操作的指定选择为倾斜率,则确定调整因子为所述倾斜率,根据所述倾斜率及所述聚合操作的聚合率更新所述聚合率的值,根据更新后的聚合率的值计算代价因子,并根据所述代价因子调整所述聚合操作的代价估计。进一步地,所述优化装置用于:根据所述代价因子与所述聚合操作的代价估计的乘积更新所述聚合操作的代价估计。进一步地,所述设备还包括:发送装置,用于通过hints、配置文件及新增语法中任一种或任几种组合方式将所述统计信息的数据表存在其他优化方式的信息进行发送至所述操作树。根据本申请再一个方面,还提供了一种基于计算的设备,包括:处理器;以及被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:根据所述操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及获取到的原始统计信息确定所述操作类型的代价估计;确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计。与现有技术相比,本申请通过根据所述操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及获取到的原始统计信息确定所述操作类型的代价估计;确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计,解决了传统代价优化器存在的统计信息的完备性和代价估算的准确性之间的矛盾;通过矫正代价估计,提高代价优化器代价估计的准确性,从而生成性能更好的执行计划。进一步地,改进sql的代价优化器,使其感知其他优化的效果,从而生成全局更优的执行计划。附图说明通过阅读参照以下附图所作的对非限制性实施例所作的详细描述,本申请的其它特征、目的和优点将会变得更明显:图1示出根据本申请的一个方面提供的一种代价估计的方法流程示意图;图2示出本申请中的一实施例的操作树的示意图;图3示出根据本申请的又一个方面提供的一种代价估计的设备结构示意图。附图中相同或相似的附图标记代表相同或相似的部件。具体实施方式下面结合附图对本申请作进一步详细描述。在本申请一个典型的配置中,终端、服务网络的设备和可信方均包括一个或多个处理器(cpu)、输入/输出接口、网络接口和内存。内存可能包括计算机可读介质中的非永久性存储器,随机存取存储器(ram)和/或非易失性内存等形式,如只读存储器(rom)或闪存(flashram)。内存是计算机可读介质的示例。计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(pram)、静态随机存取存储器(sram)、动态随机存取存储器(dram)、其他类型的随机存取存储器(ram)、只读存储器(rom)、电可擦除可编程只读存储器(eeprom)、快闪记忆体或其他内存技术、只读光盘只读存储器(cd-rom)、数字多功能光盘(dvd)或其他光学存储、磁盒式磁带,磁带磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括非暂存电脑可读媒体(transitorymedia),如调制的数据信号和载波。图1示出根据本申请的一个方面提供的一种代价估计的方法流程示意图,所述方法包括:在步骤s11中,根据操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及获取到的原始统计信息确定所述操作类型的代价估计;在步骤s12中,确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;在步骤s13中,根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计。从而解决传统代价优化器中存在的统计信息的完备性和代价估算的准确性之间的矛盾,进一步地,本申请所述方法包括:根据所述累积代价估计优化结构化查询语言语句对应的执行计划。本申请所述的代价估计的方法应用于数据库系统中sql的优化,提高sql的代价优化器代价估计的准确性,从而生成性能更好的执行计划。在步骤s11中,根据所述操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及所述矫正后的统计信息确定所述操作类型的代价估计;在此,一棵操作树由不同的操作符构成,每一种操作符代表一类操作,基本的操作包括扫表、过滤、连接、投影、聚合、选择等,如图2所示的一颗典型的操作树示意图,调整操作树上的不同操作,估算每一步操作的代价,最终生成一颗累积代价最小的操作树,生成执行计划,而不同操作类型的代价估算方法不同,因此需要确定操作类型,采用对应的代价估计方式,进行每一步操作的代价估计。需要说明的是,在数据库系统中,编译后的sql语句会被表示为某种内部形式,可称为操作树(operatortree),统计信息为后续代价估算的数据基础,精良的代价估算算法依赖于完备的统计信息,在本申请一实施例中,获取到的原始统计信息的缺失可以通过人工补充,统计信息和代价估算的误差还可以通过人工矫正,通过一些额外途径分析或获取到数据集更加精准的信息。在本申请一实施例中,可以通过hints的方式对所述原始的统计信息进行矫正,得到矫正后的统计信息。在此,矫正cbo代价估算模型的实现方式有多种,可以采用sql中hints的方式为cbo提供额外信息,还可以通过添加新的语法、配置文件等方式灵活设置,在本申请实施例中,通过hints的方式仅为举例。统计信息本身的误差通过hints的方式消除,例如,若估算的ndv误差较大,可以用如下方式矫正:/*+ndv(col)=value*/,或者矫正某一属性的最大值:/*+max(col)=value*/。对于其他统计信息如表级和列级存在的误差,也可以通过hints的方式进行矫正,通过hints方式矫正统计信息,从而保证了代价估算的准确性。在上述实施例中,ndv(numberofdistinctvalue,异值数)从统计信息中得到。在本申请一实施例中,所述操作树的操作类型包括以下至少任一项:扫表操作、过滤操作、连接操作及聚合操作。在本申请一实施例中,矫正代价优化器中价估算模型可对操作类型中扫表操作、过滤操作、连接操作及聚合操作中的任一种或任几种组合中的代价估算进行矫正,提高sql的代价优化器代价估计的准确性,从而生成性能更好的执行计划。在步骤s12中,确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;在此,对于过滤、聚合等操作的代价估算,通过调整因子进行调整代价估计,从而减少数据倾斜的场景的代价估算,因不同的操作类型的代价,估计算法不同,因此需要确定待调整的代价估计,可能是需要优化过滤操作、连接操作、聚合操作等操作中的一种操作或任几种操作,进一步地提高操作树的代价估算的准确性。需要说明的是,调整因子包括谓词的选择率、连接的优先级、连接类型、聚合率、连接率、代价因子等会影响每一操作的代价估计的因素。在步骤s13中,根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计。在一实施例中,例如,扫表操作的代价估计为a,未进行调整,过滤操作时的代价估算算法进行优化,得到调整后的代价估计b’,连接操作的代价估算算法进行优化,得到调整后的代价估计c’,聚合操作等其他操作的代价估计均未调整,则操作树的最终代价是由未进行优化估算算法的操作类型的代价估计(比如代价估计a)与进行优化估算算法的操作类型的代价估计(比如代价估计b’、c’)的累积代价估计,当然,可以理解的是,操作树的每一操作类型的代价估算算法均可进行优化,或部分进行优化。其中,具体优化操作类型的估算算法可以通过如下方式实现:进一步地,当所述操作树的操作类型为过滤操作时,在步骤s12中,确定待调整的代价估计为所述过滤操作的代价估计,基于所述过滤操作的指定选择确定调整因子,根据所述调整因子调整所述过滤操作的代价估计。在本申请一实施例中,过滤操作的代价与谓词的选择率相关,不同形式的谓词,其选择率的估算算法不同,假定数据均匀分布,则恒等谓词(例如col=value)的选择率用该列的1/ndv估算,范围谓词的选择率则可以估算为范围占比。因此可通过调整选择率可对过滤操作进行优化,而选择率与ndv有关,进而可通过矫正ndv的方式可减少估算的误差。可通过以下方式进行实现:进一步地,在步骤s12中,若所述过滤操作的指定选择为异值数,则确定调整因子,并根据所述调整因子更新所述异值数的值,根据更新后的异值数的值调整所述过滤操作的代价估计;若所述过滤操作的指定选择为选择率(selectivity),则从大于0且小于等于1的范围中确定调整因子,并根据确定的调整因子更新所述选择率的值,根据更新后的选择率的值调整所述过滤操作的代价估计;若所述过滤操作的指定选择为数据倾斜度(skew-ratio),则从大于0且小于等于10的范围中确定调整因子,并根据确定的调整因子更新所述数据倾斜度的值,根据更新后的数据倾斜度的值调整所述过滤操作的代价估计。在本申请一实施例中,通过hints指定谓词(predicate)的选择率(value):/*+selectivity(predicate)=value*/和倾斜度/*+skew(table)=value*/,selectivity(predicate)的取值范围为(0,1.0],skew(table)的取值范围为(1.0,10.0],具体地为若指定了异值数(ndv),则改变该过滤操作的异值数的值,若指定了选择率,则改变过滤操作的选择率的值,若指定了数据倾斜度,则改变该过滤操作数据倾斜度的值,若指定了其他情况,进行相应处理。根据上述指定操作确定调整因子对过滤操作的代价估算进行优化,更新过滤操作,重新计算过滤操作的代价。通过指定值(指定异值数、选择率等的值),既节省了复杂的运算,又避免了cbo对于选择率的错误估计,对过度倾斜的表,cbo可以针对性选择连接的类型。进一步地,当所述操作树的操作类型为连接操作时,在步骤s12中,确定待调整的代价估计为所述连接操作的代价估计,基于所述连接操作的指定选择确定调整因子,根据确定的调整因子计算代价因子,根据所述代价因子调整所述连接操作的代价估计。在此,连接操作需要估算参与连接的数据集的规模和连接后数据集的规模,参与连接的数据集往往从原始数据集经过过滤后得到,其数据集规模与谓词的过滤率相关,连接后的数据集规模的估算可以通过将连接谓词作为事实表的过滤条件处理,谓词对维度表的过滤率即为事实表的过滤率。连接操作代价依赖于很多因素,其代价估计会直接影响到连接顺序和算法的选择,对性能的影响非常大。其中,代价因子为最终调整代价的系数,在以下实施例中,代价因子与代价系数可互换使用,通过调整代价因子间接的调整代价估计,在本申请一实施例中,可以通过干预的方式,指定或者修正连接顺序或者连接算法,确定代价系数,从而调整连接操作的代价估计。具体地,通过以下方式实现:在本申请一实施例中,在步骤s12中,若所述连接操作的指定选择为连接优先级,则确定调整因子为所述连接优先级,根据预设的代价因子及所述优先级确定所述连接操作的代价因子;若所述连接操作的指定选择为连接类型,则确定调整因子为所述连接类型,计算所述连接类型的代价因子,并根据预设的代价因子及所述连接类型的代价因子确定所述连接操作的代价因子;若所述连接操作的指定选择为数据倾斜度,则确定调整因子为所述数据倾斜度,根据所述预设的代价因子及所述数据倾斜度确定所述连接操作的代价因子;若所述连接操作的指定选择为其他优化,则确定其他优化对应的调整因子,计算其他优化对应的代价因子,根据预设的代价因子及所述其他优化对应的代价因子确定所述连接操作的代价因子。在此,若操作符的类型是连接,表示是连接操作,则首先定义初始代价系数,若指定连接优先级,则调整代价系数(代价因子)=初始代价系数/优先级;若指定连接类型,则计算指定连接类型的代价系数a,调整代价系数(代价因子)=初始代价系数×a;若指定数据倾斜度,则调整代价系数(代价因子)=代价系数×倾斜度;若指定其他优化,则计算其他优化存在情况下的代价系数b,调整代价系数(代价因子)=初始代价系数×b。进一步地,在步骤s12中,根据所述代价因子与所述连接操作的代价估计的乘积更新所述连接操作的代价估计。在此,调整好代价系数后,计算连接操作的代价,并得到代价系数和连接操作代价的乘积。需要说明的是,代价因子为最终调整代价的系数,例如,根据连接的优先级,计算一个相对应的因子,通过该因子来调整原先的连接操作的代价,再比如,扫表操作原本的代价因子为1.0,不需要调整,若指定了其他优化,则计算相应的代价因子,通过代价因子来调整(相乘)。在本申请一优选实施例中,对于连接操作,可以设计hints:priority(table1,table2,…)=njointype(table)=join_type;其中,priority(table1,table2,…)指定join的优先级,取值范围(1.0,100]。例如,设计如下的hint:/*priority(table_a,table_b)=10*/,指定数据表table_a和数据表table_b的连接优先级。在对table_a和table_b的连接做代价估算时,根据指定的优先级适当修正估算结果,以至生成合适的连接顺序。同样还可以为参与连接的全体数据集的子集指定连接优先级,例如:/*+priority(table_a,table_b,table_c)=20*/,修正table_a、table_b和table_c整体作为子查询的连接代价估算。通过这种方式,可以让部分子集先做连接操作,而不是将其拆解开来,各自参与其他连接运算。为cbo引入估算修正,即使在估算误差很大的情况下,优化器依然可以生产性能很好的执行计划。需要说明的是,上述jointype(table)指定连接类型,如数据库系统中的常见类型mapjoin、lookupjoin、bucketjoin等,例如/*+jointype(table_a)=mapjoin*/指定table_a可以做mapsidejoin。优化器选择mapsidejoin的前提是参与连接的数据集中存在规模较小的数据集,因而当对数据集规模的估算存在误差时,可以用hints的形式确保存在适用mapsidejoin的小规模数据集。进一步地,当所述操作树的操作类型为聚合操作时,在步骤s12中,确定待调整的代价估计为所述聚合操作的代价估计,基于所述聚合操作的指定选择确定调整因子,根据所述调整因子调整所述聚合操作的代价估计。在本申请一实施例中,对于聚合后数据集规模的估算在优化中有很大的作用,当聚合率高的时候,提前对参与连接的数据集去重(聚合),可以减少运算量,提高执行效率;对于已经去重的数据集还可以改用效率更高的连接算法,假定数据均匀分布,则常规聚合的结果估算为聚合字段的ndv,当数据倾斜时,或者其他原因造成估算误差大时,通过以下方式进行矫正代价估算:进一步地,在步骤s12中,若所述聚合操作的指定选择为聚合率,则确定调整因子为所述聚合率,更新所述聚合率的值,根据更新后的聚合率的值计算代价因子,并根据所述代价因子调整所述聚合操作的代价估计;若所述聚合操作的指定选择为倾斜率,则确定调整因子为所述倾斜率,根据所述倾斜率及所述聚合操作的聚合率更新所述聚合率的值,根据更新后的聚合率的值计算代价因子,并根据所述代价因子调整所述聚合操作的代价估计。在本申请一实施例中,进行聚合操作的代价估计时,若指定了聚合率,则改变聚合操作的聚合率,若指定了倾斜率,则改变聚合操作的聚合率=原聚合率×倾斜率,进一步地,根据所述聚合率与所述聚合操作的代价估计的乘积更新所述聚合操作的代价估计,在此,更新聚合率的值后,计算聚合操作的代价,并得到操作代价与更新后的聚合率的值的乘积。可以理解的是,可以使用hints矫正代价估计,指定聚合率:aggregateration(op)=n,其中,aggregateration(op)的取值范围为(0.1,1.0]。进一步地,所述方法还包括:通过hints、配置文件及新增语法中任一种或任几种组合的方式将所述统计信息的数据表存在其他优化方式的信息进行发送至所述操作树。在本申请一实施例中,可以设计hint:optimizations(table)={opt1,opt2},将其它优化的信息告知cbo,从而使得cbo可以感知其他优化器对操作树的优化,将其他优化纳入到代价模型中综合考量,进而生成全局最优执行计划。在本申请一优选实施例中,cbo整体代价估计模型的改进可以通过以下伪代码表示:其中,getcostof(operator)表示原始cbo模型对于操作的代价估算;getcostfactorfromopt()表示从具体的参数中计算出代价因子,取值范围(0,1.0],用来调整估算的代价,参数不同,估算方法不同,在此,通常优化效果越好,取值越小;getcostfactorjointype()表示根据join类型计算出代价因子,取值范围(0,10],用来调整估算的代价,join类型不同,估算方法不同,实际取值根据数据库系统中不同join的性能来决定,性能越好的join类型,取值越小;返回值cost表示改进后的代价估算值。综上所述,通过本申请所述的代价估计的方法,解决了传统代价优化器存在的统计信息的完备性和代价估算的准确性之间的矛盾;通过人工信息注入的方式(如hints),提高sql的代价优化器代价估计的准确性,从而生成性能更好的执行计划;改进sql的代价优化器,使其感知其他优化的效果,从而生成全局更优的执行计划。图3示出根据本申请的另一个方面提供的一种代价估计的设备结构示意图,所述设备包括:估算装置11、优化装置12和累积装置13,其中,估算装置11,用于根据操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及获取到的原始统计信息确定所述操作类型的代价估计;优化装置12,用于确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;累积装置13,用于根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计。从而解决传统代价优化器中存在的统计信息的完备性和代价估算的准确性之间的矛盾,进一步地,本申请所述设备包括:执行装置14,用于根据所述累积代价优化结构化查询语言语句对应的执行计划。本申请所述的代价估计的方法应用于数据库系统中sql的优化,提高sql的代价优化器代价估计的准确性,从而生成性能更好的执行计划。估算装置11,用于根据操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及获取到的统计信息确定所述操作类型的代价估计;在此,一棵操作树由不同的操作符构成,每一种操作符代表一类操作,基本的操作包括扫表、过滤、连接、投影、聚合、选择等,如图2所示的一颗典型的操作树示意图,调整操作树上的不同操作,估算每一步操作的代价,最终生成一颗累积代价最小的操作树,生成执行计划,而不同操作类型的代价估算方法不同,因此需要确定操作类型,采用对应的代价估计方式,进行每一步操作的代价估计。需要说明的是,在数据库系统中,编译后的sql语句会被表示为某种内部形式,可称为操作树(operatortree),统计信息为后续代价估算的数据基础,精良的代价估算算法依赖于完备的统计信息,在本申请一实施例中,获取到的原始统计信息的缺失可以通过人工补充,统计信息和代价估算的误差还可以通过人工矫正,通过一些额外途径分析或获取到数据集更加精准的信息。在本申请一实施例中,所述设备包括统计信息矫正装置(未示出),可以用于通过hints的方式对所述初步估算后的统计信息进行矫正,得到矫正后的统计信息。在此,矫正cbo代价估算模型的实现方式有多种,可以采用sql中hints的方式为cbo提供额外信息,还可以通过添加新的语法、配置文件等方式灵活设置,在本申请实施例中,通过hints的方式仅为举例。统计信息本身的误差通过hints的方式消除,例如,若估算的ndv误差较大,可以用如下方式矫正:/*+ndv(col)=value*/,或者矫正某一属性的最大值:/*+max(col)=value*/。对于其他统计信息如表级和列级存在的误差,也可以通过hints的方式进行矫正,通过hints方式矫正统计信息,从而保证了代价估算的准确性。在上述实施例中,ndv(numberofdistinctvalue,异值数)从统计信息中得到。在本申请一实施例中,所述操作树的操作类型包括以下至少任一项:扫表操作、过滤操作、连接操作及聚合操作。在本申请一实施例中,矫正代价优化器中价估算模型可对操作类型中扫表操作、过滤操作、连接操作及聚合操作中的任一种或任几种组合中的代价估算进行矫正,提高sql的代价优化器代价估计的准确性,从而生成性能更好的执行计划。优化装置12,用于确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;在此,对于过滤、聚合等操作的代价估算,通过调整因子进行调整代价估计,从而减少数据倾斜的场景的代价估算,因不同的操作类型的代价,估计算法不同,因此需要确定待调整的代价估计,可能是需要优化过滤操作、连接操作、聚合操作等操作中的一种操作或任几种操作,进一步地提高操作树的代价估算的准确性。需要说明的是,调整因子包括谓词的选择率、连接的优先级、连接类型、聚合率、连接率、代价因子等会影响每一操作的代价估计的因素。累积装置13,用于根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计。在一实施例中,例如,扫表操作的代价估计为a,未进行调整,过滤操作时的代价估算算法进行优化,得到调整后的代价估计b’,连接操作的代价估算算法进行优化,得到调整后的代价估计c’,聚合操作等其他操作的代价估计均未调整,则操作树的最终代价是由未进行优化估算算法的操作类型的代价估计(比如代价估计a)与进行优化估算算法的操作类型的代价估计(比如代价估计b’、c’)的累积代价估计,当然,可以理解的是,操作树的每一操作类型的代价估算算法均可进行优化,或部分进行优化。其中,具体优化操作类型的估算算法可以通过如下方式实现:进一步地,当所述操作树的操作类型为过滤操作时,优化装置12,用于确定待调整的代价估计为所述过滤操作的代价估计,基于所述过滤操作的指定选择确定调整因子,根据所述调整因子调整所述过滤操作的代价估计。在本申请一实施例中,过滤操作的代价与谓词的选择率相关,不同形式的谓词,其选择率的估算算法不同,假定数据均匀分布,则恒等谓词(例如col=value)的选择率用该列的1/ndv估算,范围谓词的选择率则可以估算为范围占比。因此可通过调整选择率可对过滤操作进行优化,而选择率与ndv有关,进而可通过矫正ndv的方式可减少估算的误差。可通过以下方式进行实现:进一步地,优化装置12,用于若所述过滤操作的指定选择为异值数,则确定调整因子,并根据所述调整因子更新所述异值数的值,根据更新后的异值数的值调整所述过滤操作的代价估计;若所述过滤操作的指定选择为选择率(selectivity),则从大于0且小于等于1的范围中确定调整因子,并根据确定的调整因子更新所述选择率的值,根据更新后的选择率的值调整所述过滤操作的代价估计;若所述过滤操作的指定选择为数据倾斜度(skew-ratio),则从大于0且小于等于10的范围中确定调整因子,并根据确定的调整因子更新所述数据倾斜度的值,根据更新后的数据倾斜度的值调整所述过滤操作的代价估计。在本申请一实施例中,通过hints指定谓词(predicate)的选择率(value):/*+selectivity(predicate)=value*/和倾斜度/*+skew(table)=value*/,selectivity(predicate)的取值范围为(0,1.0],skew(table)的取值范围为(1.0,10.0],具体地为若指定了异值数(ndv),则改变该过滤操作的异值数的值,若指定了选择率,则改变过滤操作的选择率的值,若指定了数据倾斜度,则改变该过滤操作数据倾斜度的值,若指定了其他情况,进行相应处理。根据上述指定操作确定调整因子对过滤操作的代价估算进行优化,更新过滤操作,重新计算过滤操作的代价。通过指定值(指定异值数、选择率等的值),既节省了复杂的运算,又避免了cbo对于选择率的错误估计,对过度倾斜的表,cbo可以针对性选择连接的类型。进一步地,当所述操作树的操作类型为连接操作时,优化装置12,用于确定待调整的代价估计为所述连接操作的代价估计,基于所述连接操作的指定选择确定调整因子,根据确定的调整因子计算代价因子,根据所述代价因子调整所述连接操作的代价估计。在此,连接操作需要估算参与连接的数据集的规模和连接后数据集的规模,参与连接的数据集往往从原始数据集经过过滤后得到,其数据集规模与谓词的过滤率相关,连接后的数据集规模的估算可以通过将连接谓词作为事实表的过滤条件处理,谓词对维度表的过滤率即为事实表的过滤率。连接操作代价依赖于很多因素,其代价估计会直接影响到连接顺序和算法的选择,对性能的影响非常大。其中,代价因子为最终调整代价的系数,在以下实施例中,代价因子与代价系数可互换使用,通过调整代价因子间接的调整代价估计,在本申请一实施例中,可以通过干预的方式,指定或者修正连接顺序或者连接算法,确定代价系数,从而调整连接操作的代价估计。具体地,通过以下方式实现:在本申请一实施例中,优化装置12,用于若所述连接操作的指定选择为连接优先级,则确定调整因子为所述连接优先级,根据预设的代价因子及所述优先级确定所述连接操作的代价因子;若所述连接操作的指定选择为连接类型,则确定调整因子为所述连接类型,计算所述连接类型的代价因子,并根据预设的代价因子及所述连接类型的代价因子确定所述连接操作的代价因子;若所述连接操作的指定选择为数据倾斜度,则确定调整因子为所述数据倾斜度,根据所述预设的代价因子及所述数据倾斜度确定所述连接操作的代价因子;若所述连接操作的指定选择为其他优化,则确定其他优化对应的调整因子,计算其他优化对应的代价因子,根据预设的代价因子及所述其他优化对应的代价因子确定所述连接操作的代价因子。在此,若操作符的类型是连接,表示是连接操作,则首先定义初始代价系数,若指定连接优先级,则调整代价系数(代价因子)=初始代价系数/优先级;若指定连接类型,则计算指定连接类型的代价系数a,调整代价系数(代价因子)=初始代价系数×a;若指定数据倾斜度,则调整代价系数(代价因子)=代价系数×倾斜度;若指定其他优化,则计算其他优化存在情况下的代价系数b,调整代价系数(代价因子)=初始代价系数×b。进一步地,优化装置12,用于根据所述代价因子与所述连接操作的代价估计的乘积更新所述连接操作的代价估计。在此,调整好代价系数后,计算连接操作的代价,并得到代价系数和连接操作代价的乘积。需要说明的是,代价因子为最终调整代价的系数,例如,根据连接的优先级,计算一个相对应的因子,通过该因子来调整原先的连接操作的代价,再比如,扫表操作原本的代价因子为1.0,不需要调整,若指定了其他优化,则计算相应的代价因子,通过代价因子来调整(相乘)。在本申请一优选实施例中,对于连接操作,可以设计hints:priority(table1,table2,…)=njointype(table)=join_type;其中,priority(table1,table2,…)指定join的优先级,取值范围(1.0,100]。例如,设计如下的hint:/*priority(table_a,table_b)=10*/,指定数据表table_a和数据表table_b的连接优先级。在对table_a和table_b的连接做代价估算时,根据指定的优先级适当修正估算结果,以至生成合适的连接顺序。同样还可以为参与连接的全体数据集的子集指定连接优先级,例如:/*+priority(table_a,table_b,table_c)=20*/,修正table_a、table_b和table_c整体作为子查询的连接代价估算。通过这种方式,可以让部分子集先做连接操作,而不是将其拆解开来,各自参与其他连接运算。为cbo引入估算修正,即使在估算误差很大的情况下,优化器依然可以生产性能很好的执行计划。需要说明的是,上述jointype(table)指定连接类型,如数据库系统中的常见类型mapjoin、lookupjoin、bucketjoin等,例如/*+jointype(table_a)=mapjoin*/指定table_a可以做mapsidejoin。优化器选择mapsidejoin的前提是参与连接的数据集中存在规模较小的数据集,因而当对数据集规模的估算存在误差时,可以用hints的形式确保存在适用mapsidejoin的小规模数据集。进一步地,当所述操作树的操作类型为聚合操作时,优化装置12,用于确定待调整的代价估计为所述聚合操作的代价估计,基于所述聚合操作的指定选择确定调整因子,根据所述调整因子调整所述聚合操作的代价估计。在本申请一实施例中,对于聚合后数据集规模的估算在优化中有很大的作用,当聚合率高的时候,提前对参与连接的数据集去重(聚合),可以减少运算量,提高执行效率;对于已经去重的数据集还可以改用效率更高的连接算法,假定数据均匀分布,则常规聚合的结果估算为聚合字段的ndv,当数据倾斜时,或者其他原因造成估算误差大时,通过以下方式进行矫正代价估算:进一步地,优化装置12,用于若所述聚合操作的指定选择为聚合率,则确定调整因子为所述聚合率,更新所述聚合率的值,根据更新后的聚合率的值计算代价因子,并根据所述代价因子调整所述聚合操作的代价估计;若所述聚合操作的指定选择为倾斜率,则确定调整因子为所述倾斜率,根据所述倾斜率及所述聚合操作的聚合率更新所述聚合率的值,根据更新后的聚合率的值计算代价因子,并根据所述代价因子调整所述聚合操作的代价估计。在本申请一实施例中,进行聚合操作的代价估计时,若指定了聚合率,则改变聚合操作的聚合率,若指定了倾斜率,则改变聚合操作的聚合率=原聚合率×倾斜率,进一步地,根据所述聚合率与所述聚合操作的代价估计的乘积更新所述聚合操作的代价估计,在此,更新聚合率的值后,计算聚合操作的代价,并得到操作代价与更新后的聚合率的值的乘积。可以理解的是,可以使用hints矫正代价估计,指定聚合率:aggregateration(op)=n,其中,aggregateration(op)的取值范围为(0.1,1.0]。进一步地,所述设备还包括:发送装置,用于通过hints、配置文件及新增语法中任一种或任几种组合的方式将所述统计信息的数据表存在其他优化方式的信息进行发送至所述操作树。在本申请一实施例中,可以设计hint:optimizations(table)={opt1,opt2},将其它优化的信息告知cbo,从而使得cbo可以感知其他优化器对操作树的优化,将其他优化纳入到代价模型中综合考量,进而生成全局最优执行计划。在本申请一优选实施例中,cbo整体代价估计模型的改进可以通过以下伪代码表示:其中,getcostof(operator)表示原始cbo模型对于操作的代价估算;getcostfactorfromopt()表示从具体的参数中计算出代价因子,取值范围(0,1.0],用来调整估算的代价,参数不同,估算方法不同,在此,通常优化效果越好,取值越小;getcostfactorjointype表示根据join类型计算出代价因子,取值范围(0,10],用来调整估算的代价,join类型不同,估算方法不同,实际取值根据数据库系统中不同join的性能来决定,性能越好的join类型,取值越小;返回值cost表示改进后的代价估算值。综上所述,通过本申请所述设备用于代价估计,解决了传统代价优化器存在的统计信息的完备性和代价估算的准确性之间的矛盾;通过人工信息注入的方式(如hints),提高sql的代价优化器代价估计的准确性,从而生成性能更好的执行计划;改进sql的代价优化器,使其感知其他优化的效果,从而生成全局更优的执行计划。根据本申请再一个方面,还提供了一种基于计算的设备,包括:处理器;以及被安排成存储计算机可执行指令的存储器,所述可执行指令在被执行时使所述处理器:根据操作树的操作类型确定对应的代价估计方式,基于所述代价估计方式及获取到的原始统计信息确定所述操作类型的代价估计;确定待调整的代价估计,基于所述待调整的代价估计对应的操作类型确定调整因子,根据所述调整因子调整所述待调整的代价估计;根据未调整的代价估计及调整后的代价估计确定所述操作树的累积代价估计。显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。需要注意的是,本申请可在软件和/或软件与硬件的组合体中被实施,例如,可采用专用集成电路(asic)、通用目的计算机或任何其他类似硬件设备来实现。在一个实施例中,本申请的软件程序可以通过处理器执行以实现上文所述步骤或功能。同样地,本申请的软件程序(包括相关的数据结构)可以被存储到计算机可读记录介质中,例如,ram存储器,磁或光驱动器或软磁盘及类似设备。另外,本申请的一些步骤或功能可采用硬件来实现,例如,作为与处理器配合从而执行各个步骤或功能的电路。另外,本申请的一部分可被应用为计算机程序产品,例如计算机程序指令,当其被计算机执行时,通过该计算机的操作,可以调用或提供根据本申请的方法和/或技术方案。而调用本申请的方法的程序指令,可能被存储在固定的或可移动的记录介质中,和/或通过广播或其他信号承载媒体中的数据流而被传输,和/或被存储在根据所述程序指令运行的计算机设备的工作存储器中。在此,根据本申请的一个实施例包括一个装置,该装置包括用于存储计算机程序指令的存储器和用于执行程序指令的处理器,其中,当该计算机程序指令被该处理器执行时,触发该装置运行基于前述根据本申请的多个实施例的方法和/或技术方案。对于本领域技术人员而言,显然本申请不限于上述示范性实施例的细节,而且在不背离本申请的精神或基本特征的情况下,能够以其他的具体形式实现本申请。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本申请的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本申请内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或步骤,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1