南 阳 理 工 学 院 本 科 毕 业 设 计(论文)基于ERP系统统的数据库性性能优化分析析Makes ddatabaase peerformmance optimmazitiion annalysiis basse on ERP ssystemm学 院(系):: 计算机机科学与技术术系 专 业: 计算机科学学与技术 学 生 姓 名名: 许培洪 学 号: 641077077 指 导 教 师师(职称):: 王秋芬(讲师) 评 阅 教 师师: 完 成 日 期期: 20111年5月 南阳理工学院Nanyangg Insttitutee of TTechnoology基于ERP系统统的数据库性性能优化分析析计算机科学与技技术专业 许许培洪[摘 要]随着着信息技术的的不断发展,中中小型企业信信息化建设越越来越重要,采采用先进的企企业资源计划划(ERP)系系统已势在必必行。
ERPP是顺应时代代要求的信息息技术与企业业管理新思想想相结合的产产物对商业业套装软件进进行性能优化化是比较困难难的,但仍有有机会对它进进行调优.只只要对应用系系统有正确的的理解,提供供时间和相关关资源,ITT团队就能够够改善复杂关关键应用的性性能本文在系统统分析研究EERP原理的的基础上,通通过对系统开开发与实现过过程中所涉及及的理论和技技术的研究,分析了ERP系统的功能模块结构,对后台oracle数据库做性能优化分析,并做持续跟踪优化[关键字] EERP; IIO,负载均均衡,AWRR,响应时间间,并发 Makes ddatabaase peerformmance optimmazitiion annalysiis basse on ERP ssystemmComputeer sciience&&technnologyy majoor Xu Pei hoongAbstracct: With the ffurtheer devvelopmment oof infformattion ttechnoology,,the iinformmatizaation consttructiion off smalll andd midddle-siize ennterprrises becommes moore annd morre impportannt.Thee use of addvanseed ERPP is oon thee righht wayy.ERP is thhe thee combbinatiion off infoormatiion teechnollogy aand neew ennterprrise mmanageement compllied wwith tthe deemand of erra.It is coomprassivelyy diffficultt to pperforrmancee optiimazittion oof thee commmerciaal sofftwaree packkage,bbut asslo haas chaance tto makke it perfoorm beetter..If onnly wiith thhe corrrect comprrehenssion oof appplicattion ssystemm and proviiding time and rrelateed ressourcees,IT groupps cann imprrove tthe peerfomaance oof commplex and kkey appplicaation.. Bassed onn the systeematicc anallysis reseaarch oon thee theoory off ERP systeem,thiis artticle analyyses tthe fuunctioon moddule sstructture oof ERPP systtem thhroughh the reseaarch oon theeory aand teechnollogy rrelateed to systeem devvelopmment aand immplemeentatiion prrocesss.Tt aalso mmakes perfoormancce opttimaziition analyysis tto thee backkstagee oraccle daatabasse andd doess the contiinuouss traccking optimmizatiion.Key worrd: ERRP; IO; AWR;Ouutbounnd Loaad Ballancinng; parattera;目 录 1. ERP系系统的现状 12. ORACCLE数据库库体系结构 22.1 物理结结构 22.2 逻辑结结构 22.2.1 块块(blocck) 32.2.2 区区(exteent) 32.2.3 段段(segmment) 42.2.4 表表空间(taablesppace) 43. 主机性能能调优 43.1 内存分分配 43.2 CPUU响应时间 53.3 IO和和并发 53.4 其他磁盘优优化 64. 参数调优优 65. SQL调调优 75.1 通过HHINT来强强制执行计划划 75.2 变量绑绑定 95.3 使用索索引 105.3.1 管管理组织索引引 105.3.2 聚聚簇的使用 115.4 使用分分析函数 115.5 利用oor代替 uniion alll 126. 总结和建建议 146.1 要有OORACLEE优化意识 156.2 优化有有步骤可遵循循 156..3 要做大基准准测试 166.4 避免重重复发明轮子子 166.5 力求使使用简单方法法 166.6 设计非非常重要 177. 结束语 17参考文献 1881. ERP系统的现现状随着信息技术的的不断发展,中中小型企业信信息化建设越越来越重要,采采用先进的企企业资源计划划(ERP)系系统已势在必必行。
ERPP是顺应时代代要求的信息息技术与企业业管理新思想想相结合的产产物目前国内外的EERP系统是是一类高度集集成的软件,其其涉及到众多多的计算机技技术而ERRP系统又不不仅仅是一个个软件,更重重要的是一个个管理思想,它它实现了企业业内部资源和和外部资源的的整合通过软软件把企业的的人、财、物物、产、供、销销及相应的物物流、资金流流、管理流、增增值流紧密地地集成起来EERP系统的的开发需要依依靠具有一定定的开发经验验和很好的技技术基础的开开发公司来完完成企业所处的环境境是不断变化化的:企业的的产品种类、产产品所处生命命周期的阶段段、企业的计计划模式、分分销模式都不不断变化,企企业不断地进进行业务流程程的再造,企企业的规模不不断地缩小或或者扩展,总总之企业的变变化是绝对的的对于国内内的ERP软软件供应商来来说,即使软软件的开发是是对国情深入入了解的前提提下,即使他他们的软件系系统功能再全全、适应性再再强,当面对对不通企业千千差万别的具具体情况和不不同企业千变变万化的特殊殊需求时,也也不可能以以以千变应万变变因而,客客观行要求EERP系统具具备适应各种种变化的能力力而另外一一方面,随着着时间的推移移,系统负载的增增加,系统性性能将下降,企业业务可可能受到影响响。
因此不管管企业采用国国内还是国外外的软件,都都面临着系统统的二次开发发和性能优化化问题对商业套装软件件进行性能优优化是比较困困难的,但仍仍有机会对它它进行调优..只要对应用用系统有正确确的理解,提提供时间和相相关资源,IIT团队就能能够改善复杂杂关键应用的的性能以oraclee ERP 为例,ORRACLE应应用系统充分分采用了数据据库上的先进进技术,将有有些系统功能能放到数据库库中去实现,而而不是通过编编程的方式,因因而大大简化化了程序,提提高了效率ORACLLE 电子商商务套件已经经脱离了传统统的ERP软软件模式,提提供了集成的的商业智能、个个性化管理界界面、工作流流和告警等全全新的功能传传统的ERPP软件,用户户需要进入层层层菜单,运运行查询或报报表,才能得得到业务数据据而使用OORACLEE,用户可以以在个性化的的企业门户网网页中,自由由定义所需的的智能报表,就就能迅速了解解企业、相关关业务的执行行情况系统统还能够对非非正常业务自自动告警OORACLEE 系统以人人为本,帮助助企业的管理理人员充分利利用ERP的的业务数据,更更高效地管理理企业本文在系统分析析研究ORAACLE EERP原理的的基础上,通通过对系统开开发与实现过过程中所涉及及的理论和技技术的研究,通过对后台ORACLE数据库的架构进行分析研究,提出基于ERP系统的数据库性能优化模型,并做持续跟踪优化。
2. ORACLE数数据库体系结结构Oracle数数据库在存储储数据的时候候并不是简单单地进行数据据堆砌,而是是由一整套严严谨,高效的的逻辑结构来来管理数据库库的存储,因因此数据库的的存储结构也也可以分为两两大类,物理理结构和逻辑辑结构物理理存储结构对对应一系列的的不同格式、类类型、作用的的文件,用来来存储对象及及物理数据,逻逻辑结构则是是oraclle内存存储储机制2.1 物理结构数据库由一系列列物理文件组组成,其中包包括控制文件件,数据文件件,日志文件件,临时文件件等,他们在在DBMS中中充当不同的的角色,共同同协调DBMMS的正常运运行我们可可以建立一个个模型DBBMS相当于于一个公司,而而控制文件是是老板,只负负责发号施令令,数据文件件是忠实的员员工,只负责责执行任务,而而临时文件相相当于公司的的公用资产,谁谁都可以使用用,日志文件件了,就相当当于公司买的的保险了,用用的上的时候候才能用上本论文调优涉及及到数据文件件的,我概要要介绍一下数数据的存储机机制数据库库中每条数据据都存储在数数据文件中,一一个数据库拥拥有很多数据据文件,一个个数据文件在在物理上对应应一个操作系系统文件。
OOraclee 在创建数数据文件时,是是通过操作系系统在指定路路径下分配一一块磁盘空间间并将其格式式化操作系系统把这块存存储区域分配配给这个数据据文件,并赋赋予其写磁盘盘的权限但是我们存储数数据的时候,数数据会被随机机存储到数据据文件中,这这是因为数据据文件是一个个物理的概念念,我们不能能指定在创建建对象的时候候指定它到那那个数据文件件中去,只能能指定到哪个个表空间当当然我么也可可以通过动态态视图来查看看一个数据文文件中拥有哪哪些对象selectbb.segmment_nname ,,A.FILLE_NAMME,b.BBYTES,,b.BLOOCKS ,a.BYYTES,aa.USERR_BYTEES from dbba_datta_filles a,,dba_eextentts b wwhere a.fille_id==b.fille_id and aa.filee_namee = 'DD:\LMIIS\DATTAFILEE\DATAA27.DBBF';2.2 逻辑结构数据库的物理存存储结构对应应一系列的物物理存储文件件,而数据是是如何存储的的?以什么机机构存储到数数据文件中的的?这要取决决于逻辑存储储结构。
Oracle数数据库执行的的每次操作都都是从逻辑上上定义一组结结构,操作的的数据可以一一步步细分为为不同的存储储单元,orracle操操作数据的过过程,实际上上就是对不同同级别的存储储单元进行维维护和管理的的过程,下面面让我们来了了解一下数据据库的存储单单元按照如下从小到到大顺序,逻逻辑存储单元元可以做如下下划分2.2.1 块(blockk)块是oraclle存储结构构中的最小存存储单元,所所以数据的存存储都是以块块为单位进行行存取的,块块的大小可以以通过出初始始化参数dbb_blocck_sizze来设置我们们知道所有的的读写操作都都反映在磁盘盘IO上,最最终的操作单单位是字节,如如果每次读写写都是以字节节为单位进行行,将会是非非常慢的,不不同文件的默默认块大小也也不一样,般般都设置成88KB或者是是16KB.. 下图为为数据块的剖剖面图:数据块头行记录行目录表目录空闲记录图2-1 数据据块剖面图我们简要介绍行行记录和空闲闲空间,当行行记录有写入入数据的时候候就存储在行行记录中,当当数据被删除除时这部分空空间又会转换换成空闲空间间空闲空间间是当前块的的可用空间,当当对现有数据据进行upddate和IInsertt的时候就是是从这部分空空间分配容量量来写入数据据,如果执行行UPDATTE的时候,块块中的空间不不足以存储被被修改的数据据,那么记录录就将被存储储到另外一个个拥有足够空空间的块中,而而只在原块中中保留一条指指向新块的rrowid,这这种现象就是是传说中的行行迁移(Roow Miggratioon)。
[11]2.2.2 区(extennt)区是oraclle 最小的的分配单位,有有一组连续的的块组成,这这些块可能物物理上并不连连续,但是要要属于同一个个物理文件单单个区在分配配时候不能跨跨文件分配,而而我们数据库库创建对象的的时候至少为为为该对象初初始化一个分分区初始化分分配的空间叫叫走初始区随随着对象大小小的不断增加加,操作初始始区后oraacle还再再为对象分配配扩展区IIncremmentall Exteent),扩扩展区不一定定药与初始化化分区连续存存放2.2.3 段(segmeent)一个段又很多分分区组成,以以前段可以理理解为一个对对象,但是随随着软件版本本的演进,存存储一个对象象可以存储到到不同的段中中比如一个个对象包含索索引,LOBB类型,那么么该对象会分分别存储到表表段,索引段段,LOB段段如果一个个单纯的堆组组织表,那么么该表只存储储到一个段中中,不管该表表包含多少的的数据2.2.4 表空间(tabblespaace)一个表空间从逻逻辑上定义,是是有多个段组组成的从物理理上定义,是是由多个数据据文件组成的的表空间是是oraclle逻辑上分分配的最大存存储单位i,我我们平常做的的创建对象操操作都在表空空间一级进行行,如创建存存储对象的时时候只能指定定在哪个表空空间进,而不不能指定存储储到更细粒度度的存储单元元了,更不能能指定存储到到哪个数据文文件中。
分析数据库的体体系结构是为为了更好地建建立数据库优优化模型下图图为整体优化化的模型: 图2--2 数据库库优化模型3. 主机性能调优3.1 内存分配我们知道在创建建数据库的时时候给ORAACLE分配配一个SGAA(systtem gllobal area),SSGA越大,数数据库可用的的内存就越大大我们操作作系统一般是是32位的,最最大寻址空间间为2的322次方,即44G的内存大大小当我们们的操作系统统是64位的的时候,最大大寻址空间变变为了2的664次方了在创创建数据库的的过程我们一一般是手动设设置内存分配配大小,合理理地设置daata buuffer、sshare pool、 log bbufferr 等大小能能使系统的性性能提升更快快3.2 CPU响应时时间数据库服务器响响应时间由CCPU处理时时间和等待时时间组成,其其中等待时间间往往和某种种瓶颈有关,如如ORACLLE数据的写写出需等待日日志先写出(lgwr进程),如果日志所在磁盘出现异常,那数据写出进程(dbw进程)再快也需等待!CPU处理时间中,重点在SQL执行时间,我总结出“访问量”除以“吞吐量”的方式,并将访问量细化为“执行次数”和“单次访问量”,这样目的在于,优化可从减少访问量入手,也可从降低执行次数着手!数据库响应时间如图二所示:图2-3 数据据库响应时间间模型3.3 IO和并发数据库的硬件设设计包含了数数据库服务器器的架构和数数据存储,这这些因素在数数据库设计阶阶段将作为重重点的考虑因因素,我们应应该充分考虑虑到数据库可可能达到的最最大并发数,对对于OLTPP系统,并发发将是一件非非常重要的事事.如果没有有在设计阶段段考虑到,可可能会出现以以下后果: a.系统资源源严重被用,系系统过负荷运运行。
b.严重的等等待时间,可可能造成系统统频繁锁及热热块的产生对应IO问题,可可以通过以下下的语句来判判断:Select name phyrdds,phyywrts,,readttim,wrritetiim froom v$ffilesttat a,,v$dattafilee b whhere aa.filee#=b...file## ordeer by read time desc3.4 其他磁盘优化化在对ERP系统统做优化的过过程中还总结结了一下提高高性能的方法法A 分离表空间间、oraccle的安装装目录、联机机重做日志、经经常被访问的的数据文件、索索引表空间,避避免磁盘竞争争B 增大日志文文件的大小,从从而增加处理理大型inssert,uupdatee,deleete 操作作的比例C 增大日志组组成员,提倡倡一个主日志志文件加一个多路利利用文件D 不要在系统统表空间中执执行排序4. 参数调优我们来认识以下下数据库的一一些重要的初初始化参数SGA_MAXX_SIZEE SGA_TARRGETPGA_AGGGREGATTE_TARRGETDB_CACHHAE_SIIZESHORE_PPOOL_SSIZE4.1 调整DB_CCACHE__SIZE来来提高性能这个参数设定了了用来存储和和处理内存中中的数据大小小,我们知道从内存存中读取数据据比磁盘中快快1000倍倍左右,DBB_CACHHE_SIZZE越大能增增大数据读取取的缓存命中中率。
4.2 设定DB_BBLOCK__SIZE来来反映数据读读取量大小OLTP一般为为8K,OLLAP一般为为16K或者者32K4.3 调整SHARRE_POOOL_SIZZE来优化性性能此参数越大,说说明共享的SSQL越多,使使得在内存中中便能够找到到使用过的SSQL语句,为为了减少硬解解析次数,优优化对共享SSQL区域的的使用需尽量量使用存储过过程、使用绑绑定变量4.4 调整PGA__AGGREEGATE__TARGEET以优化对对内存的应用用OLTP:总内内存*80%%*20%OLAP总内存存*80%550%5. SQL调优 系统正在运行的的时候,我们们做系统调优优应该尽量避避免改写sl语句,改改写SQL语语句意味着一一些代码要重重新编写,调调试,运行,测测试这样会会给系统带来来一定的风险险,但是我们们日常维护中中,涉及到一一些查询模块块的操作我们们可以在查询询维护工具里里面改写SL.下面我我们从几方面面来SQL调调优5.1 通过HINTT来强制执行行计划HINT是orracle提提供的一种ssql语法,他他允许用户在在sql语句句中插入相关关的语法,从从而影响SL的执行方方式。
下面来来看一条系统统里面的查询询语句 Selectt counnt(* ))from ck_rwwd_mx__old Selecct /* + inddex(t IDX__CK_RWWD_MX__BHLSHH)*/ coount(**)fromm ck_rrwd_mxx_old两者一共返回771614882 第一个个sql执行行时间为 221秒,第二二个执行时间间为3.755秒,很明显显我们看到加加了HINTT的,强制进进行索引扫描描,效率明显显提高了当然,我们也可可以根据应用用的需要添加加HINT,比比如有些应用用只是需要找找到符合条件件的第一条数数据这时我么么可以使用如如下HINTT:SELECT /*+FIIRST_RROWS(11)*/ SSTORIDD,FROMM TAL__SOTEOracle 默认的 OOPTIMIIZER_MMODE 是是ALL_RROW,基于于规则的优化化器 ,加了了FIRSTT_ROW后后强制OPTTIMIZEER_MODDE为FIRRST_ROOW;FIRRST_ROOW还可以指指定参数FIIRST_RROW(n))在日常维护中还还发现一个问问题,比如我我用select /*+inndex(tt ckt__spkfkk)*/ ccount((*) frrom sppkfk;执行计划如下::Executiion Pllan--------------------------------------------------------------------- 0 SEELECT STATEEMENT Optimmizer==ALL_RROWS ((Cost==23 Caard=1)) 1 0 SORT (AGGRREGATEE) 2 1 INDDEX (FFAST FFULL SSCAN) OF 'PPK_SPKKFK' ((INDEXX (UNIIQUE))) (C osst=23 Card==318833)而我执行select /*+inndex(tt ckt__spkfkk)*/ ccount((xslb) from spkfkk;执行计划如下::Executiion Pllan--------------------------------------------------------------------- 0 SEELECT STATEEMENT Optimmizer==ALL_RROWS ((Cost==444 CCard=11 Bytees=3 ) 1 0 SORT (AGGRREGATEE) 2 1 TABBLE ACCCESS (FULLL) OF 'SPKFFK' (TTABLE)) (Cosst=4444 Cardd=31 8883 Byttes=955649)当我执行 selectt /*+iindex((t cktt_spkffk)*/ countt(spbhh) froom spkkfk;执行计划如下::Executiion Pllan--------------------------------------------------------------------- 0 SEELECT STATEEMENT Optimmizer==ALL_RROWS ((Cost==22 Caard=1 Bytess=12 ) 1 0 SORT (AGGRREGATEE) 2 1 INDDEX (FFAST FFULL SSCAN) OF 'CCKT_SPPKFK' (INDEEX (UNNIQUE))) ( Coost=222 Cardd=318883 Byttes=3882596))我们看到第一个个求counnt(*) 变相选择PPK_SPKKFK做为索索引扫描,第第二个HINNT被忽略了了,而做全表表扫描,只有有第三个求ccount((spbh)),选择索引引扫描,,为为什么呢?因为,要对表的的记录求总数数,HINTT的索引是唯唯一索引且不不为空,如果果CBO选择择在索引上做做了COUNNT,当索引引字段有空值值时,couunt字段必必然不准确,当做COUNT(*)的时候oracle会默认选择不为空的的索引做扫描,这就是基于代价的优化器(CBO)的好处了。
而第二个求count(xslb)因为改字段可为空,oracle找不到合适的索引做扫描,而HINT使用的CKT_SPKFK是建在spbh字段的索引,做count的时候结果必然不准确比如T表实际上有一千条数据,spbh字段有100空,xslb有200个空,这样求count(xslb)使用索引扫描得出的是900个,显然数据是错误的所以这种情况下CBO是不会做索引的,因为他会导致错误的结果而当在索引上创创建了主键ppk_spkkfk,这样样就保证了该该字段不为空空当再次地地表做couunt(*))的时候指定定的HINTT就起作用了了,因为索引引不为空,对对索引的COOUNT和对对表的COUUNT值是相相同的还有在日常维护护中,发现表表关联的操作作比较多,经经过对系统的的实验得出了了一个结论::大表间的关联操操作使用HAASH JOOIN会比 NESTEED JOIIN效率高一一点,小表间间的关联通常常选择NESSTED JJOIN 比比HASH JOIN效效率高些,而而一般能用MMERGE JOIN提提高性能的地地方,HASSH JOIIN都会发现现更出色的性性能5.2 变量绑定变量绑定是OLLTP数据库库系统中一个个非常重要的的技术点。
良良好的变量绑绑定会是OLLTP系统数数据库中的SSQL跑的飞飞快,内存效效率极高;不不绑定变量可可能会使OLLTP数据库库不堪重负,资资源被SQLL解析严重消消耗,系统显显得滞重而缓缓慢我们知道一条ssql在数据据中是怎么被被执行的,一一条SQL被被发送到服务务器中,会做做一个HASSH函数运算算,得到一个个HASH值值,然后到共共享池中找到到是否有何这这个HASHH值匹配的SSQL存在,如如果找到了,ooraclee直接使用已已经存在的执执行计划去执执行这条SL,然后将将结果返回给给用户,如果果在共享池中中没有找到,则则把他当做一一条新的SQL,,将会按照以以下顺序执行行,语法分析析->语义分分析->生成成执行计划-->SQL的的执行下面对比一个一一条SQL执执行了100000次时,绑绑定变量和非非绑定变量在在资源上的消消耗情况例一:PARSINGG IN CCURSORR #1 llen=1119 depp=0 uiid=55 oct=447 lidd=55 ttim=100175288684 hhv=29336948880 ='cc6937cc78'beginfor x iin 1...100000 loopexecutee immeediatee 'sellect ** fromm all__objeccts whhere oobjectt_namee=:x' usingg x;end looop;end;END OF STMTPARSE 11:c=0,,e=15336,p=00,cr=00,cu=00,mis==1,r=00,dep==0,og==1,timm=101775286882执行时间:0..71+0..48=1..19秒CPU时间:00.6+0..2=0.88秒分析次数:344次执行次数:100084次例二 PARSINNG IN CURSOOR #1 len=1113 deep=0 uuid=0 oct=447 lidd=0 tiim=415500235581 hvv=187667909116 ad=='c66dd8260''beginfor x iin 1...100000 loopexecutee immeediatee 'sellect ** fromm all__objeccts whhere oobjectt_namee='||xx; end looop;end;END OF STMTPARSE 11:c=0,,e=17001,p=00,cr=00,cu=00,mis==1,r=00,dep==0,og==1,timm=415000235779执行时间:933.98+11.93=995.91秒秒CPU时间:889.64++1.92==91.566秒分析次数:300002次执行次数:300003次两种情况对比的的结果显示,绑绑定变量SL的资源消消耗要远远少少于未绑定变变量的SQLL资源消耗,ssql的执行行次数越多,这这种差距就越越明显,未绑绑定变量SL的资源主主要消耗在产产生递归SL中,这些些SQL主要要是对SQLL语句做硬分分析时使用的的。
如果我们们让所有用户户在数据库操操作中传给OORACLEE的都是这样样一个由变量量代替常量的的SQL,那那么oraccle只需要要硬分析第一一条sql就就可以了,这这样省掉了前前面很耗资源源的硬分析过过程5.3 使用索引5.3.1 管理组织索引索引可以大大加加快数据库的的查询速度,索索引把表中的的逻辑值映射射到安全的RRowID,因因此索引能进进行快速定位位数据的物理理地址但是是有些DBAA发现,对一一个大型表建建立的索引,并并不能改善数数据查询速度度,反而会影影响整个数据据库的性能这这主要是和SSGA的数据据管理方式有有关ORAACLE在进进行数据块高高速缓存管理理时,索引数数据比普通数数据具有更高高的驻留权限限,在进行空空间竞争时,OORACLEE会先移出普普通数据对对一个建有索索引的大型表表的查询时,索索引数据可能能会用完所有有的数据块缓缓存空间,OORACLEE不得不频繁繁地进行磁盘盘读写来获取取数据,因此此在对一个大大型表进行分分区之后,可可以根据相应应的分区建立立分区索引如如果对这样大大型表的数据据查询比较频频繁,或者干干脆不建索引引另外,DDBA创建索索引时,应尽尽量保证该索索引最可能地地被用于whhere子句句中,如果对对查询只简单单地制定一个个索引,并不不一定会加快快速度,因为为索引必须指指定一个适合合所需的访问问路径[2]]5.3.2 聚簇的使用Oracle提提供了另一种种方法来提高高查询速度,就就是聚簇(CClusteer)。
所谓谓聚簇,简单单地说就是把把几个表放在在一起,按一一定公共属性性混合存放聚聚簇根据共同同码值将多个个表的数据存存储在同一个个Oraclle块中,这这时检索一组组Oraclle块就同时时得到两个表表的数据,这这样就可以减减少需要存储储的Oraccle块,从从而提高应用用程序的性能能优化设置的索引引,就必须充充分利用才能能加快数据库库访问速度OORACLEE要使用一个个索引,有一一些最基本的的条件:a、wheree子名中的这这个字段,必必须是复合索索引的第一个个字段;b、wheree子名中的这这个字段,不不应该参与任任何形式的计计算5.4 使用分析函数数分析函数可以减减少表扫描的的次数,下面面先看一个EERP系统中中分析函数使使用提高数据据库性能的案案例:select distiinct ddsl1.ppeer_iid peeer_id,, nvll(ne_ddisconnnect__info..ne_sttate, 1) nee_statte froom dccc_sys__log ddsl1, (seelect distiinct ddnl.peeer_idd peerr_id, ddecodee(actiion, 'dissconneect', 0, 'connnect'', 0, 1) nne_staate from dcc_ssys_loog dsll, dccc_ne_llog dnnl wwhere dsl.ppeer_iid = ddnl.peeer_idd and ((dsll.actiion = 'discconnecct' annd dsl.ccause = '关闭闭对端') or (dsl..actioon = ''conneect' aand dsl.ccause = '连接接主机失败'')) and log_ttype == '对端交交互' and dsl.llog_tiime = (seleect maax(logg_timee) frrom dccc_syss_log wheere peeer_idd = dnnl.peeer_id aand loog_typpe = ''对端交互'')) nee_discconnecct_inffo wherre dsll1.peeer_id = ne__discoonnectt_infoo.peerr_id(++)原先至少需要扫扫描2次!现现在根据KEEEP结合DDENSE__RANK的的方式,将表表扫描从2次次变为了1次次,具体代码码改写如下::SELECT a.peeer_id,,CASE WHHEN dnnl.peeer_id IS NOOT NULLL ANDD str IN (''discoonnectt关闭对端'','connnect连连接主机失败败') THHEN '00' ELSSE '1'' END ne_sttateFROM (SSELECTT peerr_id,MMIN(acction|||causse) KEEEP(DEENSE_RRANK LLAST OORDER BY loog_timme) sttr FFROM ddcc_syys_logg dsl WWHERE log_ttype == '对端交交互' GGROUP BY peeer_idd) a,(SEELECT DISTIINCT ppeer_iid FROOM dccc_ne_llog) ddnl WHERE aa.peerr_id == dnl..peer__id(+)))5.5 利用or代替替 unioon alllselect peer__id 对端标识识, null 源域名,, null 目标域名名, alertt_typee 告警类型型, log_ttime 告警时间间, causee 告警内容容, deal__log 处理状态态, deal__stafff 处理人,, deal__time 处理时间间, remarrk 备注 from dcc_ssys_loog where actioon = ''discoonnectt' and causee likee '对端被被关闭%' and deal__log == 'deaal_logg' and alertt_typee = 'aalert__type'' and log_ttime >>= TO__DATE(('20100-08-002', ''YYYY--MM-DDD') and log_ttime << TO__DATE(('20100-08-003', ''YYYY--MM-DDD') + 1union (seleect ppeer_iid 对端标识,, oriigin_hhost 源域名, desst_hosst 目目标域名, aleert_tyype 告警类型,, logg_timee 告告警时间, cauuse 告告警内容, deaal_logg 处处理状态, deaal_staaff 处理人, deaal_timme 处处理时间, remmark 备备注 froom dccc_ne_llog wherre ressult == 0 annd cauuse liike 'pparserr失败%' annd deaal_logg = 'ddeal_llog' annd aleert_tyype = 'alerrt_typpe' annd logg_timee >= TTO_DATTE('20010-088-02',, 'YYYYY-MM--DD') annd logg_timee < TTO_DATTE('20010-088-03',, 'YYYYY-MM--DD') + 1)union (seleect ppeer_iid 对端标识,, oriigin_hhost 源源域名, desst_hosst 目目标域名, aleert_tyype 告警类型,, logg_timee 告告警时间, cauuse 告告警内容, deaal_logg 处理状态,, deaal_staaff 处理人,, deaal_timme 处理时间,, remmark 备备注 froom dccc_ne_llog wherre ressult_ccode == 'DIAAMETERR_UNABBLE_TOO_DELIIVER' annd svccctx_iid likke 'SRR-Timeeout%'' annd deaal_logg = 'ddeal_llog' annd aleert_tyype = 'alerrt_typpe' annd logg_timee >= TTO_DATTE('20010-088-02',, 'YYYYY-MM--DD') annd logg_timee < TTO_DATTE('20010-088-03',, 'YYYYY-MM--DD') + 1)union (seleect peeer_idd 对对端标识, nulll 源域域名, nulll 目标标域名, aleert_tyype 告告警类型, logg_timee 告警警时间, cauuse 告警警内容, deaal_logg 处理理状态, deaal_staaff 处处理人, deaal_timme 处理理时间, remmark 备注注 froom dccc_sys__log wherre acttion == 'dissconneect' annd cauuse liike '接接收消息异常常%' annd deaal_logg = 'ddeal_llog' annd aleert_tyype = 'alerrt_typpe' annd logg_timee >= TTO_DATTE('20010-088-02',, 'YYYYY-MM--DD') annd logg_timee < TTO_DATTE('20010-088-03',, 'YYYYY-MM--DD') + 1)很明显,此处的的UNIONN ALL 完全可以用用OR 来改改造,等价改改写,减少表表扫描次数。
优优化改造后SSQL为:select peer__id 对端标识识, null 源域名,, null 目标域名名, alertt_typee 告警类型型, log_ttime 告警时间间, causee 告警内容容, deal__log 处理状状态, deal__stafff 处理理人, deal__time 处理时间间, remarrk 备注 from dcc_ssys_loog where actioon = ''discoonnectt' and (causse likke '对端端被关闭%'' or ccause like '接收消息息异常%')) and deal__log == 'deaal_logg' and alertt_typee = 'aalert__type'' and log_ttime >>= TO__DATE(('20100-08-002', ''YYYY--MM-DDD') and log_ttime << TO_DDATE(''2010--08-033', 'YYYYY-MMM-DD'') + 11 union select peer__id 对端标识识, oriigin_hhost 源域名, desst_hosst 目目标域名, aleert_tyype 告警类型,, logg_timee 告告警时间, cauuse 告告警内容, deaal_logg 处理状态,, deaal_staaff 处理人,, deaal_timme 处理时间,, remmark 备注 froom dccc_ne_llog wherre (reesult = 0 and ccause like 'parsser失败%%') or ((resullt_codde = ''DIAMEETER_UUNABLEE_TO_DDELIVEER' annd svccctx_iid likke 'SRR-Timeeout%'') annd deaal_logg = 'ddeal_llog' annd aleert_tyype = 'alerrt_typpe' annd logg_timee >= TTO_DATTE('20010-088-02',, 'YYYYY-MM--DD') annd logg_timee < TTO_DATTE('20010-088-03',, 'YYYYY-MM--DD') + 16. 总结和建议通过以上生产中中的优化案例例描述,大家家对前面总结结的优化思路路树模型应该该有了较深。