楼主: bid01

sql 优化 急

[复制链接]
论坛徽章:
11
处女座
日期:2015-07-24 13:55:37天枰座
日期:2016-02-29 09:07:42天蝎座
日期:2016-01-18 09:17:54白羊座
日期:2015-11-19 21:15:42天蝎座
日期:2015-09-23 22:10:02天枰座
日期:2015-09-18 12:58:30秀才
日期:2015-09-09 10:29:36秀才
日期:2015-07-28 09:11:43天蝎座
日期:2015-07-27 10:03:10射手座
日期:2015-07-25 18:06:25
11#
 楼主| 发表于 2016-10-24 17:41 | 只看该作者
bell6248 发表于 2016-10-24 17:39
LZ, 我#5楼提供的代码有没有测试一下, 看看结果是否符合, 另外看看效率如何

测了 原先跑两分多钟,我看你这个三分钟还没跑完就停了

使用道具 举报

回复
论坛徽章:
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
12#
发表于 2016-10-24 17:44 | 只看该作者
bid01 发表于 2016-10-24 17:41
测了 原先跑两分多钟,我看你这个三分钟还没跑完就停了

3个表的关系是如何的, 你能不能用简单的数据举例3个表的简单测试数据,另外给出最终的结果是如何的, 详细说明一下规则

1人打赏

使用道具 举报

回复
论坛徽章:
11
处女座
日期:2015-07-24 13:55:37天枰座
日期:2016-02-29 09:07:42天蝎座
日期:2016-01-18 09:17:54白羊座
日期:2015-11-19 21:15:42天蝎座
日期:2015-09-23 22:10:02天枰座
日期:2015-09-18 12:58:30秀才
日期:2015-09-09 10:29:36秀才
日期:2015-07-28 09:11:43天蝎座
日期:2015-07-27 10:03:10射手座
日期:2015-07-25 18:06:25
13#
 楼主| 发表于 2016-10-24 17:52 | 只看该作者
bell6248 发表于 2016-10-24 17:44
3个表的关系是如何的, 你能不能用简单的数据举例3个表的简单测试数据,另外给出最终的结果是如何的, 详 ...

EA_FOCS.OF_FUND_INFO A 这个表DEP_CODE_WB 这个是新加的字段 我们现在需要初始化值进去,所以相当于全表的更新
EA_FT2.FT_BANK_ACC_INFO t  从T 表中去取的dep_code bank_acc_id是主键
EA_FOCS.OF_FUND_BANK_ACC B A表和B表关联是为了取得bank_acc_id 去和t表关联,限制rownum=1 是防止一个fund_code 对应出了多个bank_acc_id 我们随便取一个就好

使用道具 举报

回复
论坛徽章:
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
14#
发表于 2016-10-24 19:05 | 只看该作者
bid01 发表于 2016-10-24 17:52
EA_FOCS.OF_FUND_INFO A 这个表DEP_CODE_WB 这个是新加的字段 我们现在需要初始化值进去,所以相当于全表 ...



再测试一下如下的代码的效率如何, 如果还是慢的话, 贴一下执行计划

merge into EA_FOCS.OF_FUND_INFO A
using (select  t.DEP_CODE,
               tt.FUND_CODE
          from EA_FT2.FT_BANK_ACC_INFO t,
               (select A.FUND_CODE,
                       min(A.BANK_ACC_ID) new_BANK_ACC_ID
                  from EA_FOCS.OF_FUND_INFO A,
                       EA_FOCS.OF_FUND_BANK_ACC B
                 where A.FUND_CODE = B.FUND_CODE
                   and B.ACC_TYPE = '02'
                 group by A.FUND_CODE) tt
         where t.BANK_ACC_ID = tt.new_BANK_ACC_ID) tmp
on(A.FUND_CODE = tmp.FUND_CODE)
when matched then
     update set A.DEP_CODE_WB = tmp.DEP_CODE



使用道具 举报

回复
论坛徽章:
6
2014年新春福章
日期:2014-02-18 16:49:31马上有钱
日期:2014-02-18 16:49:31优秀写手
日期:2014-02-21 06:00:13马上有车
日期:2014-10-09 10:14:53技术图书徽章
日期:2017-07-12 17:18:46妮可·罗宾
日期:2017-08-10 12:13:56
15#
发表于 2016-10-24 22:28 | 只看该作者
问题1:T_BANK_ACC_INFO走全表,这个表上是否有索引;能否走索引
问题2:在子查询中加提示/*+ unnest*/

使用道具 举报

回复
论坛徽章:
7
优秀写手
日期:2013-12-18 09:29:08问答徽章
日期:2014-02-07 23:48:392014年新春福章
日期:2014-02-18 16:50:09马上有车
日期:2014-02-18 16:50:09马上有钱
日期:2014-10-26 21:51:11暖羊羊
日期:2015-03-04 14:54:572015年新春福章
日期:2015-03-06 11:59:47
16#
发表于 2016-10-24 23:31 | 只看该作者
弱弱的问一句,用的半联接,为什么还要加ROWNUM = 1??半联接不是可以去重吗?

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
17#
发表于 2016-10-24 23:35 | 只看该作者

你既然着急,就应该按照提问的智慧给出详细的信息,要不然别人只好瞎猜。

下面就是一种猜法:

