zl293 发表于 2015-11-7 21:41:27

使用视图后无法走索引的问题

本帖最后由 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;

对于这种情况该如何解释?有没有相对简单的办法来使得查询使用索引?
页: [1]
查看完整版本: 使用视图后无法走索引的问题