在10203 for Linux X86-64上又碰到一个ORA-7445错误。
错误日志中的信息为:
Errors in file /data/oracle/admin/shandong/udump/shandong_ora_3202.trc:
-~/G.}[jYU0ORA-07445: exception encountered: core dump [qkabxo()+15] [SIGSEGV] [Address not mapped to object] [0x000000000] [] []
由于错误SQL比较复杂,将问题SQL尽量的简化,得到最终错误SQL如下:
SQL> EXPLAIN PLAN FOR
2I&w~#L1d*YY@0 2 SELECT /*+ FIRST_ROWS */ *
6s(U2K
`y}K0 3 FROM
S dq+n*fU9n/}0 4 (ITPUB个人空间)R @op u0Q;XI
5 SELECT ROWNUM ROW_NUM, A.*
x'~L5h
|v0j"VN%U0 6 FROM
"lVp.cp0 7 (
EAD/KV%Z*~mS0 8 SELECT
(W8V'x^\0 9 SALER.ORG_NAME SALER_NAME
n
H"tdz(@6O-cLe0 10 FROM INF_SALER SALER ,ITPUB个人空间Sr#n"B2k4hL @
11 INF_ENTER_COMM_TEMP C,
RF*ErpK+^p-P0 12 INF_PRODUCT P,
?#bb
WH
b5a;d Gp0 13 INF_SALER FACTORY ,ITPUB个人空间'D0Qq6J$qCZ
14 INF_ENTER_COMM_PROPERTY COMMP
^mn.Z-\7W/Q0 15 WHERE P.PRODUCT_ID=C.PRODUCT_ID
3Bo`Z!mO H*R:_IF0 16 AND P.FACTORY_ID=FACTORY.ORG_IDITPUB个人空间c
gvKD'w
17 AND C.SALER_ORGID=SALER.ORG_ID
3A~6w0ZB\,\+K K0 18 AND C.COMM_TEMP_ID=COMMP.COMM_ID ITPUB个人空间NTV6q;P
19 AND BID_SUBMIT='1'
-Fn1]4`F+_Fv*Z,[0 20 AND C.PLAT_ID=15
l3k-GE5wF)}j0 21 AND C.ENABLE_FLAG = '1'
'fiyd0|`0 22 AND C.ZB_TYPE='Y'ITPUB个人空间b z8H|kd;v
23 AND SALER_ORGID='110090'
fR)B
e S%G*\0 24 ORDER BY CHECK_STATE_BIDITPUB个人空间E m
\
iFn4JDH4@Di(G7?
25 ) A
VcVJ(m6|B0 26 WHERE ROWNUM <= 10
8[BXq8Y5a(Ia0 27 )
%AOu ?.sJGmu0 28 WHERE ROW_NUM >= 1
!`N;LN b)HkM'[0 29 ;
@Zx^ u)VM,E0ERROR:ITPUB个人空间\od:[*gN
ORA-03114: not connected to ORACLE
ITPUB个人空间)G*N%o ~*F.U7t~3e
EXPLAIN PLAN FORITPUB个人空间\0B:rhlVc
*
7`{'{1GX)I0ERROR at line 1:
{/^&xyL`"h3z {0ORA-03113: end-of-file on communication channel
随便对这个SQL进行任意的简化,都无法重现问题。不要说从SQL中去掉一张表,就是去掉排序语句,或者去掉任意一个条件限制语句都无法重现问题。
根据metalink文档的描述,这个问题应该是FIRST_ROWS优化模式下,执行计划中产生了BITMAP INDEX访问路径造成的。
首先这是一个分页SQL,包含了FIRST_ROWS提示,而且上面SQL语句中一个表包含多个限制条件,正好为产生BITMAP索引的执行计划构造了条件。因此从这一点上将还是和BUG中描述十分解决的,唯一需要补充的是这个问题和ORDER BY还有一定的关系,而且问题发生在分析阶段,而不是执行阶段。
关于这个bug的详细描述,可以参考Doc ID: Note:4917682.8。
本测试发生在10203,似乎11g以前版本都可能发生这个问题。Oracle在11.1.0.6中解决了这个bug。
而最简单的临时解决问题的方法就是将FIRST_ROWS提示改为ALL_ROWS。
SQL> EXPLAIN PLAN FOR
:c.tWf
\#J8P5o0 2 SELECT /*+ ALL_ROWS */ *
xmio)GJ9]8n1yX0 3 FROM
X{&cri|9~ tV0 4 (ITPUB个人空间8|Y$l#n@Jyv
5 SELECT ROWNUM ROW_NUM, A.*ITPUB个人空间3rg5yA^w?G3v
6 FROM
M/b,HEq0 7 (ITPUB个人空间DQ8s[B8Az
8 SELECTITPUB个人空间6aFeDKX;O
9 SALER.ORG_NAME SALER_NAME
] `s-Oy0 10 FROM INF_SALER SALER ,
8elI^5G.`7vF%e.F0 11 INF_ENTER_COMM_TEMP C,
UxTbY0 12 INF_PRODUCT P,ITPUB个人空间3C g7Jh-F(I:Y}qX
13 INF_SALER FACTORY ,
]oU6pf+rp$R0 14 INF_ENTER_COMM_PROPERTY COMMP ITPUB个人空间'EE'y(FN'VsC9V
UQ
15 WHERE P.PRODUCT_ID=C.PRODUCT_ID
|9Vpbw*Z7P2I0 16 AND P.FACTORY_ID=FACTORY.ORG_IDITPUB个人空间Z`:j0oGo+q0|3{
17 AND C.SALER_ORGID=SALER.ORG_IDITPUB个人空间0\U;_4Av4F"o
18 AND C.COMM_TEMP_ID=COMMP.COMM_ID ITPUB个人空间$c8WeZ|+QK
19 AND BID_SUBMIT='1'
E3j+t Rx\U/X0 20 AND C.PLAT_ID=15 ITPUB个人空间6Q'{Hc6W
21 AND C.ENABLE_FLAG = '1' ITPUB个人空间*Rvl6[ ^p0Mx
22 AND C.ZB_TYPE='Y'
X?0pT.u:_0 23 AND SALER_ORGID='110090' ITPUB个人空间-g6e3VUi7eg
24 ORDER BY CHECK_STATE_BID
%r,REG*Y0 25 ) A ITPUB个人空间?H u!T@~hu
26 WHERE ROWNUM <= 10
f PjZ2x~D0 27 )
A+{%{X4z5@l$i!F0 28 WHERE ROW_NUM >= 1
+iZ}3}V)U8\O FZ0 29 ;
Explained.
不过这样会带来一定的性能开销,毕竟ALL_ROWS不适合分页查询。
当然,这里也可以创建一个SALER_ORGID和PLAT_ID的组合索引,来避免执行计划中出现BITMAP索引访问路径:
SQL> CREATE INDEX IND_COMM_TEMP_SALER_PLAT ON INF_ENTER_COMM_TEMP (SALER_ORGID, PLAT_ID);
Index created.
SQL> EXPLAIN PLAN FORITPUB个人空间c@0QH2e,Vp^5ih'qR
2 SELECT /*+ FIRST_ROWS */ *ITPUB个人空间9w Q3?*AF1X
3 FROMITPUB个人空间:y?1PC3C._[ hY
4 (
+sT#_^,lW0 5 SELECT ROWNUM ROW_NUM, A.*ITPUB个人空间|,T.X7Z SC{`-K.h
6 FROMITPUB个人空间c5FFP$?a!Ovqtq
7 (
'Mkx"x2r? m!X
a0 8 SELECT
Z'kh/mCCY0 9 SALER.ORG_NAME SALER_NAME
c
jVl
EK0 10 FROM INF_SALER SALER ,ITPUB个人空间{g]7MN
11 INF_ENTER_COMM_TEMP C,
U^f]fsl:S\\%q0 12 INF_PRODUCT P,
;{D7G)V6g0 13 INF_SALER FACTORY ,ITPUB个人空间Pg2|P/N*Tr
w'H
14 INF_ENTER_COMM_PROPERTY COMMP ITPUB个人空间RI,d0i`2QIrr
15 WHERE P.PRODUCT_ID=C.PRODUCT_ID
v/~KZ[0 16 AND P.FACTORY_ID=FACTORY.ORG_IDITPUB个人空间n?){&AV~y8V
17 AND C.SALER_ORGID=SALER.ORG_ID
5l Gx!^!_R3Bic2o$t0 18 AND C.COMM_TEMP_ID=COMMP.COMM_ID
U
j1_ A;Zp0 19 AND BID_SUBMIT='1' ITPUB个人空间-H#S:WIP'I A5o
Q;FOg
20 AND C.PLAT_ID=15
6Cjq^8z{0 21 AND C.ENABLE_FLAG = '1'
]\hH"m~R0 22 AND C.ZB_TYPE='Y'ITPUB个人空间^De"pfV{
23 AND SALER_ORGID='110090'
9E7icg.AH0 24 ORDER BY CHECK_STATE_BID
B%Leb4y F y&[U0 25 ) A
#^;Ir8o$p.f%_aG0 26 WHERE ROWNUM <= 10ITPUB个人空间5]+jhgV2tB-N
27 )
%M4tK3[1LN L_)y^0 28 WHERE ROW_NUM >= 1
s8E |P
SBb0 29 ;
Explained.
这种方法的好处是不需要修改SQL,还能提供这个SQL的性能,缺点是可能会对数据库中运行的其他SQL造成影响,需要在测试环境中详细测试后,才能进行添加。