这篇文章主要讲解了“怎么解决数据库LOB字段带来的性能影响”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么解决数据库LOB字段带来的性能影响”吧!

今天开发人员反映一个SQL查询时间大概2-3分钟:

SELECT*FROM(SELECTROWNUMASROWNUMBER__,T.*FROM(SelectT1.CONSULTINGCODEAS"ConsultingCode",T1.CATEGORYAS"Category",T1.CUSCODEAS"CusCode",T1.ORDERCODEAS"OrderCode",T1.WARECODEAS"WareCode",DECRYPTBYKEY(T1.MOBILEPHONE)AS"MobilePhone",DECRYPTBYKEY(T1.EMAILENCRYPT)AS"EmailEncrypt",T1.ASSIGNTIMEAS"AssignTime",T1.REPLIERAS"Replier",T1.REPLYCODEAS"ReplyCode",T1.REPLYDATEAS"ReplyDate",T1.BYWAYAS"ByWay",T1.CREATETIMEAS"CreateTime",T1.EVALUATEAS"Evaluate",T1.EXPIREMANAS"ExpireMan",T1.EXPIREREASONAS"ExpireReason",T1.CONSULTINGTYPEIDAS"ConsultingTypeID",T1.STATUSAS"Status",T1.QUESTIONAS"Question",T1.MAILCONTENTSAS"MailContents",T1.REPLYCONTENTAS"ReplyContent",T1.ENCEMAILAS"EncEmail"Frommbs7_crm.KH_ConsultingT1leftJoinmbs7_crm.KH_CustomerT2onT1.CUSCODE=T2.CUSCODEORDERBYT1.STATUSASC,T1.CREATETIMEASC)TWHERE"CreateTime">=date'2013-9-1'AND"ReplyCode"IN('128')AND"CreateTime"<=timestamp'2013-9-3023:59:59'ANDROWNUM<=10000)TEMPWHEREROWNUMBER__>0

分析:

该语句从执行计划来看,走了时间索引,返回记录是1千多,如果全部查询出来进度很慢(分页的翻页操作很慢),后来发现该语句的性能主要是消耗在:字段"Question",“MailContents”,"Category"和"ReplyContent"上,把这4个字段注释小,查询时间在5s内,后来发现这4个字段为CLOB字段类型,因为CLOB字段这种字段类型的存储方式是比较复杂的,如果该CLOB字段内容超出一定值,会用指针指向另一个SEGMENT,把内容存放在新的SEGMENT; 这样当访问的时候,会出现IO次数增加,从而影响性能,并且CLOB类型有独立的回滚机制,当一致性读的行数较多时,响应时间很慢,而就算存储的内容较小,CLOB本身也会调用系统内部的函数进行匹配和寻址,也是很消耗CPU时间的.

解决方案:

经与开发人员沟通,该表的此四个字段其实实际存储内容远没有超出4000个字节(varchar2的最大长度),当初设计的时候没有考虑精准,于是计划把这些字段类型按照下列方法重新调整:

altertablembs7_crm.KH_Consultingadd(QUESTION2varchar2(2000));updatembs7_crm.KH_ConsultingsetQUESTION2=dbms_lob.substr(QUESTION,4000);altertablembs7_crm.KH_ConsultingdropcolumnQUESTION;altertablembs7_crm.KH_ConsultingrenamecolumnQUESTION2toQUESTION;

修改后,重新查询,在5S内。

感谢各位的阅读,以上就是“怎么解决数据库LOB字段带来的性能影响”的内容了,经过本文的学习后,相信大家对怎么解决数据库LOB字段带来的性能影响这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是亿速云,小编将为大家推送更多相关知识点的文章,欢迎关注!