查看: 3056|回复: 6

[PL/SQL] 求助:insert脚本性能优化

[复制链接]
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
发表于 2011-1-23 15:05 | 显示全部楼层 |阅读模式
脚本如下,目前尚未做索引,表都在千万级,请问该如何优化,谢谢。
不知道left join 该如何优化。
insert /*+ APPEND NOLOGGING PARALLEL */ into tp_m_balance_finan_extension(
            datecode,
            faoperationid,
            foperationid,
            oproccurdate,
            financecode,
            loancardcode,
            --fourclasscode,
            fiveclasscode,
            financingkindcode,
            changedate,
            overdue,
            currencykindcode,
            balance,
            balancetousd,
            balancetormb
            )
        select
            v_bmonth,
            f.faoperationid,
            f.foperationid,
            f.oproccurdate,
            f.financecode,
            f.loancardcode,
            --f.fourclasscode,
            f.fiveclasscode,
            f.financingkindcode,
            f.changedate,
            case
                when v_emonth - h.terminatedate <  0   then '0'
                when v_emonth - h.terminatedate <= 30  then '1'
                when v_emonth - h.terminatedate <= 90  then '2'
                when v_emonth - h.terminatedate <= 180 then '3'
                when v_emonth - h.terminatedate <= 360 then '4'
                else '5'
            end case,
            f.currencykindcode,
            decode(f.currencykindcode, 'CNY', f.financingbalance, 0),
            decode(f.currencykindcode, 'CNY', 0, f.financingbalance * g.exrate),
            decode(f.currencykindcode, 'CNY', f.financingbalance, f.financingbalance * g.exrate * v_usdtormb_rate)
        FROM (
            SELECT
                e.*,
                ROW_NUMBER() OVER(PARTITION BY e.foperationid ORDER BY e.oproccurdate DESC) AS rowno
            FROM (
                SELECT
                    c.faoperationid,
                    c.foperationid,
                    c.financingbalance,
                    c.financingsum,
                    c.financecode,
                    --c.fourclasscode,
                    c.financingkindcode,
                    c.fiveclasscode,
                    c.currencykindcode,
                    c.loancardcode,
                    DECODE(c.changedate,NULL,
                           CASE
                             WHEN c.financingbalance <> c.financingsum THEN c.oproccurdate
                             ELSE d.providedate
                           END,
                           c.changedate) changedate,
                    c.oproccurdate,
                    c.terminatedate
                FROM (
                    SELECT /*+ use_hash(a b) parallel(a,4)*/
                        a.faoperationid,
                        a.foperationid,
                        a.financingbalance,
                        a.currencykindcode,
                        a.financecode,
                        a.loancardcode,
                        b.payoffdate changedate,
                        a.oproccurdate,
                        a.financingsum,
                        --a.fourclasscode,
                        a.fiveclasscode,
                        a.financingkindcode,
                        a.terminatedate
                    FROM tb_financingoperation a
                    LEFT JOIN tb_financingpayoff b
                    ON
                        a.foperationid = b.foperationid AND
                        a.oproccurdate = b.oproccurdate
                    WHERE a.validityflag <= 1) c
                    LEFT JOIN tb_financingoperation d
                    ON
                        c.foperationid = d.foperationid) e
                    WHERE e.changedate < v_emonth) f,
                    tp_currency_rate g ,(select foperationid,terminatedate from (select h.foperationid,h.terminatedate, row_number() over(partition by foperationid order by h.terminatedate desc) as num from tp_m_extension_financing h)h where h.num=1) h--取时间最后一条
                WHERE
                    f.foperationid = h.foperationid and ---- 20101110,展期
                    f.currencykindcode = g.currencykindcode and
                    f.financingbalance > 0 and
                    rowno = 1;
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
 楼主| 发表于 2011-1-23 18:04 | 显示全部楼层
tb_financingoperation  9000W 和 tb_financingpayoff 4000W,不知道加索引是否有用?

使用道具 举报

回复
论坛徽章:
25
生肖徽章2007版:虎
日期:2008-12-30 12:36:432011新春纪念徽章
日期:2011-03-17 20:18:272011新春纪念徽章
日期:2011-03-29 00:01:40ITPUB十周年纪念徽章
日期:2011-11-01 16:23:26紫蛋头
日期:2012-05-20 17:44:452014年新春福章
日期:2014-02-18 16:42:02马上有房
日期:2014-02-18 16:42:02马上有车
日期:2014-02-24 20:18:47慢羊羊
日期:2015-03-04 14:51:352015年新春福章
日期:2015-03-06 11:57:31
发表于 2011-1-23 19:17 | 显示全部楼层
1.建议插入时先去掉目标表的主键,外键,索引,在insert into ,完成之后在建上主键,外键,索引。
2.直接在insert 语句加NOLOGGING,好像不能减少undo量,要先 将表alter table nologging,才能减少undo,你可以测试一下,看我的说法对不。

使用道具 举报

回复
论坛徽章:
13
2010广州亚运会纪念徽章:轮滑
日期:2010-09-03 12:44:53马上有房
日期:2014-04-04 13:51:34马上加薪
日期:2014-04-04 13:35:40优秀写手
日期:2014-03-14 06:00:13夏利
日期:2013-08-05 18:32:18复活蛋
日期:2013-06-25 17:22:592013年新春福章
日期:2013-02-25 14:51:24蛋疼蛋
日期:2013-01-08 18:08:502011新春纪念徽章
日期:2011-02-18 11:43:33生肖徽章2007版:兔
日期:2011-01-20 12:58:49
发表于 2011-1-23 21:14 | 显示全部楼层
mark

使用道具 举报

回复
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
 楼主| 发表于 2011-1-23 22:55 | 显示全部楼层
确实需要nologging先

使用道具 举报

回复
论坛徽章:
3
2010新春纪念徽章
日期:2010-01-04 08:33:08数据库板块每日发贴之星
日期:2011-01-24 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04
 楼主| 发表于 2011-1-23 22:56 | 显示全部楼层
前人写的代码,不知道为啥要做2次left join

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
发表于 2011-1-24 09:05 | 显示全部楼层
单独select快不快?

使用道具 举报

回复

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

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,7折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时七折期:2019年8月31日前


----------------------------------------

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