查看: 2264|回复: 9

关于一条SQL优化问题

[复制链接]
论坛徽章:
0
发表于 2009-12-18 14:05 | 显示全部楼层 |阅读模式
select
AA.ROW_WID,
AA.MEMBER_WID,
AA.SEQ_NUM,
AA.TIER_WID,
MAX(BB.SEQ_NUM) PREVIOUS_SEQ_NUM
from
(
SELECT
--STAGE.APPR_STAT_CD,
--PROCESSING_STAT_CD,
F.ROW_WID,
F.MEMBER_WID,
F.SEQ_NUM,
F.TIER_WID
FROM
WC_LOYMEMTIERCLASSSTATUS_FS STAGE,
WC_LOYMEMTIERCLASSSTATUS_F   F
WHERE
STAGE.APPR_STAT_CD  in(
'Automatic','活动','手动 - 已批准','Manual - Approved')
and  STAGE.PROCESSING_STAT_CD is null
and F.MEMBER_WID<>0
and STAGE.INTEGRATION_ID=F.INTEGRATION_ID
--order by F.MEMBER_WID,F.SEQ_NUM
)AA,

(
select  
--PROCESS.VAL,   
--APPROVE.VAL,
TIERCHANGE.MEMBER_WID,
TIERCHANGE.SEQ_NUM
          from
               W_LOV_D PROCESS ,
               W_LOV_D APPROVE ,
               WC_LOYMEMTIERCLASSSTATUS_F TIERCHANGE
          where  ( TIERCHANGE.APPR_STAT_CD_WID = APPROVE.ROW_WID
          and TIERCHANGE.PROCESSING_STAT_CD_WID = PROCESS.ROW_WID
          and PROCESS.R_TYPE = 'LOY_MEM_TIER_PROCESSING_STATUS' and APPROVE.R_TYPE = 'LOY_MEM_TIER_APPR_STATUS_CD'
          and PROCESS.VAL='Unspecified'and APPROVE.VAL in ('Manual - Approved','活动','Automatic')
          )
          and TIERCHANGE.MEMBER_WID<>0
--order by TIERCHANGE.MEMBER_WID,TIERCHANGE.SEQ_NUM
) BB
where AA.MEMBER_WID=BB.MEMBER_WID and AA.SEQ_NUM>BB.SEQ_NUM
group by AA.ROW_WID,AA.MEMBER_WID,AA.SEQ_NUM,AA.TIER_WID
order by AA.ROW_WID,AA.MEMBER_WID,AA.SEQ_NUM,AA.TIER_WID


单独执行AA,BB里面的内容都很快,2秒左右
整体执行非常慢,40分钟未出结果

执行计划:


何解??

SQL> select count(*) from w_lov_d;

  COUNT(*)
----------
     35600

SQL> select count(*) from wc_loymemtierclassstatus_f;

  COUNT(*)
----------
    511082

SQL> select count(*) from wc_loymemtierclassstatus_fs;

  COUNT(*)
----------
    511082

[ 本帖最后由 明不明白 于 2009-12-18 14:09 编辑 ]
论坛徽章:
27
参与WIN7挑战赛纪念
日期:2009-11-06 16:05:25ITPUB元老
日期:2011-04-23 17:54:35ITPUB十周年纪念徽章
日期:2011-11-01 16:24:04奥迪
日期:2013-08-05 09:30:132015年新春福章
日期:2015-03-02 10:21:23弗兰奇
日期:2016-12-28 13:54:54
发表于 2009-12-18 14:10 | 显示全部楼层
看不到執行計劃。。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-18 14:11 | 显示全部楼层
原帖由 erpmeng 于 2009-12-18 14:10 发表
看不到執行計劃。。


刷新一下

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2009-12-18 14:11 | 显示全部楼层

试试:

select /*+ no_merge(AA) no_merge(BB) */
AA.ROW_WID,
AA.MEMBER_WID,
AA.SEQ_NUM,
AA.TIER_WID,
MAX(BB.SEQ_NUM) PREVIOUS_SEQ_NUM
from
(
SELECT
--STAGE.APPR_STAT_CD,
--PROCESSING_STAT_CD,
F.ROW_WID,
F.MEMBER_WID,
F.SEQ_NUM,
F.TIER_WID
FROM
WC_LOYMEMTIERCLASSSTATUS_FS STAGE,
WC_LOYMEMTIERCLASSSTATUS_F   F
WHERE
STAGE.APPR_STAT_CD  in(
'Automatic','活动','手动 - 已批准','Manual - Approved')
and  STAGE.PROCESSING_STAT_CD is null
and F.MEMBER_WID<>0
and STAGE.INTEGRATION_ID=F.INTEGRATION_ID
--order by F.MEMBER_WID,F.SEQ_NUM
)AA,

