求助!如何优化下面的SQL语句?

谁能给优化一下下面的语句,不胜感激,特别是xzpm_user_v表用了3个别名

select decode('0', '0', to_char(rownum), '0' || '.' || rownum) NO, t.*
  from (select  decode(substr(n.check_point_type, -1, 1),
                      '3',
                      'THREE',
                      '2',
                      'TWO') CHECK_LEVEL,
               n.PLAN_END_PEOPLE,
               n.ACTUAL_START_PEOPLE,
               xuv1.USER_NAME PLAN_START_PEOPLE_NAME,
               xuv2.USER_NAME PLAN_END_PEOPLE_NAME,
               xuv3.USER_NAME ACTUAL_START_PEOPLE_NAME,
               nvl(n.parent_struct_id, 0) parent_struct_id,
               p.property_name CHECK_LEVEL_NAME,
               r.property_name CHECK_type_name,
               s.property_name ITEM_TYPE_NAME,
               decode(n.attribute5,
                      null,
                      xuv1.USER_NAME || '  ' ||
                      to_char(n.PLAN_START_TIME, 'yyyy-mm-dd'),
                      '作废' || n.attribute5 || '  ' || n.attribute7) SPLAN_START_TIME,
               decode(n.attribute5,
                      null,
                      xuv2.USER_NAME || '  ' ||
                      to_char(n.PLAN_END_TIME, 'yyyy-mm-dd'),
                      '作废' || n.attribute5 || '  ' || n.attribute7) SPLAN_END_TIME,
               decode(n.attribute5,
                      null,
                      xuv3.USER_NAME || '  ' ||
                      to_char(n.ACTUAL_START_TIME, 'yyyy-mm-dd'),
                      '作废' || n.attribute5 || '  ' || n.attribute7) SACTUAL_START_TIME,
               to_char(n.ACTUAL_END_TIME, 'yyyy-mm-dd') SACTUAL_END_TIME,
               M.PROPERTY_NAME MAJOR_NAME
          from xzpm_zds_opcheck_main n,
               (select *
                  from xzpm_property_instance
                 where property_type_code = 'CPLEVEL') p,
               (select *
                  from xzpm_property_instance
                 where property_type_code = 'CPTYPE') r,
               (select *
                  from xzpm_property_instance
                 where property_type_code = 'ITEMTYPE') S,
               (select *
                  from xzpm_property_instance
                 where property_type_code = 'EQUSYSTEM') M,
               xzpm_user_v xuv1,
               xzpm_user_v xuv2,
               xzpm_user_v xuv3
         where     nvl(n.parent_struct_id, 0) = 0
           and decode(substr(n.check_point_type, -1, 1),
                      '3',
                      'THREE',
                      '2',
                      'TWO') = p.property_scode(+)
           and upper(substr(n.check_point_type, 1, 1)) = r.property_scode(+)
           and n.ITEM_TYPE = S.property_scode(+)
           AND N.CHECK_MAJOR = M.PROPERTY_SCODE(+)
           and N.PLAN_START_PEOPLE = xuv1.USER_CODE(+)
           and N.PLAN_END_PEOPLE = xuv2.USER_CODE(+)
           and N.ACTUAL_START_PEOPLE = xuv3.USER_CODE(+)
         order by sort_num) t
标签: 暂无标签
sunjie501

写了  篇文章,拥有财富 ,被  人关注

转播转播 分享分享 分享淘帖
回复

使用道具

P6 | 发表于 2012-5-11 14:05:02
把执行计划贴出来
回复

使用道具

P5 | 发表于 2012-5-11 14:07:17
请下次提此类问题时提供以下信息
1 程序运行时长
2 各表结构 尤其是索引信息
3 执行计划!

回复

使用道具

P5 | 发表于 2012-5-11 14:22:17
针对目前SQL文本 我提供以下优化思路
1 查看xzpm_user_v 表xzpm_user_v 列USER_CODE 是否有索引 
2 查看关联方式,如关联方式不佳可以使用标量子查询 select (select )替代
3  (select *
                  from xzpm_property_instance
                 where property_type_code = 'CPLEVEL') p,
               (select *
                  from xzpm_property_instance
                 where property_type_code = 'CPTYPE') r,
               (select *
                  from xzpm_property_instance
                 where property_type_code = 'ITEMTYPE') S,
               (select *
                  from xzpm_property_instance
                 where property_type_code = 'EQUSYSTEM') M,

这段程序需要了解业务需要,有一定的合并可能行~
回复

使用道具

游客 | 发表于 2012-5-11 15:12:02
oraunix 发表于 2012-5-11 14:05
把执行计划贴出来

索引为 :UK_XZPM_CHECK_MAIN unique (STRUCT_ID, PLAN_ZX_CODE)、PK_XZPM_CHECK_MAIN primary key (ID)

XZPM_CHECK_MAIN 为主票
xzpm_property_instance为属性表
xzpm_user_v为人员表

xzpm_property_instance表中存着property_name、property_code、CHECK_type_name,对于不同的CHECK_type_name对应的property_code值在XZPM_CHECK_MAIN 主票中存于不同的字段,对主票查询结果要显示property_name

执行计划为:
执行计划.JPG
回复

使用道具

游客 | 发表于 2012-5-11 15:24:10
表A中有字段a1(部门代码)、a2(单位代码)、a3(专业代码)
表B中有b1(名称)、b2(代码)、b3(类型,如部门、单位、专业)
目的是显示表A记录中对应的名称
执行最快的查询语句怎么写
回复

使用道具

P5 | 发表于 2012-5-11 15:36:51
remote ? 你用DBLINK了吧?
回复

使用道具

游客 | 发表于 2012-5-11 16:02:26
甲骨论-晨曦说的对,是用DBLINK了
回复

使用道具

P5 | 发表于 2012-5-11 16:17:56
目前还不清楚瓶颈在哪里。不过本身DBlink就不快。可以单独访问下dblink的表。
可以将主表与视图xzpm_user_v xuv1,关联,看看效果~

目前执行计划
1 涉及Dblink
2 table access full 操作较多。
回复

使用道具

P4 | 发表于 2012-5-11 22:26:27
本帖最后由 shenyan 于 2012-5-11 23:33 编辑

把远程表在本地复制一份,看看性能能差多少 ?
回复

使用道具

您需要登录后才可以回帖 登录 | 加入社区

本版积分规则

意见
反馈