sunjie501 发表于 2012-5-11 12:54:54

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

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

select decode('0', '0', to_char(rownum), '0' || '.' || rownum) NO, t.*
from (selectdecode(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

oraunix 发表于 2012-5-11 14:05:02

把执行计划贴出来

oraask2 发表于 2012-5-11 14:07:17

请下次提此类问题时提供以下信息
1 程序运行时长
2 各表结构 尤其是索引信息
3 执行计划!

oraask2 发表于 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,

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

sunjie501 发表于 2012-5-11 15:12:02

oraunix 发表于 2012-5-11 14:05 static/image/common/back.gif
把执行计划贴出来

索引为 :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

执行计划为:

sunjie501 发表于 2012-5-11 15:24:10

表A中有字段a1(部门代码)、a2(单位代码)、a3(专业代码)
表B中有b1(名称)、b2(代码)、b3(类型,如部门、单位、专业)
目的是显示表A记录中对应的名称
执行最快的查询语句怎么写

oraask2 发表于 2012-5-11 15:36:51

remote ? 你用DBLINK了吧?

sunjie501 发表于 2012-5-11 16:02:26

甲骨论-晨曦说的对,是用DBLINK了

oraask2 发表于 2012-5-11 16:17:56

目前还不清楚瓶颈在哪里。不过本身DBlink就不快。可以单独访问下dblink的表。
可以将主表与视图xzpm_user_v xuv1,关联,看看效果~

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

shenyan 发表于 2012-5-11 22:26:27

本帖最后由 shenyan 于 2012-5-11 23:33 编辑

把远程表在本地复制一份,看看性能能差多少 ?
页: [1]
查看完整版本: 求助!如何优化下面的SQL语句?