(
select  
--PROCESS.VAL,   
--APPROVE.VAL,
TIERCHANGE.MEMBER_WID,
TIERCHANGE.SEQ_NUM
          from
               W_LOV_D PROCESS ,
               W_LOV_D APPROVE ,
               WC_LOYMEMTIERCLASSSTATUS_F TIERCHANGE
          where  ( TIERCHANGE.APPR_STAT_CD_WID = APPROVE.ROW_WID
          and TIERCHANGE.PROCESSING_STAT_CD_WID = PROCESS.ROW_WID
          and PROCESS.R_TYPE = 'LOY_MEM_TIER_PROCESSING_STATUS' and APPROVE.R_TYPE = 'LOY_MEM_TIER_APPR_STATUS_CD'
          and PROCESS.VAL='Unspecified'and APPROVE.VAL in ('Manual - Approved','活动','Automatic')
          )
          and TIERCHANGE.MEMBER_WID<>0
--order by TIERCHANGE.MEMBER_WID,TIERCHANGE.SEQ_NUM
) BB
where AA.MEMBER_WID=BB.MEMBER_WID and AA.SEQ_NUM>BB.SEQ_NUM
group by AA.ROW_WID,AA.MEMBER_WID,AA.SEQ_NUM,AA.TIER_WID
order by AA.ROW_WID,AA.MEMBER_WID,AA.SEQ_NUM,AA.TIER_WID

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-18 14:12 | 显示全部楼层
点击图片,能看到执行计划

使用道具 举报

回复
论坛徽章:
122
现任管理团队成员
日期:2011-05-07 01:45:08
发表于 2009-12-18 14:12 | 显示全部楼层
由执行计划么?

/*+ NO_MERGE(a) NO_MERGE(b) */

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-18 14:20 | 显示全部楼层
原帖由 ZALBB 于 2009-12-18 14:11 发表
select /*+ no_merge(AA) no_merge(BB) */
AA.ROW_WID,
AA.MEMBER_WID,
AA.SEQ_NUM,
AA.TIER_WID,
MAX(BB.SEQ_NUM) PREVIOUS_SEQ_NUM
from
(
SELECT
--STAGE.APPR_STAT_CD,
--PROCESSING_STAT_CD,
F.ROW_WID,
F.MEMBER_WID,
F.SEQ_NUM,
F.TIER_WID
FROM
WC_LOYMEMTIERCLASSSTATUS_FS STAGE,
WC_LOYMEMTIERCLASSSTATUS_F   F
WHERE
STAGE.APPR_STAT_CD  in(
'Automatic','活动','手动 - 已批准','Manual - Approved')
and  STAGE.PROCESSING_STAT_CD is null
and F.MEMBER_WID0
and STAGE.INTEGRATION_ID=F.INTEGRATION_ID
--order by F.MEMBER_WID,F.SEQ_NUM
)AA,

(
select  
--PROCESS.VAL,   
--APPROVE.VAL,
TIERCHANGE.MEMBER_WID,
TIERCHANGE.SEQ_NUM
          from
               W_LOV_D PROCESS ,
               W_LOV_D APPROVE ,
               WC_LOYMEMTIERCLASSSTATUS_F TIERCHANGE
          where  ( TIERCHANGE.APPR_STAT_CD_WID = APPROVE.ROW_WID
          and TIERCHANGE.PROCESSING_STAT_CD_WID = PROCESS.ROW_WID
          and PROCESS.R_TYPE = 'LOY_MEM_TIER_PROCESSING_STATUS' and APPROVE.R_TYPE = 'LOY_MEM_TIER_APPR_STATUS_CD'
          and PROCESS.VAL='Unspecified'and APPROVE.VAL in ('Manual - Approved','活动','Automatic')
          )
          and TIERCHANGE.MEMBER_WID0
--order by TIERCHANGE.MEMBER_WID,TIERCHANGE.SEQ_NUM
) BB
where AA.MEMBER_WID=BB.MEMBER_WID and AA.SEQ_NUM>BB.SEQ_NUM
group by AA.ROW_WID,AA.MEMBER_WID,AA.SEQ_NUM,AA.TIER_WID
order by AA.ROW_WID,AA.MEMBER_WID,AA.SEQ_NUM,AA.TIER_WID



  速度有了大幅度提升,但是仍然需要140s

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-18 14:20 | 显示全部楼层
原帖由 zergduan 于 2009-12-18 14:12 发表
由执行计划么?

/*+ NO_MERGE(a) NO_MERGE(b) */


时间减少到140秒

使用道具 举报

回复
论坛徽章:
311
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
发表于 2009-12-18 14:21 | 显示全部楼层

回复 #7 明不明白 的帖子

作个10046,看看时间耗在哪。
alter session set events '10046 trace name context forever, level 12';
sql
alter session set events '10046 trace name context off';

把TRACE文件贴上来。

使用道具 举报

回复
论坛徽章:
0
 楼主| 发表于 2009-12-18 14:29 | 显示全部楼层
原帖由 ZALBB 于 2009-12-18 14:21 发表
作个10046,看看时间耗在哪。
alter session set events '10046 trace name context forever, level 12';
sql
alter session set events '10046 trace name context off';

把TRACE文件贴上来。



没权限等服务器,抓不到trace

使用道具 举报

回复

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

本版积分规则 发表回复

DTCC2020中国数据库技术大会 限时8.5折

【架构革新 高效可控】2020年6月4日~6日第十一届中国数据库技术大会将在北京隆重召开。

大会设置2大主会场,20+技术专场,将邀请超百位行业专家,重点围绕数据架构、AI与大数据、传统企业数据库实践和国产开源数据库等内容展开分享和探讨,为广大数据领域从业人士提供一场年度盛会和交流平台。

http://dtcc.it168.com


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