- 最后登录
- 2015-11-7
- 在线时间
- 10 小时
- 威望
- 0
- 金钱
- 61
- 注册时间
- 2013-8-29
- 阅读权限
- 10
- 帖子
- 13
- 精华
- 0
- 积分
- 0
- UID
- 1210
|
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;
对于这种情况该如何解释?有没有相对简单的办法来使得查询使用索引? |
|