- 最后登录
- 2016-11-23
- 在线时间
- 34 小时
- 威望
- 11
- 金钱
- 258
- 注册时间
- 2012-7-17
- 阅读权限
- 10
- 帖子
- 64
- 精华
- 0
- 积分
- 11
- UID
- 620
|
1#
发表于 2012-12-10 23:21:39
|
查看: 3642 |
回复: 2
本帖最后由 wengtf 于 2012-12-10 23:47 编辑
附件中sql 个人觉得非常奇怪。
以下是个人的想法,请刘大指正:
1、该sql 的执行计划第46行, MICS_ENR_GRP_MEM_MAP 表执行全表扫描,表的 POL_INSURED_GRP_SEQ_ID列是有索引的,该表大概20万条数据
2、Statistics 统计中 存在大量的consistent gets ,这是很不正常的,究其原因,在该sql语句执行钱,该语句中的各表存在其他事务(会话)对这几个表存在大量的操作(dml操作),由于oracle 为了保证事务的一致性, 执行计划在评估前,会从undo buffer 的内存中读取。为什么会造成如此多得一致性读,不解!
3、执行计划的后,都是filter 后再 去access,这是否会使access 次数成次幂增长?
是否可以将如下代码:
- where
- TPA_USER_CONTACTS.CONTACT_SEQ_ID = 1670 AND
- TPA_USER_CONTACTS.USER_GENERAL_TYPE_ID IN ('COR', 'INS', 'EMP', 'TTK') AND
- (USER_GENERAL_TYPE_ID != 'COR' OR (TPA_USER_CONTACTS.USER_GENERAL_TYPE_ID = 'COR' AND TPA_USER_CONTACTS.GROUP_REG_SEQ_ID = DATA.GROUP_REG_SEQ_ID)) AND
- (USER_GENERAL_TYPE_ID != 'EMP' OR (TPA_USER_CONTACTS.USER_GENERAL_TYPE_ID = 'EMP' AND MEMMAP.POL_INSURED_GRP_SEQ_ID IN
- (SELECT MEMMAP.POL_INSURED_GRP_SEQ_ID
- FROM MICS_ENR_POL_MEMBER,
- MICS_ENR_GRP_MEM_MAP MEMMAP,
- corp_user_mem_map
- WHERE MICS_ENR_POL_MEMBER.deleted_yn = 'N'
- AND MICS_ENR_POL_MEMBER.tpa_enrollment_id = corp_user_mem_map.tpa_enrollment_id
- AND MEMMAP.MEMBER_SEQ_ID = MICS_ENR_POL_MEMBER.MEMBER_SEQ_ID
- AND tpa_user_contacts.CONTACT_SEQ_ID = corp_user_mem_map.CONTACT_SEQ_ID
- ))) AND
- (USER_GENERAL_TYPE_ID != 'INS' OR (TPA_USER_CONTACTS.USER_GENERAL_TYPE_ID = 'INS' AND DATA.INS_SEQ_ID IN
- (SELECT TPA_INS_INFO.INS_SEQ_ID
- FROM TPA_INS_INFO START WITH TPA_INS_INFO.INS_SEQ_ID = TPA_USER_CONTACTS.INS_SEQ_ID CONNECT BY PRIOR TPA_INS_INFO.INS_SEQ_ID = TPA_INS_INFO.INS_PARENT_SEQ_ID)
- 50 ))
- 51 ;
复制代码 中 in 更改为exists,or 改为union all来连接,是否建议使用with as 来保存join部分的sql语句? |
-
-
SQL优化.txt
17.64 KB, 阅读权限: 200, 下载次数: 3
sql语句及执行计划
|