基于oracle数据对象有效相对改变量算法的统计信息高可靠性保障技术上海新炬网络技术有限公司李颖赟(Alan.Lee)2009年7月文档更改历史记录日期版本号描述作者2009-07-01V1.0编写,修改李颖赟(Alan.Lee)中国移动专利申请技术交底书公司编号发明名称基于oracle数据对象有效相对改变量算法的统计信息高可靠性保障技术申报单位中国移动浙江公司申报类型发明发明人技术联系人注意事项1.技术联系人应为深入了解本申请提案技术方案的技术人员,如交底书撰写人,负责向专利审核人员和代理人解释技术细节、修改交底书、审核申请文件等工作,请务必填全技术联系人的姓名、E-mail、手机。2.请按照集团公司提供的本技术交底书模板逐项填写,除交底书第八部分为可选项外,其他均为必须填写的内容。填写不全的专利申请提案,集团公司不予立案。3.专利申请不要求已具体实现或实施,形成完整的技术方案即可提交申请,特别是需要向合作方公开、向标准提案或以其他方式公开的重要技术构思应在公开前尽早申请。4.技术交底书文件命名要求:发明名称+短横线(半角)+交底书+版本号,例:一种短消息群发方法-交底书v1.doc中国移动通信集团公司一、发明名称基于oracle数据对象有效相对改变量算法的统计信息高可靠性保障技术二、技术领域Oracle数据库三、现有技术的技术方案在目前的oracle数据库中,一条sql的执行,大致需要经过以下几个步骤:1.语法语义检查(syntaxcheck),检查此sql的拼写是否语法,访问对象是否存在及该用户是否具备相应的权限等。2.利用内部算法对sql语句进行解析(prase),生成解析树(parsetree)及执行计划(表或索引的访问方式等)。3.根据执行计划执行sql并返回结果。其中,第二步所产生执行计划的好坏直接决定了sql执行效率的高低,而执行计划,基本由CBO(Cost-basedOptimizer)优化器根据相应数据对象在数据字典中的统计信息,选择代价最小的访问路径产生。因此,数据库底层数据对象统计信息可靠性的高低,将直接影响CBO优化器产生执行计划的好坏。当前数据库系统中,为实现数据对象统计信息的持续高可靠性,主要有以下几种保障技术:1.以时间维度为衡量标准,按照一定的时间间隔(每日,每周,每月等),制定数据库的定时分析作业,保障统计信息的相对准确;2.结合实际应用,根据业务逻辑的不同,以具体业务数据的变化趋势及数据绝对变化量(如增加100W条记录分析一次)等为标准,对各个数据对象,有针对性的制定分析策略。第一种技术,适用于结构简单的单一型应用系统数据库,应用类型相对简单,数据库规模较小,无数据量激变等情况。该技术方案,在CBO机制被引入时即被广泛使用,奠定了统计信息时效性的理论基础。第二种技术,在第一种技术的基础上更进一步,结合应用数据变化趋势进行分析,适用于应用类型相对复杂但系统规模较小(数据对象较少)的数据库。该技术,需要对不同业务类型的数据对象,设计不同的分析策略,来保证各数据对象统计信息的相对准确。四、现有技术的缺点及本申请提案要解决的技术问题当前数据库系统,需要处理的数据量,信息量越来越庞大,应用系统的结构设计越来越复杂,数据库规模也随之与日俱增,现有技术方案逐渐显露出多种欠缺和不足。第一种技术,使用定时分析技术,随着业务系统复杂度的增加,不同类型对象的数据变化趋势差异明显,无法制定对所有对象均适用的时间间隔。第二种技术,基于个体化差异手工制定对应的分析策略,在数据库规模上升到一定程度后,个体对象数量急剧增加,手工维护成本成几何级增长,应用系统发生变化时,无法保证及时对原有策略进行更新,容易造成信息疏漏。以上两种技术的保障点,均是基于某种绝对量的改变(时间维度的绝对量,数据变化趋势的绝对量等)来制定策略。但是,在实际生产中,由于基准数据量的不同,相同绝对量的改变,可能对不同的对象产生截然不同的效果,很可能造成以偏概全的现象。例如,有A,B两张表,A表原有数据1亿,B表原有数据300W,两张表在3天时间内,两表均新增数据100W,此时,无论时间绝对量的改变,或是数据绝对量的改变,对两张表的影响都是迥然不同的(A表差异量仅为1%,基本无影响,无需重新采集统计信息,B表改变量超过30%,统计信息可靠性低,需要重新采集统计信息)。因此,从根本上来说,以上两种技术,都是相对比较片面的。使用绝对量的改变来衡量数据对象统计信息的可靠性高低,不管是时间间隔的绝对改变量,还是数据变化趋势的绝对改变量,都是具有很大局限性及片面性的。本发明研究的是基于oracle数据对象有效相对改变量算法的统计信息高可靠性保障技术。通过准实时采集数据库底层对象的各种改变量,包括物理改变量,逻辑改变量以及结构改变量等,根据各种改变量对数据对象的影响,设置各种改变量所占权重,并设计出一套算法,计算出数据对象的有效相对改变量,用来评估当前对象统计信息的可靠性,进而按照可靠性高低,排序建立自动分析队列进行分析处理,最终实现全库所有对象统计信息的实时高可靠性保障,提升数据库稳定运行指标。五、本申请提案的技术方案的详细阐述根据CBO优化器规则,为了能对应用sql进行解析,产生准确高效的执行计划,数据库必须从系统基表中获取相关对象的统计信息,这些统计信息是由最近一次对数据对象分析时记录在系统基表中的。对于数据库来说,由于数据对象总是在不断变化的,因此统计信息总是有一定程度的滞后于实际情况的,这种差异,我们称之为有效相对改变量。随着数据库的持续运行,有效相对改变量会越来越大,如果这种相对改变量达到一定的阀值,我们就认为该统计信息的可靠性低,CBO优化器就极有可能因此产生不恰当的执行计划,导致严重的sql性能问题。理论上,只要在有效相对改变量达到阀值前,及时对数据库对象进行重新分析,使其在系统字典表中相关的统计信息及时得到更新,降低有效相对改变量,就能保证统计信息的高可靠性。本技术方案就是以此为出发点,设计出评估数据库底层对象有效相对改变量的算法,并依据此算法,设计出对象级的统计信息可靠性检测模型,进而建立起一套完善的数据库统计信息高可靠性保障技术。按照实现流程,可分为两部分,第一部分为统计信息可靠性检测模型,第二部分为统计信息实时保障模型,其技术原理图如下:5.1对象级的统计信息可靠性检测模型建立方法描述:1、数据库对象改变量的数据分析一般来说,数据库对象的改变,主要由逻辑改变量和物理改变量等几个方面组成,下面对几个最主要指标进行说明:逻辑改变量:Insert改变量:该指标记录了自上次分析后对数据对象进行insert操作的次数。一般来说,进行一次insert操作,就会增加一条数据记录,并且根据数据对象当前的状况,还可能会引起数据对象的物理空间扩展,因此,该改变量在有效改变量中所占权重较大;Update改变量:该指标记录了自上次分析后对数据对象进行update操作的次数。一般来说,正常的更新操作,不会对数据对象的物理结构造成较大影响,但不排除某些情况下,由于update前后值差异较大,数据对象发生行迁移而对空间使用产生影响,因此,该改变量在有效改变量中所占权重较小;Delete改变量:该指标记录了自上次分析后对数据对象进行delete操作的次数。该操作会减少数据对象的记录数,但是并不回收对象所占用的物理空间,容易造成实际数据量与空间占用量不成正比的现象,因此,该改变量在有效改变量中所占权重较大;以上三个改变量,均是dml操作产生的,统称为逻辑改变量,其中,insert操作对数据段扩展有较为明显的作用,delete操作与之相反,会删除高水位线下的数据,但不会回缩数据段,而update操作,一般情况下,对数据对象的影响不明显。物理改变量:物理改变量主要体现在数据对象物理段的改变上。在对数据对象进行统计信息收集时,数据库会将当时数据对象的物理状况,包括所占用blocks大小,bytes大小等等,记录在相应的基表中。同时,数据对象实时的物理使用状况,也会记录在另外的基表中,通过核心指标的对比,即可得到相应的物理改变绝对差异量,并可根据一定算法,计算出物理有效相对改变量。因此,物理改变量,直接反应了一个数据对象的物理增长情况,该改变量可以直接作为单独的统计信息可靠性评估标准。其他结构类改变量:除了以上改变外,数据对象的数据结构的改变,如对表做增加/删除/修改字段,添加新的索引等等,也会导致统计信息的失效,在oracle数据库中,该类操作,统称DDL操作。此类改变量,属于单一性的结构改变量,与物理改变量一样,可作为单独的统计信息可靠性评估标准。以上几部分,基本囊括了一个数据对象可能发生的各种改变。2、统计信息可靠性检测模型建立从以上数据对象可能发生的改变量分析,可以得出,三种类型的改变量,均能单独影响统计信息的可靠性。因此,对三种类型改变量的检测评估采取相对独立的方式,任一类型的改变量,达到检测标准的阀值,即认为该数据对象可靠性较低。逻辑检测:根据不同dml操作对数据对象的影响,对其分配不同的权重,基本准则为delete操作insert操作delete操作。具体实现逻辑为:Insert操作次数大于50W次并且insert操作次数超过数据对象原有记录数的3%以上,或者insert操作次数大于30W并且insert操作次数超过数据对象原有记录数的5%以上,或者insert操作次数大于10W并且insert操作次数超过数据对象原有记录数的7%以上,或者insert操作次数大于1W并且insert操作次数超过数据对象原有记录数的10%以上的,符合以上条件中任一一条的数据对象,我们可以认为,频繁的insert操作已经大大降低了该数据对象统计信息的可靠性。数学表达式如下:(inserts500000&(inserts/num_rows*1003))||(inserts300000&(inserts/num_rows*1005))||(inserts100000&(inserts/num_rows*1007))||(inserts10000&(inserts/num_rows*10010))数据库采集过滤代码实现如下:SELECTa.table_owner,a.table_nameFROM(selectu.nametable_owner,o.nametable_name,m.inserts,m.updates,m.deletesfromsys.mon_mods_all$m,sys.obj$o,sys.tab$t,sys.user$uwhereo.obj#=m.obj#ando.obj#=t.obj#ando.owner#=u.user#unionallselectu.nametable_owner,o.nametable_name,m.inserts,m.updates,m.deletesfromsys.mon_mods_all$m,sys.obj$o,sys.user$uwhereo.owner#=u.user#ando.obj#=m.obj#ando.type#=19unionallselectu.nametable_owner,o.nametable_name,m.inserts,m.updates,m.deletesfromsys.mon_mods_all$m,sys.obj$o,sys.tabsubpart$tsp,sys.obj$o2,sys.user$uwhereo.obj#=m.obj#ando.owner#=u.user#ando.obj#=tsp.obj#ando2.obj#=tsp.pobj#)a,dba_tablesbwherea.table_namenotlike'BIN$%'anda.table_ownerlike'%XXX%'anda.table_owner=b.owneranda.table_name=b.table_nameandb.last_analyzedisnotnulland((a.inserts50000