Oracle数据库数据恢复、性能优化

找回密码
注册
搜索
热搜: 活动 交友 discuz
发新帖

0

积分

1

好友

4

主题
1#
发表于 2015-11-7 21:41:27 | 查看: 3241| 回复: 0
本帖最后由 zl293 于 2015-11-7 21:45 编辑

最近有个erp软件性能不佳,通过awr定位了某个查询语句消耗大量的资源,语句如下:
select boeheaders0_.RM                   as RM152_,
       boeheaders0_.LAST_UPDATE_DATE     as LAST2_152_,
       boeheaders0_.LAST_UPDATED_BY      as LAST3_152_,
       boeheaders0_.CREATION_DATE        as CREATION4_152_,
       boeheaders0_.CREATED_BY           as CREATED5_152_,
       boeheaders0_.LAST_UPDATED_BY_NAME as LAST6_152_,
       boeheaders0_.POSITION_NAME        as POSITION7_152_,
       boeheaders0_.LAST_UPDATE_LOGIN    as LAST8_152_,
       boeheaders0_.BOE_HEADER_ID        as BOE9_152_,
       boeheaders0_.BOE_NUM              as BOE10_152_,
       boeheaders0_.BOE_TYPE_ID          as BOE11_152_,
       boeheaders0_.BOE_TYPE_CODE        as BOE12_152_,
       boeheaders0_.BOE_TYPE_NAME        as BOE13_152_,
       boeheaders0_.BOE_STATUS           as BOE14_152_,
       boeheaders0_.ENABLED_FLAG         as ENABLED15_152_,
       boeheaders0_.version_num          as version16_152_,
       boeheaders0_.TENANT_ID            as TENANT17_152_
  from ETC.BOE_HEADERS_BAK_QRY_V boeheaders0_
where 1 = 1
   and boeheaders0_.ENABLED_FLAG = 'Y'
   and boeheaders0_.BOE_HEADER_ID = 20016981
order by boeheaders0_.version_num;
该语句在BOE_HEADER_ID字段上没有走其基表的主键索引sie_boe_headers_bak_pk,而是选择的全表扫描

重新定位到视图BOE_HEADERS_BAK_QRY_V后的原始语句为:
create or replace view boe_headers_bak_qry_v as
select
       ROWNUM rm,
      bh.last_update_date,     --最后更新日期
      bh.last_updated_by,      --最后更新者
      bh.creation_date,        --创建日期
      bh.created_by,           --创建者
      (select fetl.employee_name from fbp_employees_tl fetl where fetl.employee_id = bh.last_updated_by
        and fetl.language = USERENV('LANG')) last_updated_by_name, --最后更新者姓名
       '' position_name,      -- 职务名称
      bh.last_update_login,    --最后修改时的登录ID
      bh.boe_header_id,        --单据ID
      bh.boe_num,              --单据编号
      bh.boe_type_id,          --单据类型ID
      sbt.boe_type_code,       --单据类型code
      (select lv.meaning from fbp_lookup_values lv WHERE  lv.lookup_code = sbt.boe_type_code
          and lv.language = userenv('LANG')
          and lv.enabled_flag ='Y') BOE_TYPE_NAME,      --单据类型名称
      bh.boe_status,     --单据状态
      bh.enabled_flag,          --有效标识
      bh.version_num,           --版本
      bh.tenant_id
from sie_boe_headers_bak bh,
     SIE_BOE_TYPES sbt
where bh.boe_type_id = sbt.boe_type_id(+);

然后我直接在该查询语句中加入查询条件后发现,语句能正常的使用索引主键sie_boe_headers_bak_pk。我开始怀疑是不是因为视图形成了结果集,在该结果集上进行过滤查询就无法使用基表的索引了。同时我开启了10053事件,专门针对视图查询和直接查询进行分析,情况见附件。
select
       ROWNUM rm,
      bh.last_update_date,     --最后更新日期
      bh.last_updated_by,      --最后更新者
      bh.creation_date,        --创建日期
      bh.created_by,           --创建者
      (select fetl.employee_name from fbp_employees_tl fetl where fetl.employee_id = bh.last_updated_by
        and fetl.language = USERENV('LANG')) last_updated_by_name, --最后更新者姓名
       '' position_name,      -- 职务名称
      bh.last_update_login,    --最后修改时的登录ID
      bh.boe_header_id,        --单据ID
      bh.boe_num,              --单据编号
      bh.boe_type_id,          --单据类型ID
      sbt.boe_type_code,       --单据类型code
      (select lv.meaning from fbp_lookup_values lv WHERE  lv.lookup_code = sbt.boe_type_code
          and lv.language = userenv('LANG')
          and lv.enabled_flag ='Y') BOE_TYPE_NAME,      --单据类型名称
      bh.boe_status,     --单据状态
      bh.enabled_flag,          --有效标识
      bh.version_num,           --版本
      bh.tenant_id
from sie_boe_headers_bak bh,
     SIE_BOE_TYPES sbt
where bh.boe_type_id = sbt.boe_type_id(+))
where  ENABLED_FLAG = 'Y'
   and BOE_HEADER_ID = 20016981
order by version_num;

对于这种情况该如何解释?有没有相对简单的办法来使得查询使用索引?

eas_ora_3476.rar

13.32 KB, 下载次数: 1651

10053事件

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

QQ|手机版|Archiver|Oracle数据库数据恢复、性能优化

GMT+8, 2024-12-20 20:19 , Processed in 0.049039 second(s), 24 queries .

Powered by Discuz! X2.5

© 2001-2012 Comsenz Inc.

回顶部
TEL/電話+86 13764045638
Email service@parnassusdata.com
QQ 47079569