a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 49|回复: 0

[其他] Oracle认证:分析查询计划错误的原因

[复制链接]
发表于 2012-8-4 13:41:06 | 显示全部楼层 |阅读模式
周一收到生成撑收支员的陈述,系统上一个功课启动后很长时刻没有完成,其执行时刻远弘远于上周的正常执行时刻。接到陈述后,首先搜检了系统,不存在锁队列的问题。然后发芽V$SESSION_LONGOPS,当即发现下面的语灸正在进行长操作:- o/ a+ c; J( Z" ]+ }8 |  Q- B
  SELECT *
4 D$ w1 z% }) }9 s6 C1 ?* G- P, ~  FROM CR_BKG_INTMD_SHMT_PARTITION BKGSHMTRESULT+ j& q) \; j; e7 m4 d
  WHERE BKGSHMTRESULT.BKG_CFM_ID = :B1
1 R% A0 }1 G0 [' W" z3 O4 n0 D- p  AND BKGSHMTRESULT.COMP_ID = :B2* n5 R; Y5 F: V) @- o( t
  年夜V$SESSION_LONGOPS看,它正在对表CR_BKG_INTMD_SHMT_PARTITION做FULL TABLE SCAN。而表CR_BKG_INTMD_SHMT_PARTITION是一张很是年夜的分区表,是我们之前做的优化成立的分区表(该案例我有在《11g新特征 ——加倍矫捷的分区策略》中提到,Partition Key是COMP_ID,分区策略是每个VIP用户一个分区,所有非VIP用户在DEFAULT分区)。- m$ E( T) E! {. Y, w4 b+ F; ^. b6 i
  这条语句的发芽前提很简单,且在(BKG_CFM_ID,COMP_ID)上有建一个Global Index。经由过程直接对其解析发芽打算,发现它能正确射中索引:
" f7 z$ d# s# A  k  d  SQL> EXPLAIN PLAN FOR
% g0 f  q/ M2 h) }; a2 i1 P4 \  2 SELECT *2 C, }2 X. O: m7 K+ J5 t# W, X. M
  3 FROM CR_BKG_INTMD_SHMT_PARTITION BKGSHMTRESULT
& A0 A# r% V& O  4 WHERE BKGSHMTRESULT.BKG_CFM_ID = :B1
- A; H% R8 p8 D  5 AND BKGSHMTRESULT.COMP_ID = :B2;
- U& j" q& H' \  Explained.0 D2 q: g' l5 f2 s
  SQL> select * from table(dbms_xplan.display());/ P1 ?! s3 e6 i; J' n6 I6 Z2 [
  PLAN_TABLE_OUTPUT. o( V8 S2 p: q2 h2 l
  -----------------------------------------------------------------------------------------------------------------------------------
5 `4 X& @5 n. e1 I0 J/ C* y  Plan hash value: 772272200; \3 j! T/ H; r6 Q4 g: K' i+ o5 W7 p
  -----------------------------------------------------------------------------------------------------------------------------------
( W; `  v4 _& |5 v2 {) K# p& T  | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Pstart| Pstop |/ A& Y* s; t% W. L2 W9 Q7 Y
  -----------------------------------------------------------------------------------------------------------------------------------1 O' j. Z. S8 x4 o5 I* C
  | 0 | SELECT STATEMENT | | 1 | 880 | 5 (0)| 00:00:01 | | |
# [6 |, ~5 E# V0 W+ {  | 1 | TABLE ACCESS BY GLOBAL INDEX ROWID| CR_BKG_INTMD_SHMT_PARTITION | 1 | 880 | 5 (0)| 00:00:01 | ROWID | ROWID |! Z% n% A- ], r  n
  |* 2 | INDEX RANGE SCAN | CR_BKG_INTMD_PARTITION_IDX03 | 1 | | 4 (0)| 00:00:01 | | |$ O& j. V) ~3 T# T2 E0 Z" U
  -----------------------------------------------------------------------------------------------------------------------------------1 M6 K8 r5 O2 D% h+ i5 X
  Predicate Information (identified by operation id):
! g* s0 _$ p+ Z* O  [  C% u4 s  ---------------------------------------------------
; G1 E. W1 F7 E4 p$ Y  2 - access("BKGSHMTRESULT"."BKG_CFM_ID"=TO_NUMBER(:B1) AND "BKGSHMTRESULT"."COMP_ID"=:B2)
% p$ l' Z! D& _, n4 t6 H- ~$ N  可是,经由过程SQL_ID发芽,现实的发芽打算却是全表扫描:
# Y/ F5 U( P, \! m& I  SQL> select lpad(' ', 2 * (level - 1)) || operation || ' ' ||
6 W- {- t% T, z! i' d2 x/ e  2 decode(id, 0, 'Cost = ' || position) "OPERATION",7 a# Y6 _7 c' J/ Y+ X$ i' X
  3 options,
% U9 _" J% W" e  4 object_name
+ c0 v$ l. s: l: \. R- L) Z  5 from v$sql_plan
: x/ M: [3 m& N) {  6 start with (sql_id = 'f0mwuqfxxmtmf' and hash_value = http://www.qnr.cn/pc/ora/study/200911/3151619694 and id = 0)
7 m2 K1 z7 U7 z5 s$ C4 K  7 connect by prior id = parent_id+ Y, A7 w2 o- e( F1 W, d' B/ z$ D
  8 and prior sql_id = sql_id
$ v' V9 W0 ?% I0 |$ K" J/ ^  9 and prior hash_value = http://www.qnr.cn/pc/ora/study/200911/hash_value
1 C5 a0 J$ Z7 G  10 order by id, position;4 G% p1 v. q3 w' Y
  OPERATION OPTIONS OBJECT_NAME
  o6 h+ B' }. I% |) o/ W3 v  ---------------------------- ------------------------------------- ------------------------5 {4 o0 \7 ~  o
  SELECT STATEMENT Cost = 265
. h' s# u- j/ b  PARTITION LIST SINGLE9 h& i, ^  S* ]6 u8 D
  TABLE ACCESS FULL CR_BKG_INTMD_SHMT_PARTITION1 R! p* }! O; v- o# j+ `2 Q
  这一现象凡是是因为绑定变量窥视(Bind Variable Peeking)造成的:Peeking的变量值斗劲非凡,造成计较出的全表扫描价钱低于索引扫描价钱。为了确认问题,我们找到解析发芽打算所“窥视”到的数据:' ?  Z9 B# n6 U3 a1 D
  SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('f0mwuqfxxmtmf', 0, 'ADVANCED'));
3 m# l# j9 p4 n; H' L1 |. @  PLAN_TABLE_OUTPUT
% g! s/ |9 I2 O; L% K3 ^0 Z+ p  --------------------------------------------------2 }% l' m" Z+ |. k
  SQL_ID f0mwuqfxxmtmf, child number 0
+ k7 ?1 |0 h! h9 J& [7 M  -------------------------------------
% l6 t/ j, R- E1 G! l/ G  SELECT * FROM CR_BKG_INTMD_SHMT_PARTITION BKGSHMTRESULT WHERE BKGSHMTRESULT.BKG_CFM_ID = :V_BKG_CFM_ID
+ o& }" j# e& _. {" z  AND BKGSHMTRESULT.COMP_ID = :V_COMP_ID
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-22 15:11 , Processed in 0.167745 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表