12
返回列表 发新帖
楼主: wdd563634548

orcal存储过程优化

[复制链接]
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
11#
发表于 2016-10-20 11:57 | 只看该作者

先不说别的, 简单的看了一下


代码中有很多地方是可以合并的, 能用一句SQL得到的所以结果, 不要分开用, 比如:

例如在函数MAIN_CONTRACT_NO中有如下的2个语句为:

select contest
  into V_CONTEST
  from ti_loancon
where trim(LNCONTCODE) = V_MAINCONTNO
   and trim(DEPTCODE) = trim(ocw.brca_co);
      
select DEPTCODE
  into V_MAINDEPTCODE
  from ti_loancon
where trim(LNCONTCODE) = V_MAINCONTNO
   and trim(DEPTCODE) = trim(ocw.brca_co);
   
万全可以合并为如下的:
select contest,
       DEPTCODE
  into ti_loancon,
       V_MAINDEPTCODE
  from ti_loancon
where trim(LNCONTCODE) = V_MAINCONTNO
   and trim(DEPTCODE) = trim(ocw.brca_co);


还有fn_split完全可以和使用的的语句进行整体SQL语句合并, 也就是在定义游标的那个SQL语句时一次性把下面的功能进行整合, 当然这样就要在理解业务的基础上, 对目前的stored procedure进行语句整合, 单独的SQL语句写的太多, 本身就是由性能问题, 慢慢消化把, 把业务理解清楚是最重要的

类似如下的
select count(1)
  into v_md
  from Ods_Cub_A17
where (trim(csnm) || '.000' || trim(line_code)) = trim(ocx.line_code)
    or (trim(csnm) || '.000' || trim(line_code)) in(select to_char(strvalue) as Value from table(MBT.fn_split(REC_LINE_REF, ',')));


1人打赏

使用道具 举报

回复
论坛徽章:
0
12#
 楼主| 发表于 2016-10-20 17:18 | 只看该作者
bell6248 发表于 2016-10-20 11:57
先不说别的, 简单的看了一下

谢谢,能具体再指出下该怎么优化么

使用道具 举报

回复
论坛徽章:
6
咸鸭蛋
日期:2013-01-11 10:30:55优秀写手
日期:2013-12-19 06:00:122014年新春福章
日期:2014-02-18 16:47:53马上加薪
日期:2014-02-18 16:47:53慢羊羊
日期:2015-03-04 14:53:332015年新春福章
日期:2015-03-06 11:58:39
13#
发表于 2016-10-20 17:52 | 只看该作者
先用时间打印看一下慢在哪一步,然后指对特定SQL或者特定语句段优化,如此大的一个过程,看得也是眼花

使用道具 举报

回复
论坛徽章:
2
乌索普
日期:2016-11-28 11:16:45秀才
日期:2016-12-21 16:55:07
14#
发表于 2016-10-21 15:07 | 只看该作者
首先很佩服写这个过程的牛人,看到第一个loop里套cursor再套loop,这就应该很慢了,只是感觉,没用过不敢随意说。
建议就是从最里层的sql看执行计划,看哪个sql慢。
至于楼上有说in与exists的,这两个的区别应该是内层表与外层表谁大小,看情况使用in与exists。
又往下看了看函数,里面还有loop套loop...太刺激了,如果是业务必须,那智能是从sql入手了,别的不会,等大佬们解决吧。

使用道具 举报

回复
论坛徽章:
2
乌索普
日期:2016-11-28 11:16:45秀才
日期:2016-12-21 16:55:07
15#
发表于 2016-10-21 15:16 | 只看该作者
本帖最后由 jrtongxin5266 于 2016-10-21 15:17 编辑

看一部分写一部分
select count(1)
                  into v_loan_1
                  from ti_loancon
                 where trim(LNCONTCODE) = V_MAINCONTNO
                   and trim(DEPTCODE) = trim(ocw.brca_co);
                select count(1)
                  into v_fin
                  from ti_finprot
                 where trim(fprotno) = V_MAINCONTNO
                   and trim(DEPTCODE) = trim(ocw.brca_co);
上面这两个sql赋值的两个值,第二个应该放在第一个if下面,这不知道会不会有什么影响。大致的意思就是什么时候用,什么时候取。

使用道具 举报

回复
论坛徽章:
15
秀才
日期:2017-01-20 11:00:36秀才
日期:2016-11-25 16:52:36蜘蛛蛋
日期:2011-05-27 16:25:49托尼托尼·乔巴
日期:2018-05-09 11:35:22ITPUB15周年纪念
日期:2016-10-13 13:15:34奥运会纪念徽章:皮划艇激流回旋
日期:2016-09-21 17:33:26奥运会纪念徽章:跳水
日期:2016-09-13 10:47:52优秀写手
日期:2014-08-14 06:00:13咸鸭蛋
日期:2012-12-05 15:47:46ITPUB 11周年纪念徽章
日期:2012-10-09 18:08:15
16#
发表于 2016-10-21 16:30 | 只看该作者
看到  
过程中的一些表是  ODS 开头的, 一般  ODS 是有生命周期的全量表, 按照业务要求做分区保留的,  这些表通常是没有索引的。   
不懂业务,不清楚过程要干什么。

使用道具 举报

回复
论坛徽章:
0
17#
 楼主| 发表于 2016-10-21 16:44 | 只看该作者
jrtongxin5266 发表于 2016-10-21 15:07
首先很佩服写这个过程的牛人,看到第一个loop里套cursor再套loop,这就应该很慢了,只是感觉,没用过不敢随 ...

额。。。我写的,写存储过程的时间不久,优化什么的不懂

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表