MERGE INTO EA_FOCS.OF_FUND_INFO A
USING (SELECT DISTINCT
             B.FUND_CODE                                   
             C.DEP_CODE
        FROM EA_FOCS.OF_FUND_BANK_ACC B
            ,EA_FT2.FT_BANK_ACC_INFO C
       WHERE ACC_TYPE = '02'
             AND C. BANK_ACC_ID = B. BANK_ACC_ID                                   
       ) D
ON (A.FUND_CODE = D.FUND_CODE)
WHEN MATCHED THEN  UPDATE SET A.DEP_CODE_WB = D.NEW_DEP_CODE;


你这些表的关系令人一头雾水, ROWNUM = 1的作用似乎是说找到很多一样的记录。如果重复很多,也许就需要先进行过滤再连接。

MERGE INTO EA_FOCS.OF_FUND_INFO A
USING (SELECT DISTINCT ------ 这个也许没有必要,但只有你自己能看到数据,别人只好瞎猜
             B.FUND_CODE                                   
             C.DEP_CODE
        FROM (SELECT DISTINC FUND_CODE, BANK_ACC_ID FROM EA_FOCS.OF_FUND_BANK_ACC
               WHERE FUND_CODE IN (SELECT FUND_CODE FROM EA_FOCS.OF_FUND_INFO) ------ 加上这个也许有用,但只有你自己能看到数据,别人只好瞎猜
             ) B
            ,EA_FT2.FT_BANK_ACC_INFO C
       WHERE ACC_TYPE = '02'
             AND C. BANK_ACC_ID = B. BANK_ACC_ID                                   
       ) D
ON (A.FUND_CODE = D.FUND_CODE)
WHEN MATCHED THEN  UPDATE SET A.DEP_CODE_WB = D.NEW_DEP_CODE;

1人打赏

使用道具 举报

回复
论坛徽章:
520
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
18#
发表于 2016-10-24 23:38 | 只看该作者
skiiwujinhua 发表于 2016-10-24 23:31
弱弱的问一句,用的半联接,为什么还要加ROWNUM = 1??半联接不是可以去重吗?

他里面还有另外一层 IN, 如果是在EXISTS那层是没必要加上ROWNUM=1的。

使用道具 举报

回复
论坛徽章:
11
处女座
日期:2015-07-24 13:55:37天枰座
日期:2016-02-29 09:07:42天蝎座
日期:2016-01-18 09:17:54白羊座
日期:2015-11-19 21:15:42天蝎座
日期:2015-09-23 22:10:02天枰座
日期:2015-09-18 12:58:30秀才
日期:2015-09-09 10:29:36秀才
日期:2015-07-28 09:11:43天蝎座
日期:2015-07-27 10:03:10射手座
日期:2015-07-25 18:06:25
19#
 楼主| 发表于 2016-10-25 15:53 | 只看该作者
bell6248 发表于 2016-10-24 19:05
再测试一下如下的代码的效率如何, 如果还是慢的话, 贴一下执行计划

merge into EA_FOCS.OF_FUND ...

这个速度一秒就出来了!!
计划如下

--------------------------------------------------------------------------------------------
| Id   | Operation                    | Name             | Rows | Bytes  | Cost | Time     |
--------------------------------------------------------------------------------------------
|    0 | MERGE STATEMENT              |                  | 3211 |  32110 |   76 | 00:00:02 |
|    1 |   MERGE                      | OF_FUND_INFO     |      |        |      |          |
|    2 |    VIEW                      |                  |      |        |      |          |
|  * 3 |     HASH JOIN                |                  | 3211 | 475228 |   76 | 00:00:02 |
|  * 4 |      HASH JOIN               |                  | 3211 | 128440 |   61 | 00:00:01 |
|    5 |       VIEW                   |                  | 3211 |  96330 |   12 | 00:00:01 |
|    6 |        SORT GROUP BY         |                  | 3211 |  86697 |   12 | 00:00:01 |
|    7 |         NESTED LOOPS         |                  | 3211 |  86697 |   12 | 00:00:01 |
|    8 |          VIEW                | VW_GBC_12        | 3211 |  64220 |   11 | 00:00:01 |
|    9 |           SORT GROUP BY      |                  | 3211 |  48165 |   11 | 00:00:01 |
| * 10 |            TABLE ACCESS FULL | OF_FUND_BANK_ACC | 4144 |  62160 |   10 | 00:00:01 |
| * 11 |          INDEX UNIQUE SCAN   | PK_OF_FUND_INFO  |    1 |      7 |    0 | 00:00:01 |
|   12 |       TABLE ACCESS FULL      | FT_BANK_ACC_INFO | 7995 |  79950 |   49 | 00:00:01 |
|   13 |      TABLE ACCESS FULL       | OF_FUND_INFO     | 3487 | 376596 |   15 | 00:00:01 |
--------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
------------------------------------------
* 3 - access("A"."FUND_CODE"="TT"."FUND_CODE")
* 4 - access("T"."BANK_ACC_ID"="TT"."NEW_BANK_ACC_ID")
* 10 - filter("B"."ACC_TYPE"='02')
* 11 - access("A"."FUND_CODE"="ITEM_1")

使用道具 举报

回复
论坛徽章:
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
20#
发表于 2016-10-25 16:35 | 只看该作者
bid01 发表于 2016-10-25 15:53
这个速度一秒就出来了!!
计划如下

那很好啊,  有很多语句如果没有理解业务, 要调优非常难, 因为语句本身就写的非常烂

使用道具 举报

回复

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

本版积分规则 发表回复

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